The Church of EMACS calls vi the "editor of the beast." Vi-vi-vi being 6-6-6 in Roman numerals. EMACS users joke that vi has two modes: "beep repeatedly" and "break everything." Vi users refer to EMACS as Escape, Meta, Alt, Control, and Shift. They say EMACS induces carpal tunnel syndrome with its double command sequences. Vi users pile on with EMACS is "a great operating system, lacking only a decent editor" The Google search engine joined in by having searches for vi resulting in the question "Did you mean: emacs". If you hear people arguing about this, even in jest, whatever you do, don't tell them you use nano. You will be abused mercilessly.
IMHO vi is an excellent text editor. I once forced myself to use vi for 8 months. After repeatedly typing text into command mode, and commands into insert mode, I went back to nano. It was like seeing an old friend.
This page contains a nano command reference and configuration files. I am a bit of a nano maniac and customized the configuration and syntax highlighting files to edit HTML, CSS, JavaScript and bash code. The inspiration for these customizations came from vi.
https://www.nano-editor.org/dist/latest/cheatsheet.html
Buffer new buffer ^R ESC-F (only if multibuffer is set) Buffer switch to previous ESC-< Buffer switch to next ESC-> Delete char before cursor ^H (BACKSPACE) Delete char under cursor ^D (DEL) Delete cursor to EOF ESC-T Delete cursor to EOL ESC-K Delete current line ^K (F9) (ESC-DEL) Undelete current line ^U Delete word to the left ESC-BACKSPACE Delete word to the right ^DEL Edit comment line ESC-3 Edit complete word ^] Edit copy line ESC-6 ESC-^ Edit insert ASCII Code ESC ESC 000-255 Edit insert verbatim ESC-V (ex: ^E) Edit paste buffer ^U Edit undo last action ESC-U Edit redo last action ESC-E Edit spell check ^T^S F12 File edit nano filename File insert at cursor ^R (INS) File save ^X (F2) File save as ^O (F3) File save no prompt ^S Format javascript ESC-F Format justify paragraph ^J (F4) Format justify file ESC-J Format refresh screen ^L Help ^G (F1) Macro Start/stop ESC-: Macro Replay ESC-; Move block text back ESC-{ Move block text forward ESC-} Move center line at cursor ^L Move cursor ⏴ ⏶ ⏷ ⏵ Move cursor up ^P ⏶ Move cursor down ^N ⏷ Move file buffer prev ESC-⏵ (ESC-+) Move file buffer next ESC-⏴ (ESC-+) Move first line ESC-\ (^HOME) Move last line ESC-/ (^END) Move page down ^V Move page up ^Y Move paragraph beginning ESC-( (ESC-9) Move paragraph forward ESC-) (ESC-0) Move to line # ^_ (ESC-G) Move to start of line ^A (HOME) Move to end of line ^E (END) Move word back ESC-SPACE Move word forward ^SPACE Search ^W ^F (F6) Search and replace ^\ (ESC-R) (y/n/a[ll]/^C[ancel]) Search backward ^Q Search next backward ESC-Q Search next forward ESC-W Select mark set/unset ESC-A Select indent TAB Select unindent SHIFT-TAB Select indent ESC-} Select unindent ESC-{ Set auto indent ESC-I Set constant cursor ESC-C Set expert Mode ESC-X Set help line ESC-X Set hidden interface ESC-Z Set line numbers ESC-N Set mouse support ESC-M Set syntax coloring ESC-Y Set tabs to spaces ESC-O Set whitespace disp ESC-P Set soft wrapping ESC-S Set long line wrapping ESC-L Show count line/word/char ESC-D Show cursor position ^C F11 Show cursor position ESC-C Show matching bracket ESC-]
The nano configuration file is ~/.nanorc. This file sets options for backup, search, syntax highlighting, and status bar display when nano is started. The default options are commented out and the user options are uncommented.
## Sample initialization file for GNU nano. ## ## Please note that you must have configured nano with --enable-nanorc ## for this file to be read! Also note that this file should not be in ## DOS or Mac format, and that characters specially interpreted by the ## shell should not be escaped here. ## ## To make sure an option is disabled, use "unset <option>". ## ## For the options that take parameters, the default value is given. ## Other options are unset by default. ## ## Quotes inside string parameters don't have to be escaped with ## backslashes. The last double quote in the string will be treated as ## its end. For example, for the "brackets" option, ""')>]}" will match ## ", ', ), >, ], and }. ## Make the 'nextword' function (Ctrl+Right) stop at word ends ## instead of at beginnings. # set afterends ## When soft line wrapping is enabled, make it wrap lines at blanks ## (tabs and spaces) instead of always at the edge of the screen. set atblanks ## Automatically indent a newly created line to the same number of ## tabs and/or spaces as the preceding line -- or as the next line ## if the preceding line is the beginning of a paragraph. # set autoindent ## Back up files to the current filename plus a tilde. set backup ## The directory to put unique backup files in. # set backupdir "" set backupdir "~/.nano/backup/" ## Use bold text instead of reverse video text. # set boldtext ## The characters treated as closing brackets when justifying paragraphs. ## This may not include any blank characters. Only closing punctuation, ## optionally followed by these closing brackets, can end sentences. # set brackets ""')>]}" ## Do case-sensitive searches by default. unset casesensitive ## Constantly display the cursor position in the status bar. Note that ## this overrides "quickblank". set constantshow ## Move title bar to status line ## VI style status bar set minibar ## Use cut-from-cursor-to-end-of-line by default. # set cutfromcursor ## (The old form, 'cut', is deprecated.) ## Set the line length for wrapping text and justifying paragraphs. ## If the value is 0 or less, the wrapping point will be the screen ## width less this number. set fill -8 ## Remember the used search/replace strings for the next session. set historylog ## Display line numbers to the left of the text. # set linenumbers ## Enable vim-style lock-files. This is just to let a vim user know you ## are editing a file [s]he is trying to edit and vice versa. There are ## no plans to implement vim-style undo state in these files. set locking ## The opening and closing brackets that can be found by bracket ## searches. They cannot contain blank characters. The former set must ## come before the latter set, and both must be in the same order. set matchbrackets "(<[{)>]}" ## Use the blank line below the title bar as extra editing space. #set morespace ## Enable mouse support, if available for your system. When enabled, ## mouse clicks can be used to place the cursor, set the mark (with a ## double click), and execute shortcuts. The mouse will work in the X ## Window System, and on the console when gpm is running. # set mouse ## Switch on multiple file buffers (inserting a file will put it into ## a separate buffer). # set multibuffer ## Don't convert files from DOS/Mac format. # set noconvert ## Don't display the helpful shortcut lists at the bottom of the screen. set nohelp ## Don't automatically add a newline when a file does not end with one. # set nonewlines ## Don't pause between warnings at startup. Which means that only the ## last one will be readable (when there are multiple ones). # set nopauses ## Don't wrap text at all. # set nowrap ## Set operating directory. nano will not read or write files outside ## this directory and its subdirectories. Also, the current directory ## is changed to here, so any files are inserted from this dir. A blank ## string means the operating-directory feature is turned off. # set operatingdir "" ## Remember the cursor position in each file for the next editing session. set positionlog ## Preserve the XON and XOFF keys (^Q and ^S). # set preserve ## The characters treated as closing punctuation when justifying ## paragraphs. They cannot contain blank characters. Only closing ## punctuation, optionally followed by closing brackets, can end ## sentences. # set punct "!.?" ## Do quick status-bar blanking. Status-bar messages will disappear after ## 1 keystroke instead of 26. Note that "constantshow" overrides this. # set quickblank ## The email-quote string, used to justify email-quoted paragraphs. ## This is an extended regular expression. The default is: # set quotestr "^([ ]*([#:>|}]|//))+" ## Fix Backspace/Delete confusion problem. # set rebinddelete ## Fix numeric keypad key confusion problem. # set rebindkeypad ## Do extended regular expression searches by default. # set regexp ## Put the cursor on the highlighted item in the file browser; ## useful for people who use a braille display. # set showcursor ## Make the Home key smarter. When Home is pressed anywhere but at the ## very beginning of non-whitespace characters on a line, the cursor ## will jump to that beginning (either forwards or backwards). If the ## cursor is already at that position, it will jump to the true ## beginning of the line. # set smarthome ## Use smooth scrolling as the default. # set smooth ## Enable soft line wrapping (AKA full-line display). set softwrap ## Use this spelling checker instead of the internal one. This option ## does not have a default value. set speller "aspell -x -c" ## Allow nano to be suspended. #set suspend ## Use this tab size instead of the default; it must be greater than 0. set tabsize 2 ## Convert typed tabs to spaces. set tabstospaces ## Save automatically on exit; don't prompt. # set tempfile ## Snip whitespace at the end of lines when justifying or hard-wrapping. # set trimblanks ## (The old form, 'justifytrim', is deprecated.) ## Disallow file modification. Why would you want this in an rcfile? ;) # set view ## The two single-column characters used to display the first characters ## of tabs and spaces. 187 in ISO 8859-1 (0000BB in Unicode) and 183 in ## ISO-8859-1 (0000B7 in Unicode) seem to be good values for these. ## The default when in a UTF-8 locale: # set whitespace "»·" ## The default otherwise: # set whitespace ">." ## Detect word boundaries differently by treating punctuation ## characters as parts of words. # set wordbounds ## The characters (besides alphanumeric ones) that should be considered ## as parts of words. This option does not have a default value. When ## set, it overrides option 'set wordbounds'. # set wordchars "<_>." ## Paint the interface elements of nano. These are examples; ## by default there are no colors, except for errorcolor. # set titlecolor brightwhite,blue # set statuscolor brightwhite,green # set errorcolor brightwhite,red # set selectedcolor brightwhite,magenta # set numbercolor cyan # set keycolor cyan # set functioncolor green ## In root's .nanorc you might want to use: # set titlecolor brightwhite,magenta # set statuscolor brightwhite,magenta # set errorcolor brightwhite,red # set selectedcolor brightwhite,cyan # set numbercolor magenta # set keycolor brightmagenta # set functioncolor magenta ## Setup of syntax coloring. ## ## Format: ## ## syntax "short description" ["filename regex" ...] ## ## The "none" syntax is reserved; specifying it on the command line is ## the same as not having a syntax at all. The "default" syntax is ## special: it takes no filename regexes, and applies to files that ## don't match any other syntax's filename regexes. ## ## color foreground,background "regex" ["regex"...] ## or ## icolor foreground,background "regex" ["regex"...] ## ## "color" will do case-sensitive matches, while "icolor" will do ## case-insensitive matches. ## ## Valid colors: white, black, red, blue, green, yellow, magenta, cyan. ## For foreground colors, you may use the prefix "bright" to get a ## stronger highlight. ## ## To use multi-line regexes, use the start="regex" end="regex" ## [start="regex" end="regex"...] format. ## ## If your system supports transparency, not specifying a background ## color will use a transparent color. If you don't want this, be sure ## to set the background color to black or white. ## ## All regexes should be extended regular expressions. ## ## If you wish, you may put your syntax definitions in separate files. ## You can make use of such files as follows: ## ## include "/path/to/syntax_file.nanorc" ## ## Unless otherwise noted, the name of the syntax file (without the ## ".nanorc" extension) should be the same as the "short description" ## name inside that file. These names are kept fairly short to make ## them easier to remember and faster to type using nano's -Y option. ## ## To include all existing syntax definitions, you can do: ##include "/usr/local/share/nano/*.nanorc" include "~/.nano/*.nanorc" ## Key bindings. ## See nanorc(5) (section REBINDING KEYS) for more details on this. ## ## The following two functions are not bound to any key by default. ## You may wish to choose other keys than the ones suggested here. # bind M-B cutwordleft main # bind M-N cutwordright main bind F7 "date +%Y%m%d\ %H:%M:%S " main ## Set this if your Backspace key sends Del most of the time. # bind Del backspace all ## Formatter bind M-F formatter main ## Linter #bind M-B linter main
The default syntax highlighting configuration files reside in /usr/share/nano. If you build nano yourself the files are in /usr/local/share/nano. The default files are very good.
With all due respect to the Nano, Vi, and Emacs teams, I prefer the vi style highlighting. Comments are muted. User variables, function names, and text are blue. Quoted strings are green. Tags and commands are yellow. Keywords are orange. Unquoted bash variable references are red. Executable codeblocks between backticks are red. The .nanorc file points to these custom files which are in ~/.nano/ and are listed below.
## Syntax highlighting for Bourne shell scripts. ## /usr/local/share/nano syntax sh "(\.sh|(\.|/)(a|ba|c|da|k|mk|pdk|tc|z)sh(rc|_profile)?|/(etc/|\.)profile)$" header "^#!.*/(((a|ba|c|da|k|mk|pdk|tc|z)?sh)|(busybox|env) +sh|openrc-run|runscript)" header "-\*-.*shell-script.*-\*-" magic "(POSIX|Bourne-Again) shell script.*text" comment "#" linter dash -n # Default color blue "^.+$" #color normal "^.+$" # Function declarations. color blue "^[A-Za-z0-9_-]+\(\)" # Keywords, symbols, and comparisons. color green "\<(alias|break|case|continue|do|done|elif|else|esac|exit|fi|for|function|if|in|read|return|select|shift|then|time|until|while)\>" color green "\<(declare|eval|exec|export|let|local)\>" color green "[{}():;|`$<>!=&\\]" "(\]|\[)" color green "-(eq|ne|gt|lt|ge|le|ef|ot|nt)\>" # Short and long options. color brightmagenta "[[:blank:]]-[A-Za-z]\>" "[[:blank:]]--[A-Za-z-]+\>" # Common commands. color yellow "\<(awk|cat|cd|ch(grp|mod|own)|cp|cut|echo|env|grep|head|install|ln|make|mkdir|mv|popd|printf|pushd|rm|rmdir|sed|set|sort|tail|tar|touch|umask|unset)\>" color normal "[.-]tar\>" # Basic variable names (no braces). color brightred "\$[-0-9@*#?$!]" "\$[[:alpha:]_][[:alnum:]_]*" # More complicated variable names; handles braces and replacements and arrays. color brightred "\$\{[#!]?([-@*#?$!]|[0-9]+|[[:alpha:]_][[:alnum:]_]*)(\[([[:space:]]*[[:alnum:]_]+[[:space:]]*|@)\])?(([#%/]|:?[-=?+])[^}]*\}|\[|\})" # "Strings" 'Strings' color cyan ""(\\.|[^"])*"" "'(\\.|[^'])*'" # Safe user variable references color red ""\$(\\.|[^"])*"" # backticks command sequence color red "`(\\.|[^"])*`" "`(\\.|[^'])*`" # $(seq 1 10) use instead of backtick color red "\$\((\\.|[^"])*\)" "\$\((\\.|[^'])*\)" # Comments. #color brightgreen "(^|[[:space:]])#.*" color brightgreen "#.*$" # Trailing whitespace. color ,green "[[:space:]]+$" # Booleans color brightwhite "\<(true|false)\>"
## Syntax highlighting for Javascript. ## /usr/local/share/nano syntax javascript "\.js$" comment "//" # First make everything blue: color blue "." # Control Characters \n color red "\\[a-z]" # Declarational stuff. color green "\<(async|class|const|extends|function|let|this|typeof|var|void|Object|object)\>" # Flow control and special keywords. color green "\<(do|while|if|else|switch|case|default|for|each|in|of|with)\>" color green "\<(await|export|import|throw|try|catch|finally|new|delete)\>" color green "\<(document|document.body|console.log|localStorage|sessionStorage)\>" color yellow "JSON|Date|parseInt|\.length|\.replace|\.forEach|\.stringify|\.createElement|\.getElementById|\.checked|\.innerHTML|\.appendChild|\.now|\.push|\.onclick|\.onClick|\.insertBefore|\.parentNode|\.style|\.display|\.value|\.toString|\.indexOf|\.getMonth|\.getFullYear|\.unshift|\.splice|\.getElementsByClassName|\.removeChild" # "Exit" points. color yellow "\<(break|continue|return|yield)\>" # Octal/decimal and hexadecimal numbers. color cyan "\<([0-9]+|0x[0-9A-Fa-f]+)\>" # Special values. color green "\<(true|false|null|undefined)\>" # Strings. color cyan ""(\\.|[^"])*"" "'(\\.|[^'])*'" "`(\\.|[^`])*`" # Comments. color brightyellow "(^|[[:space:]])//.*" color brightyellow start="/\*" end="\*/" # Trailing whitespace. color ,green "[[:space:]]+$"
## Syntax highlighting for HTML. ## /usr/local/share/nano syntax html "\.html?$" magic "HTML document" comment "<!--|-->" #formatter tidy -m -q formatter /usr/local/bin/tidy -mq --doctype html5 --vertical-space yes --wrap 0 -f tidy.err --quote-ampersand no #linter /usr/local/bin/tidy -me # Default color blue "^.+$" # Tags: color green "<[[:alpha:]/!?][^>]*>" # Bold, italic, and underlined: #color brightmagenta "" # Named character references: color red "&[^;[:space:]]*;" # Attributes: color yellow "\<(abbr|accept(-charset)?|accesskey|action|alink|align|alt|archive|axis|background|bgcolor|border)=" color yellow "\<(cell(padding|spacing)|char(off|set)?|checked|cite|class(id)?|compact|code(base|tag)?|cols(pan)?)=" color yellow "\<(content(editable)?|contextmenu|coords|data|datetime|declare|defer|dir|disabled|enctype)=" color yellow "\<(for|frame(border)?|headers|height|hidden|href(lang)?|hspace|http-equiv|id|ismap)=" color yellow "\<(label|lang|link|longdesc|margin(height|width)|maxlength|media|method|multiple)=" color yellow "\<(name|nohref|noresize|noshade|object|onclick|onfocus|onload|onmouseover|profile|readonly|rel|rev)=" color yellow "\<(rows(pan)?|rules|scheme|scope|scrolling|selected|shape|size|span|src|standby|start|style|summary)=" color yellow "\<(tabindex|target|text|title|type|usemap|valign|value(type)?|vlink|vspace|width|xmlns|xml:space)=" # Strings: color cyan ""(\\.|[^"])*"" # Comments: color brightyellow start="<!--" end="-->"
## Syntax highlighting for CSS files. ## /usr/local/share/nano syntax css "\.css$" comment "/*|*/" # First make everything red: color blue "." icolor green "\<(^html.*|^body.*|^h[0-9].*|^img.*|^table.*|^td.*|^th.*|^tr.*|^code.*|^pre.*|^p.*|^a.*|^blockquote.*|^b.*|^audio.*)\>" icolor green "\<(^canvas.*|^ul.*|^ol.*|^li.*|^div.*|^header.*|^iframe.*|^input.*|^label.*|^object.*|^option.*|^script.*|^span.*|^video.*)\>" # Then everything between braces yellow: color yellow start="\{" end="\}" # Then everything after a colon white: color cyan start=":" end="([;^{]|$)" # Pseudo-classes: color green ":(active|checked|focus|hover|link|visited|after|before)\>" # Comments: color brightyellow start="/\*" end="\*/" # Syntactic characters: color blue ";|:|\{|\}"
## Syntax highlighting for nanorc files. syntax nanorc "[/.]nanorc(\.in)?$" comment "#" # Everything that does not get recolored is invalid color brightred ".*" # Color names color yellow "^[[:blank:]]*(i?color|set[[:blank:]]+((error|function|key|mini|number|prompt|scroller|selected|spotlight|status|stripe|title)color))[[:blank:]]+(bold,)?(italic,)?(((bright|light)?(white|black|red|blue|green|yellow|magenta|cyan))|normal|pink|purple|mauve|lagoon|mint|lime|peach|orange|latte|rosy|beet|plum|sea|sky|slate|teal|sage|brown|ocher|sand|tawny|brick|crimson|grey|gray|#[[:xdigit:]]{3})?(,(((light)?(white|black|red|blue|green|yellow|magenta|cyan))|normal|pink|purple|mauve|lagoon|mint|lime|peach|orange|latte|rosy|beet|plum|sea|sky|slate|teal|sage|brown|ocher|sand|tawny|brick|crimson|grey|gray|#[[:xdigit:]]{3}))?\>" # The arguments of two special commands color bold,purple "^[[:blank:]]*include[[:blank:]][^"]*([[:blank:]]|$)" color lime "^[[:blank:]]*extendsyntax[[:blank:]]+[[:alpha:]]+[[:blank:]]+(i?color|header|magic|comment|formatter|linter|tabgives)[[:blank:]]+.*" # The arguments of commands color brightgreen "^[[:blank:]]*(set|unset)[[:blank:]]+(afterends|allow_insecure_backup|atblanks|autoindent|backup|boldtext|bookstyle|breaklonglines|casesensitive|constantshow|cutfromcursor|emptyline|historylog|indicator|jumpyscrolling|linenumbers|locking|magic|minibar|mouse|multibuffer|noconvert|nohelp|nonewlines|positionlog|preserve|quickblank|rawsequences|rebinddelete|regexp|saveonexit|showcursor|smarthome|softwrap|stateflags|tabstospaces|trimblanks|unix|wordbounds|zap|zero)\>" color brightgreen "^[[:blank:]]*set[[:blank:]]+(backupdir|brackets|errorcolor|functioncolor|keycolor|matchbrackets|minicolor|numbercolor|operatingdir|promptcolor|punct|quotestr|scrollercolor|selectedcolor|speller|spotlightcolor|statuscolor|stripecolor|titlecolor|whitespace|wordchars)[[:blank:]]+" color brightgreen "^[[:blank:]]*set[[:blank:]]+(fill[[:blank:]]+-?[[:digit:]]+|(guidestripe|tabsize)[[:blank:]]+[1-9][0-9]*)\>" color brightgreen "^[[:blank:]]*bind[[:blank:]]+((\^([A-Za-z]|[]/@\^_`-]|Space)|([Ss][Hh]-)?[Mm]-[A-Za-z]|[Mm]-([][!"#$%&'()*+,./0-9:;<=>?@\^_`{|}~-]|Space))|F([1-9]|1[0-9]|2[0-4])|Ins|Del)[[:blank:]]+([a-z]+|".*")[[:blank:]]+(main|help|search|replace(with)?|yesno|gotoline|writeout|insert|execute|browser|whereisfile|gotodir|spell|linter|all)\>" color brightgreen "^[[:blank:]]*unbind[[:blank:]]+((\^([A-Za-z]|[]/@\^_`-]|Space)|([Ss][Hh]-)?[Mm]-[A-Za-z]|[Mm]-([][!"#$%&'()*+,./0-9:;<=>?@\^_`{|}~-]|Space))|F([1-9]|1[0-9]|2[0-4])|Ins|Del)[[:blank:]]+(main|help|search|replace(with)?|yesno|gotoline|writeout|insert|execute|browser|whereisfile|gotodir|spell|linter|all)\>" color brightgreen "^[[:blank:]]*extendsyntax[[:blank:]]+[[:alpha:]]+[[:blank:]]+" color brightgreen "^[[:blank:]]*(syntax[[:blank:]]+[^[:space:]]+|(formatter|linter)[[:blank:]]+.+)" # Strings color brightmagenta "[[:blank:]](start=)?".+"" # Commands color green "^[[:blank:]]*((un)?(bind|set)|include|syntax|header|magic|comment|formatter|linter|tabgives|extendsyntax)\>" color magenta "^[[:blank:]]*i?color\>|[[:blank:]](start=|end=)" # Control codes color bold,pink "[[:cntrl:]]" # Comments color brightblue "^[[:blank:]]*#.*|[[:blank:]]#.{0,2}[^[:xdigit:]].*" color cyan "^[[:blank:]]*##.*" # Trailing whitespace color ,green "[[:space:]]+$"
dave@worldsworstwriter.org 2024-10-25