Compare commits
195 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
19ff9a507b | ||
|
|
33ba6be91f | ||
|
|
9c1c6c18ae | ||
|
|
fae5f823e1 | ||
|
|
bdf8e41a72 | ||
|
|
c00c12b64b | ||
|
|
02d77ad5ad | ||
|
|
7ab903f072 | ||
|
|
266ed0612f | ||
|
|
27af34a853 | ||
|
|
abafc2ba14 | ||
|
|
1f0eb8d915 | ||
|
|
48a19178b8 | ||
|
|
e542e5943e | ||
|
|
44836e77be | ||
|
|
5cec57719b | ||
|
|
d6f101daef | ||
|
|
350cdd9827 | ||
|
|
5dc48d54f2 | ||
|
|
41975265bf | ||
|
|
598f13107d | ||
|
|
248ebf9117 | ||
|
|
1c6f6ba212 | ||
|
|
58cba6a7c6 | ||
|
|
b55474788b | ||
|
|
5c8de3e39f | ||
|
|
8aaa57a573 | ||
|
|
19e743c7e4 | ||
|
|
56aacb3e32 | ||
|
|
f2c9aed16c | ||
|
|
7c6d3942c4 | ||
|
|
27aff84f74 | ||
|
|
a43ee17ad0 | ||
|
|
abd4c47acf | ||
|
|
b87722ab2d | ||
|
|
b5448615b9 | ||
|
|
d14d9069cd | ||
|
|
93df6ab385 | ||
|
|
be87f110ce | ||
|
|
9ebee362a5 | ||
|
|
27928e47be | ||
|
|
79def643a3 | ||
|
|
9a8d9ef496 | ||
|
|
7336c28ca8 | ||
|
|
6a521da437 | ||
|
|
6d828cf470 | ||
|
|
511a2850a1 | ||
|
|
be61aad935 | ||
|
|
c06f7d43e9 | ||
|
|
3638fb9da4 | ||
|
|
2fc1f08573 | ||
|
|
90946c5e9e | ||
|
|
9a778f9a00 | ||
|
|
8d6b468cdc | ||
|
|
0941185fcf | ||
|
|
8850015822 | ||
|
|
3be4ea0dc1 | ||
|
|
3eda0135bc | ||
|
|
9c9de85afb | ||
|
|
addac49465 | ||
|
|
839d29be3f | ||
|
|
b2f0721b69 | ||
|
|
b228c9fe6c | ||
|
|
8e7738e22e | ||
|
|
84f8445b7b | ||
|
|
5cf412320d | ||
|
|
c9fb1cf85a | ||
|
|
bbed065fa8 | ||
|
|
dde74dee78 | ||
|
|
966da68228 | ||
|
|
f147131e7c | ||
|
|
7785c3f7cf | ||
|
|
9d3d354bd4 | ||
|
|
51a5f33b5b | ||
|
|
8aea8625be | ||
|
|
931bf96c1d | ||
|
|
956a1c2327 | ||
|
|
4f15890105 | ||
|
|
0afe38d81a | ||
|
|
3dfd798d51 | ||
|
|
1235a5a365 | ||
|
|
c772e1cb6b | ||
|
|
e35b6636ab | ||
|
|
bd4eed9cb1 | ||
|
|
2b0bcc7cee | ||
|
|
3b5f650621 | ||
|
|
b66a040828 | ||
|
|
f757c4a512 | ||
|
|
06ad77895f | ||
|
|
2cbd4d29a0 | ||
|
|
d93a5594cd | ||
|
|
a2a00577cd | ||
|
|
b92b9e5cac | ||
|
|
d19842ed73 | ||
|
|
0655c8aa6c | ||
|
|
30595dd2bb | ||
|
|
b76b5b9967 | ||
|
|
1007ca5af8 | ||
|
|
f3fab1440f | ||
|
|
affca9b523 | ||
|
|
2f53760689 | ||
|
|
3409cb2b77 | ||
|
|
be6860b33e | ||
|
|
3a94a0bb89 | ||
|
|
8234c22c1e | ||
|
|
496dad696c | ||
|
|
a623f5836c | ||
|
|
f42821293e | ||
|
|
0363703073 | ||
|
|
dfbe3ce6dc | ||
|
|
e4a247f7c9 | ||
|
|
69b2467a9a | ||
|
|
cc24e8b86b | ||
|
|
27f170815f | ||
|
|
d3c7e9d2f6 | ||
|
|
ea4bbf4285 | ||
|
|
308d6e73e3 | ||
|
|
167c93b85c | ||
|
|
13c5bcb4d8 | ||
|
|
c692a6ca70 | ||
|
|
0346e63c20 | ||
|
|
9e982f3283 | ||
|
|
11fec6f63c | ||
|
|
d0c2c1e6b9 | ||
|
|
fab4d0afcb | ||
|
|
d9e42cb274 | ||
|
|
4d9be13316 | ||
|
|
7365ef4092 | ||
|
|
13edbedc79 | ||
|
|
fc5d58ad97 | ||
|
|
a373fa500a | ||
|
|
8da098f5e0 | ||
|
|
52d4b96639 | ||
|
|
83f94a88df | ||
|
|
8762e04631 | ||
|
|
256a0d670e | ||
|
|
50106266bc | ||
|
|
ba093b0b48 | ||
|
|
33041d0ad5 | ||
|
|
b46c8c586b | ||
|
|
0e1d45dc36 | ||
|
|
1cd92458e9 | ||
|
|
7bd68365ec | ||
|
|
485eb18d83 | ||
|
|
375b30507e | ||
|
|
7691527f35 | ||
|
|
3313fac8eb | ||
|
|
e52c81f5db | ||
|
|
9b419d0bff | ||
|
|
0f40752139 | ||
|
|
d57bfc057f | ||
|
|
918ce1afa3 | ||
|
|
5d285ca896 | ||
|
|
f368e2732d | ||
|
|
ad13746da9 | ||
|
|
440f39e558 | ||
|
|
108c84daf8 | ||
|
|
e63fe3be69 | ||
|
|
bc4a141cba | ||
|
|
0dbe857ba2 | ||
|
|
483538f8f3 | ||
|
|
1f36d5411a | ||
|
|
46f76ca8b8 | ||
|
|
3a09577e0c | ||
|
|
b9f472a905 | ||
|
|
557d8131ca | ||
|
|
89fd11109d | ||
|
|
badf3edc55 | ||
|
|
36e3284979 | ||
|
|
4ac932bd21 | ||
|
|
f9468fa987 | ||
|
|
fb7c12f644 | ||
|
|
9341c96def | ||
|
|
74fd78adb1 | ||
|
|
c8ab81dd1c | ||
|
|
185e4d6b12 | ||
|
|
99607a5bbe | ||
|
|
7e807cdd2f | ||
|
|
e51f6596d4 | ||
|
|
42610db847 | ||
|
|
6018de2466 | ||
|
|
af757d3b3f | ||
|
|
30abc02277 | ||
|
|
9a9714fe0c | ||
|
|
77457fa6e9 | ||
|
|
9c45b5da6c | ||
|
|
e9f0597e2e | ||
|
|
87cde1590d | ||
|
|
65d81c60cd | ||
|
|
3d6dcb9568 | ||
|
|
1ca2911b84 | ||
|
|
8ef74b3aac | ||
|
|
aeae4fb4b9 | ||
|
|
bc22b3c876 | ||
|
|
64c9d3c143 |
202
ChangeLog
202
ChangeLog
@@ -1,3 +1,205 @@
|
||||
Changes between v5.9 and v6.0:
|
||||
------------------------------
|
||||
|
||||
Benno Schulenberg (192):
|
||||
bindings: allow rebinding ^Z also on a Linux console (a VT)
|
||||
bindings: allow toggling line numbers (when enabled) also in tiny version
|
||||
bindings: let ^T in the tiny version invoke spell checker (when included)
|
||||
browser: with --zero, do not use the bottom row for displaying filenames
|
||||
build: fix compilation when configured with --disable-color
|
||||
build: fix compilation when configured with --disable-nanorc
|
||||
build: fix compilation when configured with --enable-tiny
|
||||
build: fix compilation with --enable-tiny --enable-nanorc
|
||||
build: fix compilation with --enable-tiny --enable-wrapping
|
||||
build: include the YAML syntax file among the distributed files
|
||||
bump version numbers and add a news item for the 6.0 release
|
||||
display: clear the status bar early enough, so that --zero can show text
|
||||
display: do not wipe the status bar when --zero or --minibar is active
|
||||
display: ensure feedback will be cleared also on a one-row terminal
|
||||
display: make sure there are at least as many text lines as help lines
|
||||
display: move some code for overwriting verbatim feedback with --zero
|
||||
display: redraw the screen in tiny version upon resuming from suspension
|
||||
display: with --zero, redraw the bottom row instead of wiping a message
|
||||
docs: add a hint about making ^L do just 'refresh' to the sample nanorc
|
||||
docs: add a meta description for the HTML rendering of the manual
|
||||
docs: add a suggested rebind and three suggested unbinds to the sample rc
|
||||
docs: avoid large Table of Contents at top of HTML version of manual
|
||||
docs: clarify that --enable options do not fully counteract --enable-tiny
|
||||
docs: correct the description of the layout -- four areas, not five
|
||||
docs: document the effect of --quickblank together with --zero/--minibar
|
||||
docs: explain the effect of --zero / -0 / 'set zero'
|
||||
docs: explain what it means when --rawsequences is needed
|
||||
docs: give more examples of things that --enable-tiny excludes
|
||||
docs: improve the title of the manual, away from the bare "nano"
|
||||
docs: list the new color names, from 'rosy' to 'crimson'
|
||||
docs: mark options -z, --suspendable, and 'set suspendable' as obsolete
|
||||
docs: mention "grey" also at the other place where color names are listed
|
||||
docs: mention M-Z (for toggling the interface) among the Feature Toggles
|
||||
docs: mention that --zero and 'set zero' hide also the help lines
|
||||
docs: move the chapter about editor basics into third position
|
||||
docs: prevent a black square in the PDF after the long synopsis line
|
||||
docs: reshuffle a GNU marker, to make the title clearer in search engines
|
||||
docs: reword several of the descriptions in the chapter on building nano
|
||||
docs: reword the beginning of the chapter on nanorc files
|
||||
docs: say thanks to the Indonesian translator
|
||||
feedback: give a more accurate message when the help lines won't appear
|
||||
feedback: refuse the --constantshow toggle (M-C) on a one-row terminal
|
||||
feedback: report an unbindable function key as an "Unknown sequence"
|
||||
feedback: report the number of inserted lines also with --zero or --mini
|
||||
feedback: show a relevant message for M-O when the syntax has 'tabgives'
|
||||
feedback: suppress chatty messages when --zero is active
|
||||
feedback: to have a status bar, suppress --zero while in the help viewer
|
||||
feedback: when reporting an unbound function key, mention its number
|
||||
feedback: when the user types ^Z, say they can suspend nano with ^T^Z
|
||||
feedback: with --mini or --zero, suppress number of lines for new buffer
|
||||
feedback: with --mini/--zero, suppress message when toggling whitespace
|
||||
feedback: with --zero, drop a message in a short while, as with --minibar
|
||||
files: allow inserting also when started with the --noread option
|
||||
files: clear original filename when the user toggles Append or Prepend
|
||||
gnulib: update to its current upstream state
|
||||
help: do not show ^S when --preserve is in effect
|
||||
help: ensure there is a blank line between title bar and start of text
|
||||
help: group the now lone mouse toggle with the "behavioral" ones
|
||||
help: remove an unneeded restriction for small terminals
|
||||
help: skip the leading blank line when the terminal is very flat
|
||||
help: when done, always redraw the "bottom bars", also with --zero
|
||||
history: process file faster by not filtering out hypothetical duplicates
|
||||
input: ensure that no more bytes are consumed than are available
|
||||
justify: correctly determine whether top-of-buffer has been reached
|
||||
memory: avoid a tiny leak when an option with an argument is given twice
|
||||
memory: avoid leaking the filename when dottifying it on the minibar
|
||||
new feature: option --zero for an interface without bars
|
||||
options: make --zero imply --nohelp, and 'set zero' imply 'set nohelp'
|
||||
pasting: when less than a line is pasted, allow automatic hard-wrapping
|
||||
prompt: avoid resetting the history pointer when the search is cancelled
|
||||
prompt: begin at bottom of history list when at secondary prompt
|
||||
prompt: keep a clear answer clear also after an excursion into history
|
||||
rcfile: recognize fourteen new color names, mostly for subdued shades
|
||||
rcfile: remove the deprecated 'cutwordleft' and 'cutwordright' keywords
|
||||
replacing: keep centering the occurrence, also after toggling help lines
|
||||
replacing: keep the spotlighted occurrence in view, also with --zero
|
||||
replacing: keep the spotlighting, also after toggling the help lines
|
||||
search: with --zero, do not obscure an occurrence on the bottom row
|
||||
search: with --zero, drop a message at the same time as the spotlight
|
||||
statusbar: count words in the way that matches how Ctrl+Right moves
|
||||
statusbar: overwrite a message also when using --constant with --zero
|
||||
suspension: enable ^Z by default -- ignore -z option and drop M-Z toggle
|
||||
suspension: leave ^Z unbound by default -- just ^T^Z will suspend nano
|
||||
syntax: debian: remove file -- Debian itself will have to handle it
|
||||
syntax: default: colorize comments as one of the last things
|
||||
syntax: default: colorize dates, URLs, and nano's release motto
|
||||
syntax: email: use a character class, as \s does not work inside brackets
|
||||
syntax: gentoo: remove file -- Gentoo itself will have to handle it
|
||||
syntax: nanorc: add 'execute' menu for unbind, and drop a bad constraint
|
||||
syntax: nanorc: avoid colorizing #rgb codes as if they were comments
|
||||
syntax: nanorc: colorize a trailing comment when it begins with non-hex
|
||||
syntax: nanorc: colorize each of the fourteen new color names as valid
|
||||
syntax: nanorc: improve the file-matching regex
|
||||
syntax: nanorc: paint arguments of 'include' and 'extendsyntax' specially
|
||||
syntax: nanorc: require whitespace before the start= and end= keywords
|
||||
syntax: python: colorize backslash escapes, such as \n and \xef
|
||||
syntax: ruby: colorize embedded documentation as a comment
|
||||
syntax: rust: do not colorize as string the text between two strings
|
||||
syntax: sql: add a few more missing keywords, like TRUE and FALSE
|
||||
syntax: sql: add more missing keywords, like INNER and OUTER JOIN
|
||||
syntax: sql: add some missing keywords, like ALL and ANY and OR
|
||||
syntax: sql: add two missing data types -- xml and tsquery
|
||||
syntax: sql: colorize as flow control only keywords that clearly are such
|
||||
syntax: sql: colorize keywords regardless of case, and tweak the colors
|
||||
syntax: sql: colorize only single-quoted things as strings
|
||||
syntax: sql: colorize strings differently than types
|
||||
syntax: sql: remove alien stuff -- it was copied mostly from ruby syntax
|
||||
syntax: texinfo: be more precise in colorizing @commands
|
||||
syntax: texinfo: colorize the special @-plus-punctuation commands too
|
||||
syntaxes: avoid coloring "this\" as if it were a valid string
|
||||
syntaxes: colorize hex more strictly by using character class [:xdigit:]
|
||||
syntaxes: drop three redundant end-of-line anchors
|
||||
syntaxes: undouble the backslash within bracket expressions
|
||||
syntaxes: use one regex for coloring quoted strings, to avoid overlap
|
||||
tabbing: also with --zero, stay one row away from the prompt bar
|
||||
tweaks: add an auxiliary variable, to prepare for handling --zero
|
||||
tweaks: add two spaces and two comments, and drop an internal check
|
||||
tweaks: adjust two values -- help lines need at least 6 rows to be shown
|
||||
tweaks: avoid a compiler warning with --enable-tiny --enable-linenumbers
|
||||
tweaks: avoid redrawing the entire window when just a 'touch' will do
|
||||
tweaks: condense the definitions of all the empty functions
|
||||
tweaks: condense the regexes for Types in the SQL syntax
|
||||
tweaks: don't redraw the help lines (if present), and normalize a brace
|
||||
tweaks: drop a fragment of code that became functionless
|
||||
tweaks: elevate two messages, so they get shown with --mini or --zero
|
||||
tweaks: elide a variable that is confusing and has just one use case
|
||||
tweaks: elide two functions that each were called just once
|
||||
tweaks: elide two parameters, as they are now always the same
|
||||
tweaks: exclude some hidden-interface code from the tiny version
|
||||
tweaks: exclude some suspension code from the tiny version
|
||||
tweaks: fix a parentheses mistake -- found by a warning from Clang
|
||||
tweaks: fix a somewhat humorous typo
|
||||
tweaks: fix typo, and improve description of 'set zero' in sample nanorc
|
||||
tweaks: fold a special case into the general one
|
||||
tweaks: fold some regexes together, and trim or improve some comments
|
||||
tweaks: frob a couple of comments, and drop two, for conciseness
|
||||
tweaks: improve a comment, and drop two cluttering compile conditions
|
||||
tweaks: invert a condition, to get an early return instead of indentation
|
||||
tweaks: just let do_wrap() set 'refresh_needed' instead of returning TRUE
|
||||
tweaks: mark keystrokes consistently with @kbd in the manual
|
||||
tweaks: move a translator hint to where xgettext will see it
|
||||
tweaks: normalize whitespace, drop unneeded prototype, condense comment
|
||||
tweaks: on one-row terminals, suppress the message for two toggles
|
||||
tweaks: place the unsetting of a flag better, and rename a variable
|
||||
tweaks: put three email addresses between the customary angled brackets
|
||||
tweaks: reassign a copy of a string to a variable more economically
|
||||
tweaks: reduce redundancy (--enable-color implies --enable-nanorc)
|
||||
tweaks: remove redundant pair of parentheses, and swap two alternatives
|
||||
tweaks: remove redundant parentheses, trim comments, fold some regexes
|
||||
tweaks: remove two unneeded unsettings
|
||||
tweaks: rename a function and its parameter, to be clearer
|
||||
tweaks: rename a function, away from using an abbreviation
|
||||
tweaks: rename a function, for some contrast and to get rid of a suffix
|
||||
tweaks: rename a function, to describe better what it does nowadays
|
||||
tweaks: rename a function, to make it make sense
|
||||
tweaks: rename a variable, to be distinctive and less confusing
|
||||
tweaks: rename a variable, to be easier to read and to make more sense
|
||||
tweaks: rename five empty functions, to get rid of a meaningless suffix
|
||||
tweaks: rename three functions, to better fit the general scheme
|
||||
tweaks: rename three parameters, away from single letters
|
||||
tweaks: rename two empty functions, to be more to the point
|
||||
tweaks: rename two functions, to get rid of another senseless suffix
|
||||
tweaks: rename two functions, to get rid of one more senseless suffix
|
||||
tweaks: rename two functions, to get rid of the senseless suffix of one
|
||||
tweaks: rename two more functions, to lose a senseless suffix
|
||||
tweaks: rename two parameters and one variable, away from single letters
|
||||
tweaks: rename two variables, away from abbreviations
|
||||
tweaks: rename two variables, to fit with the names of similar ones
|
||||
tweaks: replace a verbose condition with a simpler early return
|
||||
tweaks: replace the obscure @* with the slightly clearer @sp
|
||||
tweaks: replace two direct refreshes with two scheduled ones
|
||||
tweaks: reshuffle a coloring rule, to have related ones together
|
||||
tweaks: reshuffle a few lines, and rename a variable
|
||||
tweaks: reshuffle a few lines, for Christmas and to group things better
|
||||
tweaks: reshuffle a fragment of code to a better place
|
||||
tweaks: reshuffle a line and adjust indentation after previous change
|
||||
tweaks: reshuffle a line into its proper order, and improve two comments
|
||||
tweaks: reshuffle some conditions, so that the ifs have similar formats
|
||||
tweaks: reshuffle some conditions, to have more balanced lines
|
||||
tweaks: reshuffle some lines, one for clarity, others for conciseness
|
||||
tweaks: reshuffle the flag conversion into their order in the help text
|
||||
tweaks: reshuffle two conditions, re-indent, and rewrap a line
|
||||
tweaks: reword a paragraph, and use usual M- to depict Meta keystrokes
|
||||
tweaks: rewrap an old news item, for distraction
|
||||
tweaks: rewrap three old NEWS items, for esthetics, and fix a date
|
||||
tweaks: shorten a comment, and drop some conditionalizing
|
||||
tweaks: shorten the description of --zero in the manuals a bit
|
||||
tweaks: shorten two comments, and fold two statements together
|
||||
tweaks: swap two parts of specific regexes, for consistency with others
|
||||
tweaks: untangle two case items, and shorten a message
|
||||
tweaks: use a color closer to the rest of the string, to reduce contrast
|
||||
tweaks: use a few fewer capitals, and drop an unneeded synonym
|
||||
|
||||
Brad Town (2):
|
||||
docs: add a description of the hexadecimal #rgb color specification
|
||||
rcfile: support #rgb format for specifying colors in 256-color terminals
|
||||
|
||||
|
||||
Changes between v5.8 and v5.9:
|
||||
------------------------------
|
||||
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
Improvements in GNU nano
|
||||
========================
|
||||
|
||||
Since 6.0:
|
||||
- Option --zero hides the interface and uses the whole terminal for editing.
|
||||
- Colors can be given also in #rgb hexadecimal, to select the nearest color
|
||||
from the 6x6x6 color-cube palette available on 256-color terminals.
|
||||
- Fourteen new color names are available, from rosy to crimson.
|
||||
|
||||
Since 5.0:
|
||||
- A search briefly spotlights the found text, in black on yellow by default.
|
||||
- Option --minibar reduces the interface to a bottom bar with basic info.
|
||||
|
||||
94
NEWS
94
NEWS
@@ -1,3 +1,26 @@
|
||||
2021.12.15 - GNU nano 6.0 "Humor heeft ook zijn leuke kanten"
|
||||
• Option --zero hides the title bar, status bar and help lines, and
|
||||
uses all rows of the terminal as editing area. The title bar and
|
||||
status bar can be toggled with M-Z.
|
||||
• Colors can now be specified also as three-digit hexadecimal numbers,
|
||||
in the format #rgb. This picks from the 216 index colors (that most
|
||||
terminals know) the color that is nearest to the given values.
|
||||
• For users who dislike numbers, there are fourteen new color names:
|
||||
rosy, beet, plum, sea, sky, slate, teal, sage, brown, ocher, sand,
|
||||
tawny, brick, and crimson.
|
||||
• Suspension is enabled by default, invokable with ^T^Z. The options
|
||||
-z, --suspendable, and 'set suspendable' are obsolete and ignored.
|
||||
(In case you want to be able to suspend nano with a single keystroke,
|
||||
you can put 'bind ^Z suspend main' in your nanorc.)
|
||||
• When automatic hard-wrapping is in effect, pasting just a few words
|
||||
(without a line break) will now hard-wrap the line when needed.
|
||||
• Toggling Append or Prepend clears the current filename.
|
||||
• The word count as shown by M-D is now affected by option --wordbounds;
|
||||
with it, nano counts words as 'wc' does; without it (the new default),
|
||||
words are counted in a more human way: seeing punctuation as space.
|
||||
• The YAML syntax file is now actually included in the tarball.
|
||||
|
||||
|
||||
2021.10.06 - GNU nano 5.9 "El manicomio ha decidido: mañana sol!"
|
||||
• The extension of a filename is added to the name of a corresponding
|
||||
temporary file, so that spell checking a C file, for example, will
|
||||
@@ -187,7 +210,7 @@
|
||||
It allows running a syntax-specific command on the contents of
|
||||
the buffer.
|
||||
• ^T will try to run 'hunspell' before 'spell', because it checks
|
||||
spellling for the locale's language and understands UTF-8.
|
||||
spelling for the locale's language and understands UTF-8.
|
||||
• Multiple errors or warnings on startup will no longer slow nano
|
||||
down but will be indicated on the status bar with trailing dots.
|
||||
|
||||
@@ -1001,31 +1024,31 @@
|
||||
and not saving the search history when compiled with
|
||||
configure options.
|
||||
|
||||
2008.04.24 - GNU nano 2.1.2 "New York City" is released. This release
|
||||
contains fixes for binding bad keys, some
|
||||
configure-specific compilation failures, and more issues
|
||||
with the new input back end and in particular the status
|
||||
bar. Also fixed are some long-standing issues with
|
||||
compiling on AIX, and a segfault when making the terminal
|
||||
window too small. Rest in Peace Tim and George!
|
||||
2008.06.24 - GNU nano 2.1.2 "New York City" is released. This
|
||||
release contains fixes for binding bad keys, some
|
||||
configure-specific compilation failures, and more
|
||||
issues with the new input back end and in particular
|
||||
the status bar. Also fixed are some long-standing
|
||||
issues with compiling on AIX, and a segfault when
|
||||
making the terminal window too small. Rest in Peace
|
||||
Tim and George!
|
||||
|
||||
2008.04.01 - GNU nano 2.1.1 won't get fooled again. This release contains
|
||||
fixes for the new user-rebindable keys (in particular
|
||||
bracket match which was mis-bound), and various
|
||||
problems with translations and configure-related
|
||||
compilation problems are now fixed as well.
|
||||
It also contains new syntax highlighting
|
||||
definitions for TCL, PHP, Gentoo and Debian-related
|
||||
files, and some documentation updates as well.
|
||||
Please continue to send reports with the key
|
||||
binding code to the Savannah page
|
||||
(https://savannah.gnu.org/bugs/?group=nano).
|
||||
2008.04.01 - GNU nano 2.1.1 won't get fooled again. This release
|
||||
contains fixes for the new user-rebindable keys (in
|
||||
particular bracket match which was mis-bound), and
|
||||
various problems with translations and configure-
|
||||
related compilation problems are now fixed as well.
|
||||
It also contains new syntax highlighting definitions
|
||||
for Tcl, PHP, Gentoo and Debian-related files, and
|
||||
some documentation updates as well. Please continue to
|
||||
send reports with the key binding code to the Savannah
|
||||
page (https://savannah.gnu.org/bugs/?group=nano).
|
||||
|
||||
2008.03.18 - GNU nano 2.1.0 "under old mismanagement" is released.
|
||||
This first release in the 2.1 development series
|
||||
introduces rebindable keys for most actions inside
|
||||
the editor. Please see the nanorc(5) page for
|
||||
more information on configuring key bindings. Please
|
||||
the editor. Please see the nanorc(5) page for more
|
||||
information on configuring key bindings. Please
|
||||
also report all keybinding bugs (crashes, missing
|
||||
menu functions) using the Savannah bug tracker URL,
|
||||
https://savannah.gnu.org/bugs/?group=nano and
|
||||
@@ -1786,22 +1809,21 @@
|
||||
to upgrade to this release.
|
||||
|
||||
2000.11.18 - Nano 0.9.20 is finally out the door. Probably the biggest
|
||||
change is the brand new way nano displays previous
|
||||
search and replace strings (they are now editable!)
|
||||
This is a break from Pico's (inconsistent) interface, so
|
||||
if you don't like the new way, "Pico" mode (-p on the
|
||||
command line or Meta-P within nano) still works the
|
||||
"old" way.
|
||||
change is the brand new way nano displays previous search
|
||||
and replace strings (they are now editable!) This is a
|
||||
break from Pico's (inconsistent) interface, so if you
|
||||
don't like the new way, "Pico" mode (-p on the command
|
||||
line or Meta-P within nano) still works the "old" way.
|
||||
Other new features include being able to deal with
|
||||
search strings of any length, a new internal spell
|
||||
feature (courtesy of Mr. Rocco Corsi) and tab completion
|
||||
when reading in or writing out files! There's also the
|
||||
usual billion or so bug fixes. Feedback on this release
|
||||
is welcome because so much has changed, especially with
|
||||
the previous string display in search and replace.
|
||||
Email -> nano@nano-editor.org <-. If you like
|
||||
something, don't like something, or just want to order a
|
||||
pizza, let us know!
|
||||
search strings of any length, a new internal spell feature
|
||||
(courtesy of Mr. Rocco Corsi) and tab completion when
|
||||
reading in or writing out files! There's also the usual
|
||||
billion or so bug fixes. Feedback on this release is
|
||||
welcome because so much has changed, especially with the
|
||||
previous string display in search and replace. Email
|
||||
-> nano@nano-editor.org <-. If you like something,
|
||||
don't like something, or just want to order a pizza,
|
||||
let us know!
|
||||
|
||||
2000.10.02 - Nano 0.9.19 is the "Chris is getting married in less than
|
||||
a week and needs a distraction" release. There are only
|
||||
|
||||
8
README
8
README
@@ -15,7 +15,7 @@ Appearance
|
||||
In rough ASCII graphics, this is what nano's screen looks like:
|
||||
|
||||
____________________________________________________________________
|
||||
| GNU nano 5.9 filename Modified |
|
||||
| GNU nano 6.0 filename Modified |
|
||||
--------------------------------------------------------------------
|
||||
| This is the text window, displaying the contents of a 'buffer', |
|
||||
| the contents of the file you are editing. |
|
||||
@@ -95,13 +95,13 @@ Mailing Lists
|
||||
|
||||
There are three nano-related mailing-lists.
|
||||
|
||||
+ info-nano@gnu.org is a very low traffic list used to announce
|
||||
* <info-nano@gnu.org> is a very low traffic list used to announce
|
||||
new nano versions or other important info about the project.
|
||||
|
||||
+ help-nano@gnu.org is for those seeking to get help without
|
||||
* <help-nano@gnu.org> is for those seeking to get help without
|
||||
wanting to hear about the technical details of its development.
|
||||
|
||||
+ nano-devel@gnu.org is the list used by the people that make nano
|
||||
* <nano-devel@gnu.org> is the list used by the people that make nano
|
||||
and a general development discussion list, with moderate traffic.
|
||||
|
||||
To subscribe, send email to <name>-request@gnu.org with a subject
|
||||
|
||||
1
THANKS
1
THANKS
@@ -75,6 +75,7 @@ Johnny A. Solbu <johnny@solbu.net> Norwegian Bokmål
|
||||
Pierre Tane <tanep@bigfoot.com> French
|
||||
Yasuaki Taniguchi <yasuakit@gmail.com> Japanese
|
||||
Jacobo Tarrío <jtarrio@trasno.net> Galician
|
||||
Andika Triwidada <andika@gmail.com> Indonesian
|
||||
Francisco Javier Tsao Santín <tsao@members.fsf.org> Galician
|
||||
Balázs Úr <urbalazs@gmail.com> Hungarian
|
||||
Miquel Vidal <miquel@sindominio.net> Catalan
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# Generate configure & friends for GIT users.
|
||||
|
||||
gnulib_url="git://git.sv.gnu.org/gnulib.git"
|
||||
gnulib_hash="9aca7b67333fd0a90bf56104325ce96199644451"
|
||||
gnulib_hash="135414a7f543e4d40ad0a7cbd51885e159a6e0f4"
|
||||
|
||||
modules="
|
||||
futimens
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see https://www.gnu.org/licenses/.
|
||||
|
||||
AC_INIT([GNU nano], [5.9], [nano-devel@gnu.org], [nano])
|
||||
AC_INIT([GNU nano], [6.0], [nano-devel@gnu.org], [nano])
|
||||
AC_CONFIG_SRCDIR([src/nano.c])
|
||||
AC_CANONICAL_HOST
|
||||
AM_INIT_AUTOMAKE([1.14])
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<title>Cheatsheet for nano</title>
|
||||
<title>Cheatsheet for GNU nano</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="description" content="A concise overview of the command shortcuts of the GNU nano editor, grouped by category.">
|
||||
<meta name="description" content="A concise overview of the command shortcuts for nano, the editor, grouped by category.">
|
||||
<meta name="keywords" content="cheatsheet, nano, editor, shortcuts, keystrokes, functions, operations, commands">
|
||||
<meta name="author" content="Benno Schulenberg">
|
||||
</head>
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
<h3><a name="1.3"></a>1.3. Why the name change from TIP?</h3>
|
||||
<blockquote><p>On January 10, 2000, TIP was officially renamed to nano because of a namespace conflict with another program called 'tip'. The original 'tip' program "establishes a full duplex terminal connection to a remote host", and was included with many older Unix systems (and newer ones like Solaris). The conflict was not noticed at first because there is no 'tip' utility included with most GNU/Linux distributions (where nano was developed).</p></blockquote>
|
||||
<h3><a name="1.4"></a>1.4. What is the current version of nano?</h3>
|
||||
<blockquote><p>The current version of nano <i>should</i> be <b>5.9</b>. Of course, you should always check the <a href="https://nano-editor.org/">nano homepage</a> to see what the latest and greatest version is.</p></blockquote>
|
||||
<blockquote><p>The current version of nano <i>should</i> be <b>6.0</b>. Of course, you should always check the <a href="https://nano-editor.org/">nano homepage</a> to see what the latest and greatest version is.</p></blockquote>
|
||||
<h3><a name="1.5"></a>1.5. I want to read the man page without having to download the program!</h3>
|
||||
<blockquote><p>Jeez, demanding, aren't we? Okay, look <a href="https://nano-editor.org/dist/latest/nano.1.html">here</a>.</p></blockquote>
|
||||
<hr width="100%">
|
||||
|
||||
31
doc/nano.1
31
doc/nano.1
@@ -16,7 +16,7 @@
|
||||
.\" Documentation License along with this program. If not, see
|
||||
.\" <https://www.gnu.org/licenses/>.
|
||||
.\"
|
||||
.TH NANO 1 "version 5.9" "October 2021"
|
||||
.TH NANO 1 "version 6.0" "December 2021"
|
||||
|
||||
.SH NAME
|
||||
nano \- Nano's ANOther editor, inspired by Pico
|
||||
@@ -140,10 +140,12 @@ text. (The color of the stripe can be changed with \fBset stripecolor\fR
|
||||
in your \fInanorc\fR file.)
|
||||
.TP
|
||||
.BR \-K ", " \-\-rawsequences
|
||||
Interpret escape sequences directly (instead of asking \fBncurses\fR to
|
||||
translate them). If you need this option to get your keyboard to work
|
||||
properly, please report a bug. Using this option disables \fBnano\fR's
|
||||
mouse support.
|
||||
Interpret escape sequences directly, instead of asking \fBncurses\fR
|
||||
to translate them. (If you need this option to get some keys to work
|
||||
properly, it means that the terminfo terminal description that is used
|
||||
does not fully match the actual behavior of your terminal. This can
|
||||
happen when you ssh into a BSD machine, for example.)
|
||||
Using this option disables \fBnano\fR's mouse support.
|
||||
.TP
|
||||
.BR \-L ", " \-\-nonewlines
|
||||
Don't automatically add a newline when a text does not end with one.
|
||||
@@ -192,8 +194,11 @@ Set the size (width) of a tab to \fInumber\fP columns. The value of
|
||||
.TP
|
||||
.BR \-U ", " \-\-quickblank
|
||||
Make status-bar messages disappear after 1 keystroke instead of after 20.
|
||||
Note that options \fB\-c\fR (\fB\-\-constantshow\fR)
|
||||
and \fB\-_\fR (\fB\-\-minibar\fR) override this.
|
||||
Note that option \fB\-c\fR (\fB\-\-constantshow\fR) overrides this.
|
||||
When option \fB\-\-minibar\fR or \fB\-\-zero\fR is in effect,
|
||||
\fB\-\-quickblank\fR makes a message disappear after
|
||||
0.8 seconds instead of after the default 1.5 seconds.
|
||||
.
|
||||
.TP
|
||||
.BR \-V ", " \-\-version
|
||||
Show the current version number and exit.
|
||||
@@ -328,7 +333,9 @@ Don't show the two help lines at the bottom of the screen.
|
||||
Make Ctrl+Right and Ctrl+Delete stop at word ends instead of beginnings.
|
||||
.TP
|
||||
.BR \-z ", " \-\-suspendable
|
||||
Allow the user to suspend the editor (with \fB^Z\fR by default).
|
||||
Obsolete option; ignored. Suspension is enabled by default,
|
||||
reachable via \fB^T^Z\fR. (If you want a plain \fB^Z\fR to
|
||||
suspend nano, add \fBbind ^Z suspend main\fR to your nanorc.)
|
||||
.TP
|
||||
.BR \-% ", " \-\-stateflags
|
||||
Use the top-right corner of the screen for showing some state flags:
|
||||
@@ -355,6 +362,14 @@ The line plus column numbers and the character code are displayed only when
|
||||
\fB\-\-constantshow\fR is used, and can be toggled on and off with \fBM-C\fR.
|
||||
The state flags are displayed only when \fB\-\-stateflags\fR is used.
|
||||
.TP
|
||||
.BR \-0 ", " \-\-zero
|
||||
Hide all elements of the interface (title bar, status bar, and help lines)
|
||||
and use all rows of the terminal for showing the contents of the buffer.
|
||||
The status bar appears only when there is a significant message,
|
||||
and disappears after 1.5 seconds or upon the next keystroke.
|
||||
With \fBM-Z\fR the title bar plus status bar can be toggled.
|
||||
With \fBM-X\fR the help lines.
|
||||
.TP
|
||||
.BR \-! ", " \-\-magic
|
||||
When neither the file's name nor its first line give a clue,
|
||||
try using libmagic to determine the applicable syntax.
|
||||
|
||||
831
doc/nano.texi
831
doc/nano.texi
File diff suppressed because it is too large
Load Diff
60
doc/nanorc.5
60
doc/nanorc.5
@@ -16,7 +16,7 @@
|
||||
.\" Documentation License along with this program. If not, see
|
||||
.\" <https://www.gnu.org/licenses/>.
|
||||
.\"
|
||||
.TH NANORC 5 "version 5.9" "October 2021"
|
||||
.TH NANORC 5 "version 6.0" "December 2021"
|
||||
|
||||
.SH NAME
|
||||
nanorc \- GNU nano's configuration file
|
||||
@@ -258,7 +258,10 @@ specfified closing punctuation, optionally followed by closing brackets
|
||||
.TP
|
||||
.B set quickblank
|
||||
Make status-bar messages disappear after 1 keystroke instead of after 20.
|
||||
Note that options \fBconstantshow\fR and \fBminibar\fR override this.
|
||||
Note that option \fBconstantshow\fR overrides this.
|
||||
When option \fBminibar\fR or \fBzero\fR is in effect,
|
||||
\fBquickblank\fR makes a message disappear after
|
||||
0.8 seconds instead of after the default 1.5 seconds.
|
||||
.TP
|
||||
.BI "set quotestr """ regex """
|
||||
Set the regular expression for matching the quoting part of a line.
|
||||
@@ -268,10 +271,12 @@ This makes it possible to rejustify blocks of quoted text when composing
|
||||
email, and to rewrap blocks of line comments when writing source code.
|
||||
.TP
|
||||
.B set rawsequences
|
||||
Interpret escape sequences directly (instead of asking \fBncurses\fR to
|
||||
translate them). If you need this option to get your keyboard to work
|
||||
properly, please report a bug. Using this option disables \fBnano\fR's
|
||||
mouse support.
|
||||
Interpret escape sequences directly, instead of asking \fBncurses\fR
|
||||
to translate them. (If you need this option to get some keys to work
|
||||
properly, it means that the terminfo terminal description that is used
|
||||
does not fully match the actual behavior of your terminal. This can
|
||||
happen when you ssh into a BSD machine, for example.)
|
||||
Using this option disables \fBnano\fR's mouse support.
|
||||
.TP
|
||||
.B set rebinddelete
|
||||
Interpret the Delete and Backspace keys differently so that both Backspace
|
||||
@@ -339,7 +344,9 @@ Use this color combination for the vertical guiding stripe.
|
||||
See \fBset titlecolor\fR for more details.
|
||||
.TP
|
||||
.B set suspendable
|
||||
Allow \fBnano\fP to be suspended (with \fB^Z\fR by default).
|
||||
Obsolete option; ignored. Suspension is enabled by default,
|
||||
reachable via \fB^T^Z\fR. (If you want a plain \fB^Z\fR to
|
||||
suspend nano, add \fBbind ^Z suspend main\fR to your nanorc.)
|
||||
.TP
|
||||
.B set tabsize \fInumber\fR
|
||||
Use a tab size of \fInumber\fR columns. The value of \fInumber\fP must be
|
||||
@@ -361,8 +368,16 @@ as a synonym for \fBlightblack\fR.
|
||||
On terminal emulators that can do at least 256 colors,
|
||||
other valid (but unprefixable) color names are:
|
||||
.BR pink ", " purple ", " mauve ", " lagoon ", " mint ", "
|
||||
.BR lime ", " peach ", " orange ", " latte ", and " normal
|
||||
.BR lime ", " peach ", " orange ", " latte ", "
|
||||
.BR rosy ", " beet ", " plum ", " sea ", " sky ", " slate ", "
|
||||
.BR teal ", " sage ", " brown ", " ocher ", " sand ", " tawny ", "
|
||||
.BR brick ", " crimson ", and " normal
|
||||
-- where \fBnormal\fR means the default foreground or background color.
|
||||
On such emulators, the color may also be specified as a three-digit hexadecimal
|
||||
number prefixed with \fB#\fR, with the digits representing the amounts of red,
|
||||
green, and blue, respectively. This tells \fBnano\fR to select from the
|
||||
available palette the color that approximates the given values.
|
||||
|
||||
Either "\fIfgcolor\fR" or "\fB,\fIbgcolor\fR" may be left out,
|
||||
and the pair may be preceded by \fBbold\fR and/or \fBitalic\fR
|
||||
(separated by commas) to get a bold and/or slanting typeface,
|
||||
@@ -394,6 +409,14 @@ probably want to unset \fBwordbounds\fR.
|
||||
.B set zap
|
||||
Let an unmodified Backspace or Delete erase the marked region
|
||||
(instead of a single character, and without affecting the cutbuffer).
|
||||
.TP
|
||||
.B set zero
|
||||
Hide all elements of the interface (title bar, status bar, and help lines)
|
||||
and use all rows of the terminal for showing the contents of the buffer.
|
||||
The status bar appears only when there is a significant message,
|
||||
and disappears after 1.5 seconds or upon the next keystroke.
|
||||
With \fBM-Z\fR the title bar plus status bar can be toggled.
|
||||
With \fBM-X\fR the help lines.
|
||||
|
||||
.SH SYNTAX HIGHLIGHTING
|
||||
Coloring the different syntactic elements of a file
|
||||
@@ -483,11 +506,21 @@ one of which must be specified. Valid color names are:
|
||||
.BR white ", and " black .
|
||||
Each of these eight names may be prefixed with the word \fBlight\fR
|
||||
to get a brighter version of that color.
|
||||
The word \fBgrey\fR or \fBgray\fR may be used
|
||||
as a synonym for \fBlightblack\fR.
|
||||
On terminal emulators that can do at least 256 colors,
|
||||
other valid (but unprefixable) color names are:
|
||||
.BR pink ", " purple ", " mauve ", " lagoon ", " mint ", "
|
||||
.BR lime ", " peach ", " orange ", " latte ", and " normal
|
||||
.BR lime ", " peach ", " orange ", " latte ", "
|
||||
.BR rosy ", " beet ", " plum ", " sea ", " sky ", " slate ", "
|
||||
.BR teal ", " sage ", " brown ", " ocher ", " sand ", " tawny ", "
|
||||
.BR brick ", " crimson ", and " normal
|
||||
-- where \fBnormal\fR means the default foreground or background color.
|
||||
On such emulators, the color may also be specified as a three-digit hexadecimal
|
||||
number prefixed with \fB#\fR, with the digits representing the amounts of red,
|
||||
green, and blue, respectively. This tells \fBnano\fR to select from the
|
||||
available palette the color that approximates the given values.
|
||||
|
||||
The color pair may be preceded by \fBbold\fR and/or \fBitalic\fR
|
||||
(separated by commas) to get a bold and/or slanting typeface,
|
||||
if your terminal can do those.
|
||||
@@ -819,8 +852,8 @@ Redoes the last undone action (i.e., it undoes an undo).
|
||||
Refreshes the screen.
|
||||
.TP
|
||||
.B suspend
|
||||
Suspends the editor (if the suspending function is enabled, see the
|
||||
\fBsuspendable\fR toggle item below).
|
||||
Suspends the editor and returns control to the shell
|
||||
(until you tell the process to resume execution with \fBfg\fR).
|
||||
.TP
|
||||
.B casesens
|
||||
Toggles whether searching/replacing ignores or respects the case of
|
||||
@@ -934,11 +967,6 @@ Toggles whether typed tabs will be converted to spaces.
|
||||
.TP
|
||||
.B mouse
|
||||
Toggles mouse support.
|
||||
.TP
|
||||
.B suspendable
|
||||
Toggles whether the suspend keystroke (\fB^Z\fR by default)
|
||||
will actually suspend the editor.
|
||||
(The old name of this function, 'suspendenable', is deprecated.)
|
||||
.RE
|
||||
|
||||
.TP
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
.\" Documentation License along with this program. If not, see
|
||||
.\" <https://www.gnu.org/licenses/>.
|
||||
.\"
|
||||
.TH RNANO 1 "version 5.9" "October 2021"
|
||||
.TH RNANO 1 "version 6.0" "December 2021"
|
||||
|
||||
.SH NAME
|
||||
rnano \- a restricted nano
|
||||
|
||||
@@ -167,10 +167,6 @@
|
||||
## M = mark, L = hard-wrapping long lines, R = recording, S = soft-wrapping.
|
||||
# set stateflags
|
||||
|
||||
## Allow nano to be suspended (with ^Z by default).
|
||||
# set suspendable
|
||||
## (The old form of this option, 'set suspend', is deprecated.)
|
||||
|
||||
## Use this tab size instead of the default; it must be greater than 0.
|
||||
# set tabsize 8
|
||||
|
||||
@@ -201,6 +197,9 @@
|
||||
## of a single character, and without affecting the cutbuffer).
|
||||
# set zap
|
||||
|
||||
## Hide the bars plus help lines and use the whole terminal as edit area.
|
||||
# set zero
|
||||
|
||||
|
||||
## Paint the interface elements of nano. These are examples; there are
|
||||
## no colors by default, except for errorcolor and spotlightcolor.
|
||||
@@ -256,6 +255,9 @@
|
||||
## === Key bindings ===
|
||||
## For all details, see 'man nanorc', section REBINDING KEYS.
|
||||
|
||||
## If you want to suspend nano with one keystroke (instead of with ^T^Z):
|
||||
# bind ^Z suspend main
|
||||
|
||||
## The <Ctrl+Delete> keystroke deletes the word to the right of the cursor.
|
||||
## On some terminals the <Ctrl+Backspace> keystroke produces ^H, which is
|
||||
## the ASCII character for backspace, so it is bound by default to the
|
||||
@@ -265,11 +267,22 @@
|
||||
## <Ctrl+Backspace> delete the word to the left of the cursor with:
|
||||
# bind ^H chopwordleft main
|
||||
|
||||
## For a more mnemonic Comment keystroke (overriding Cut-from-cursor):
|
||||
# bind M-K comment main
|
||||
|
||||
## If you want ^L to just refresh the screen and not center the cursor:
|
||||
# bind ^L refresh main
|
||||
|
||||
## When you sometimes type M-J instead of M-K, or M-T instead of M-R:
|
||||
# unbind M-J main
|
||||
# unbind M-T main
|
||||
## (Those functions are still accessible through ^T^J and ^T^V.)
|
||||
|
||||
## For quickly uppercasing or lowercasing the word under the cursor.
|
||||
## (These effectively do a Ctrl+Right followed by a Shift+Ctrl+Left,
|
||||
## and then pipe the selected text through a sed command.)
|
||||
#bind Sh-M-U "Oc[1;6D|sed 's/.*/\U&/'
|
||||
" main
|
||||
# bind Sh-M-U "Oc[1;6D|sed 's/.*/\U&/'
|
||||
" main
|
||||
# bind Sh-M-L "Oc[1;6D|sed 's/.*/\L&/'
|
||||
" main
|
||||
|
||||
|
||||
1096
po/nano.pot
1096
po/nano.pot
File diff suppressed because it is too large
Load Diff
1088
po/pt_BR.po
1088
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
1092
po/zh_CN.po
1092
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
1088
po/zh_TW.po
1088
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
VERSION="5.9"
|
||||
VERSION="6.0"
|
||||
|
||||
./configure -C --enable-tiny && make && ./configure -C &&
|
||||
|
||||
|
||||
@@ -32,7 +32,9 @@ static char **filelist = NULL;
|
||||
/* The list of files to display in the file browser. */
|
||||
static size_t list_length = 0;
|
||||
/* The number of files in the list. */
|
||||
static size_t width = 0;
|
||||
static size_t usable_rows = 0;
|
||||
/* The number of screen rows we can use to display the list. */
|
||||
static size_t piles = 0;
|
||||
/* The number of files that we can display per screen row. */
|
||||
static size_t longest = 0;
|
||||
/* The number of columns in the longest filename in the list. */
|
||||
@@ -42,7 +44,7 @@ static size_t selected = 0;
|
||||
/* Set filelist to the list of files contained in the directory path,
|
||||
* set list_length to the number of files in that list, set longest to
|
||||
* the width in columns of the longest filename in that list (between 15
|
||||
* and COLS), and set width to the number of files that we can display
|
||||
* and COLS), and set piles to the number of files that we can display
|
||||
* per screen row. And sort the list too. */
|
||||
void read_the_list(const char *path, DIR *dir)
|
||||
{
|
||||
@@ -103,7 +105,9 @@ void read_the_list(const char *path, DIR *dir)
|
||||
/* Calculate how many files fit on a line -- feigning room for two
|
||||
* spaces beyond the right edge, and adding two spaces of padding
|
||||
* between columns. */
|
||||
width = (COLS + 2) / (longest + 2);
|
||||
piles = (COLS + 2) / (longest + 2);
|
||||
|
||||
usable_rows = editwinrows - (ISSET(ZERO) && LINES > 1 ? 1 : 0);
|
||||
}
|
||||
|
||||
/* Look for needle. If we find it, set selected to its location.
|
||||
@@ -143,8 +147,8 @@ void browser_refresh(void)
|
||||
titlebar(present_path);
|
||||
blank_edit();
|
||||
|
||||
for (size_t index = selected - selected % (editwinrows * width);
|
||||
index < list_length && row < editwinrows; index++) {
|
||||
for (size_t index = selected - selected % (usable_rows * piles);
|
||||
index < list_length && row < usable_rows; index++) {
|
||||
const char *thename = tail(filelist[index]);
|
||||
/* The filename we display, minus the path. */
|
||||
size_t namelen = breadth(thename);
|
||||
@@ -355,7 +359,7 @@ void search_filename(bool forwards)
|
||||
if (*answer != '\0') {
|
||||
last_search = mallocstrcpy(last_search, answer);
|
||||
#ifdef ENABLE_HISTORIES
|
||||
update_history(&search_history, answer);
|
||||
update_history(&search_history, answer, PRUNE_DUPLICATE);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -430,7 +434,7 @@ char *browse(char *path)
|
||||
|
||||
if (path == NULL || dir == NULL) {
|
||||
statusline(ALERT, _("Cannot open directory: %s"), strerror(errno));
|
||||
/* If we don't have a file list yet, there is nothing to show. */
|
||||
/* If we don't have a file list, there is nothing to show. */
|
||||
if (filelist == NULL) {
|
||||
lastmessage = VACUUM;
|
||||
free(present_name);
|
||||
@@ -443,7 +447,7 @@ char *browse(char *path)
|
||||
}
|
||||
|
||||
if (dir != NULL) {
|
||||
/* Get the file list, and set longest and width in the process. */
|
||||
/* Get the file list, and set longest and piles in the process. */
|
||||
read_the_list(path, dir);
|
||||
closedir(dir);
|
||||
dir = NULL;
|
||||
@@ -486,25 +490,21 @@ char *browse(char *path)
|
||||
if (kbinput == KEY_MOUSE) {
|
||||
int mouse_x, mouse_y;
|
||||
|
||||
/* We can click on the edit window to select a filename. */
|
||||
/* When the user clicked in the file list, select a filename. */
|
||||
if (get_mouseinput(&mouse_y, &mouse_x, TRUE) == 0 &&
|
||||
wmouse_trafo(edit, &mouse_y, &mouse_x, FALSE)) {
|
||||
/* longest is the width of each column. There
|
||||
* are two spaces between each column. */
|
||||
selected = selected - selected % (editwinrows * width) +
|
||||
(mouse_y * width) + (mouse_x / (longest + 2));
|
||||
selected = selected - selected % (usable_rows * piles) +
|
||||
(mouse_y * piles) + (mouse_x / (longest + 2));
|
||||
|
||||
/* If they clicked beyond the end of a row,
|
||||
* select the last filename in that row. */
|
||||
if (mouse_x > width * (longest + 2))
|
||||
/* When beyond end-of-row, select the preceding filename. */
|
||||
if (mouse_x > piles * (longest + 2))
|
||||
selected--;
|
||||
|
||||
/* If we're beyond the list, select the last filename. */
|
||||
/* When beyond end-of-list, select the last filename. */
|
||||
if (selected > list_length - 1)
|
||||
selected = list_length - 1;
|
||||
|
||||
/* If we selected the same filename as last time, fake a
|
||||
* press of the Enter key so that the file is read in. */
|
||||
/* When a filename is clicked a second time, choose it. */
|
||||
if (old_selected == selected)
|
||||
kbinput = KEY_ENTER;
|
||||
}
|
||||
@@ -524,17 +524,15 @@ char *browse(char *path)
|
||||
if (func == full_refresh) {
|
||||
full_refresh();
|
||||
#ifndef NANO_TINY
|
||||
/* Simulate a window resize to force a directory reread. */
|
||||
/* Simulate a terminal resize to force a directory reread. */
|
||||
kbinput = KEY_WINCH;
|
||||
#endif
|
||||
} else if (func == do_help) {
|
||||
do_help();
|
||||
#ifndef NANO_TINY
|
||||
/* The window dimensions might have changed, so act as if. */
|
||||
/* The terminal dimensions might have changed, so act as if. */
|
||||
kbinput = KEY_WINCH;
|
||||
#endif
|
||||
#ifndef NANO_TINY
|
||||
} else if (func == do_toggle_void) {
|
||||
} else if (func == do_toggle) {
|
||||
TOGGLE(NO_HELP);
|
||||
window_init();
|
||||
kbinput = KEY_WINCH;
|
||||
@@ -554,43 +552,42 @@ char *browse(char *path)
|
||||
if (selected < list_length - 1)
|
||||
selected++;
|
||||
} else if (func == to_prev_word) {
|
||||
selected -= (selected % width);
|
||||
selected -= (selected % piles);
|
||||
} else if (func == to_next_word) {
|
||||
selected += width - 1 - (selected % width);
|
||||
selected += piles - 1 - (selected % piles);
|
||||
if (selected >= list_length)
|
||||
selected = list_length - 1;
|
||||
} else if (func == do_up) {
|
||||
if (selected >= width)
|
||||
selected -= width;
|
||||
if (selected >= piles)
|
||||
selected -= piles;
|
||||
} else if (func == do_down) {
|
||||
if (selected + width <= list_length - 1)
|
||||
selected += width;
|
||||
if (selected + piles <= list_length - 1)
|
||||
selected += piles;
|
||||
} else if (func == to_prev_block) {
|
||||
selected = ((selected / (editwinrows * width)) *
|
||||
editwinrows * width) + selected % width;
|
||||
selected = ((selected / (usable_rows * piles)) * usable_rows * piles) +
|
||||
selected % piles;
|
||||
} else if (func == to_next_block) {
|
||||
selected = ((selected / (editwinrows * width)) *
|
||||
editwinrows * width) + selected % width +
|
||||
editwinrows * width - width;
|
||||
selected = ((selected / (usable_rows * piles)) * usable_rows * piles) +
|
||||
selected % piles + usable_rows * piles - piles;
|
||||
if (selected >= list_length)
|
||||
selected = (list_length / width) * width + selected % width;
|
||||
selected = (list_length / piles) * piles + selected % piles;
|
||||
if (selected >= list_length)
|
||||
selected -= width;
|
||||
selected -= piles;
|
||||
} else if (func == do_page_up) {
|
||||
if (selected < width)
|
||||
if (selected < piles)
|
||||
selected = 0;
|
||||
else if (selected < editwinrows * width)
|
||||
selected = selected % width;
|
||||
else if (selected < usable_rows * piles)
|
||||
selected = selected % piles;
|
||||
else
|
||||
selected -= editwinrows * width;
|
||||
selected -= usable_rows * piles;
|
||||
} else if (func == do_page_down) {
|
||||
if (selected + width >= list_length - 1)
|
||||
if (selected + piles >= list_length - 1)
|
||||
selected = list_length - 1;
|
||||
else if (selected + editwinrows * width >= list_length)
|
||||
selected = (selected + editwinrows * width - list_length) %
|
||||
width + list_length - width;
|
||||
else if (selected + usable_rows * piles >= list_length)
|
||||
selected = (selected + usable_rows * piles - list_length) % piles +
|
||||
list_length - piles;
|
||||
else
|
||||
selected += editwinrows * width;
|
||||
selected += usable_rows * piles;
|
||||
} else if (func == to_first_file) {
|
||||
selected = 0;
|
||||
} else if (func == to_last_file) {
|
||||
@@ -615,8 +612,8 @@ char *browse(char *path)
|
||||
|
||||
#ifdef ENABLE_OPERATINGDIR
|
||||
if (outside_of_confinement(path, FALSE)) {
|
||||
/* TRANSLATORS: This refers to the confining effect of the
|
||||
* option --operatingdir, not of --restricted. */
|
||||
/* TRANSLATORS: This refers to the confining effect of
|
||||
* the option --operatingdir, not of --restricted. */
|
||||
statusline(ALERT, _("Can't go outside of %s"), operating_dir);
|
||||
path = mallocstrcpy(path, present_path);
|
||||
continue;
|
||||
@@ -679,7 +676,7 @@ char *browse(char *path)
|
||||
#endif
|
||||
#ifndef NANO_TINY
|
||||
} else if (kbinput == KEY_WINCH) {
|
||||
; /* Nothing to do. */
|
||||
; /* Gets handled below. */
|
||||
#endif
|
||||
} else if (func == do_exit) {
|
||||
break;
|
||||
@@ -687,11 +684,10 @@ char *browse(char *path)
|
||||
unbound_key(kbinput);
|
||||
|
||||
#ifndef NANO_TINY
|
||||
/* If the window resized, refresh the file list. */
|
||||
/* If the terminal resized (or might have), refresh the file list. */
|
||||
if (kbinput == KEY_WINCH) {
|
||||
/* Remember the selected file, to be able to reselect it. */
|
||||
present_name = copy_of(filelist[selected]);
|
||||
/* Reread the contents of the current directory. */
|
||||
goto read_directory_contents;
|
||||
}
|
||||
#endif
|
||||
|
||||
14
src/cut.c
14
src/cut.c
@@ -185,7 +185,7 @@ void chop_word(bool forward)
|
||||
* on the edge of the original line, then put the cursor on that
|
||||
* edge instead, so that lines will not be joined unexpectedly. */
|
||||
if (!forward) {
|
||||
do_prev_word(ISSET(WORD_BOUNDS));
|
||||
do_prev_word();
|
||||
if (openfile->current != is_current) {
|
||||
if (is_current_x > 0) {
|
||||
openfile->current = is_current;
|
||||
@@ -194,7 +194,7 @@ void chop_word(bool forward)
|
||||
openfile->current_x = strlen(openfile->current->data);
|
||||
}
|
||||
} else {
|
||||
do_next_word(ISSET(AFTER_ENDS), ISSET(WORD_BOUNDS));
|
||||
do_next_word(ISSET(AFTER_ENDS));
|
||||
if (openfile->current != is_current &&
|
||||
is_current->data[is_current_x] != '\0') {
|
||||
openfile->current = is_current;
|
||||
@@ -694,9 +694,11 @@ void copy_text(void)
|
||||
/* Copy text from the cutbuffer into the current buffer. */
|
||||
void paste_text(void)
|
||||
{
|
||||
#ifndef NANO_TINY
|
||||
#if defined(ENABLE_WRAPPING) || !defined(NANO_TINY)
|
||||
/* Remember where the paste started. */
|
||||
linestruct *was_current = openfile->current;
|
||||
#endif
|
||||
#ifndef NANO_TINY
|
||||
bool had_anchor = was_current->has_anchor;
|
||||
#endif
|
||||
ssize_t was_lineno = openfile->current->lineno;
|
||||
@@ -728,6 +730,12 @@ void paste_text(void)
|
||||
update_undo(PASTE);
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_WRAPPING
|
||||
/* When still on the same line and doing hard-wrapping, limit the width. */
|
||||
if (openfile->current == was_current && ISSET(BREAK_LONG_LINES))
|
||||
do_wrap();
|
||||
#endif
|
||||
|
||||
/* If we pasted less than a screenful, don't center the cursor. */
|
||||
if (less_than_a_screenful(was_lineno, was_leftedge))
|
||||
focusing = FALSE;
|
||||
|
||||
@@ -122,6 +122,9 @@
|
||||
#define ANNOTATE TRUE
|
||||
#define NONOTES FALSE
|
||||
|
||||
#define PRUNE_DUPLICATE TRUE
|
||||
#define IGNORE_DUPLICATES FALSE
|
||||
|
||||
#ifdef ENABLE_UTF8
|
||||
/* In UTF-8 a valid character is at most four bytes long. */
|
||||
#define MAXCHARLEN 4
|
||||
@@ -215,7 +218,7 @@
|
||||
#define FOREIGN_SEQUENCE 0x4FC
|
||||
|
||||
/* A special keycode for plugging into the input stream after a suspension. */
|
||||
#define KEY_FLUSH KEY_F0
|
||||
#define KEY_FRESH 0x4FE
|
||||
|
||||
#ifndef NANO_TINY
|
||||
/* A special keycode for when we get a SIGWINCH (a window resize). */
|
||||
@@ -354,7 +357,8 @@ enum {
|
||||
BOOKSTYLE,
|
||||
STATEFLAGS,
|
||||
USE_MAGIC,
|
||||
MINIBAR
|
||||
MINIBAR,
|
||||
ZERO
|
||||
};
|
||||
|
||||
/* Structure types. */
|
||||
|
||||
88
src/files.c
88
src/files.c
@@ -811,18 +811,20 @@ void read_file(FILE *f, int fd, const char *filename, bool undoable)
|
||||
#ifndef NANO_TINY
|
||||
else if (format == MAC_FILE)
|
||||
/* TRANSLATORS: Keep the next three messages at most 78 characters. */
|
||||
statusline(HUSH, P_("Read %zu line (Converted from Mac format)",
|
||||
statusline(REMARK, P_("Read %zu line (Converted from Mac format)",
|
||||
"Read %zu lines (Converted from Mac format)",
|
||||
num_lines), num_lines);
|
||||
else if (format == DOS_FILE)
|
||||
statusline(HUSH, P_("Read %zu line (Converted from DOS format)",
|
||||
statusline(REMARK, P_("Read %zu line (Converted from DOS format)",
|
||||
"Read %zu lines (Converted from DOS format)",
|
||||
num_lines), num_lines);
|
||||
#endif
|
||||
else
|
||||
statusline(HUSH, P_("Read %zu line", "Read %zu lines",
|
||||
else if ((!ISSET(MINIBAR) && !ISSET(ZERO)) || (we_are_running && undoable))
|
||||
statusline(REMARK, P_("Read %zu line", "Read %zu lines",
|
||||
num_lines), num_lines);
|
||||
|
||||
report_size = TRUE;
|
||||
|
||||
/* If we inserted less than a screenful, don't center the cursor. */
|
||||
if (undoable && less_than_a_screenful(was_lineno, was_leftedge))
|
||||
focusing = FALSE;
|
||||
@@ -898,7 +900,7 @@ int open_file(const char *filename, bool new_one, FILE **f)
|
||||
statusline(ALERT, _("Error reading %s: %s"), filename, strerror(errno));
|
||||
close(fd);
|
||||
fd = -1;
|
||||
} else
|
||||
} else if (!ISSET(ZERO) || we_are_running)
|
||||
statusbar(_("Reading..."));
|
||||
}
|
||||
|
||||
@@ -1107,9 +1109,10 @@ bool execute_command(const char *command)
|
||||
}
|
||||
#endif /* NANO_TINY */
|
||||
|
||||
/* Insert a file into the current buffer, or into a new buffer when
|
||||
* the MULTIBUFFER flag is set. */
|
||||
void do_insertfile(bool execute)
|
||||
/* Insert a file into the current buffer (or into a new buffer). But when
|
||||
* execute is TRUE, run a command in the shell and insert its output into
|
||||
* the buffer, or just run one of the tools listed in the help lines. */
|
||||
void insert_a_file_or(bool execute)
|
||||
{
|
||||
int response;
|
||||
const char *msg;
|
||||
@@ -1158,15 +1161,9 @@ void do_insertfile(bool execute)
|
||||
|
||||
present_path = mallocstrcpy(present_path, "./");
|
||||
|
||||
response = do_prompt(
|
||||
#ifndef NANO_TINY
|
||||
execute ? MEXECUTE :
|
||||
#endif
|
||||
MINSERTFILE, given,
|
||||
#ifndef NANO_TINY
|
||||
execute ? &execute_history :
|
||||
#endif
|
||||
NULL, edit_refresh, msg,
|
||||
response = do_prompt(execute ? MEXECUTE : MINSERTFILE, given,
|
||||
execute ? &execute_history : NULL,
|
||||
edit_refresh, msg,
|
||||
#ifdef ENABLE_OPERATINGDIR
|
||||
operating_dir != NULL ? operating_dir :
|
||||
#endif
|
||||
@@ -1242,7 +1239,7 @@ void do_insertfile(bool execute)
|
||||
if (*answer != '\0') {
|
||||
execute_command(answer);
|
||||
#ifdef ENABLE_HISTORIES
|
||||
update_history(&execute_history, answer);
|
||||
update_history(&execute_history, answer, PRUNE_DUPLICATE);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1275,7 +1272,7 @@ void do_insertfile(bool execute)
|
||||
if (!execute)
|
||||
#endif
|
||||
if (has_old_position(answer, &priorline, &priorcol))
|
||||
do_gotolinecolumn(priorline, priorcol, FALSE, FALSE);
|
||||
goto_line_and_column(priorline, priorcol, FALSE, FALSE);
|
||||
}
|
||||
#endif
|
||||
/* Update title bar and color info for this new buffer. */
|
||||
@@ -1306,10 +1303,10 @@ void do_insertfile(bool execute)
|
||||
}
|
||||
|
||||
/* If the current mode of operation allows it, go insert a file. */
|
||||
void do_insertfile_void(void)
|
||||
void do_insertfile(void)
|
||||
{
|
||||
if (!in_restricted_mode())
|
||||
do_insertfile(FALSE);
|
||||
insert_a_file_or(FALSE);
|
||||
}
|
||||
|
||||
#ifndef NANO_TINY
|
||||
@@ -1317,7 +1314,7 @@ void do_insertfile_void(void)
|
||||
void do_execute(void)
|
||||
{
|
||||
if (!in_restricted_mode())
|
||||
do_insertfile(TRUE);
|
||||
insert_a_file_or(TRUE);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -2030,7 +2027,7 @@ bool write_file(const char *name, FILE *thefile, bool normal,
|
||||
}
|
||||
|
||||
#ifndef NANO_TINY
|
||||
if (ISSET(MINIBAR) && LINES > 1 && annotate)
|
||||
if (ISSET(MINIBAR) && !ISSET(ZERO) && LINES > 1 && annotate)
|
||||
report_size = TRUE;
|
||||
else
|
||||
#endif
|
||||
@@ -2089,13 +2086,12 @@ bool write_region_to_file(const char *name, FILE *stream, bool normal,
|
||||
}
|
||||
#endif /* !NANO_TINY */
|
||||
|
||||
/* Write the current buffer to disk. If the mark is on, write the current
|
||||
* marked selection to disk. If exiting is TRUE, write the entire buffer
|
||||
* to disk regardless of whether the mark is on. Do not ask for a name
|
||||
* when withprompt is FALSE nor when the SAVE_ON_EXIT flag is set and the
|
||||
* buffer already has a name. Return 0 on error, 1 on success, and 2 when
|
||||
/* Write the current buffer (or marked region) to disk. If exiting is TRUE,
|
||||
* write the entire buffer regardless of whether the mark is on. Do not ask
|
||||
* for a name when withprompt is FALSE (nor when doing save-on-exit and the
|
||||
* buffer already has a name). Return 0 on error, 1 on success, and 2 when
|
||||
* the buffer is to be discarded. */
|
||||
int do_writeout(bool exiting, bool withprompt)
|
||||
int write_it_out(bool exiting, bool withprompt)
|
||||
{
|
||||
char *given;
|
||||
/* The filename we offer, or what the user typed so far. */
|
||||
@@ -2116,9 +2112,10 @@ int do_writeout(bool exiting, bool withprompt)
|
||||
#endif
|
||||
|
||||
while (TRUE) {
|
||||
int response = 0, choice = 0;
|
||||
functionptrtype func;
|
||||
const char *msg;
|
||||
int response = 0;
|
||||
int choice = 0;
|
||||
#ifndef NANO_TINY
|
||||
const char *formatstr = (openfile->fmt == DOS_FILE) ? _(" [DOS Format]") :
|
||||
(openfile->fmt == MAC_FILE) ? _(" [Mac Format]") : "";
|
||||
@@ -2184,22 +2181,24 @@ int do_writeout(bool exiting, bool withprompt)
|
||||
} else
|
||||
#endif
|
||||
#ifndef NANO_TINY
|
||||
if (func == dos_format_void) {
|
||||
if (func == dos_format) {
|
||||
openfile->fmt = (openfile->fmt == DOS_FILE) ? NIX_FILE : DOS_FILE;
|
||||
continue;
|
||||
} else if (func == mac_format_void) {
|
||||
} else if (func == mac_format) {
|
||||
openfile->fmt = (openfile->fmt == MAC_FILE) ? NIX_FILE : MAC_FILE;
|
||||
continue;
|
||||
} else if (func == backup_file_void) {
|
||||
} else if (func == back_it_up) {
|
||||
TOGGLE(MAKE_BACKUP);
|
||||
continue;
|
||||
} else if (func == prepend_void) {
|
||||
method = (method == PREPEND) ? OVERWRITE : PREPEND;
|
||||
} else if (func == prepend_it || func == append_it) {
|
||||
if (func == prepend_it)
|
||||
method = (method == PREPEND) ? OVERWRITE : PREPEND;
|
||||
else
|
||||
method = (method == APPEND) ? OVERWRITE : APPEND;
|
||||
if (strcmp(answer, openfile->filename) == 0)
|
||||
given[0] = '\0';
|
||||
continue;
|
||||
} else if (func == append_void) {
|
||||
method = (method == APPEND) ? OVERWRITE : APPEND;
|
||||
continue;
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
if (func == do_help)
|
||||
continue;
|
||||
@@ -2331,17 +2330,17 @@ int do_writeout(bool exiting, bool withprompt)
|
||||
}
|
||||
|
||||
/* Write the current buffer to disk, or discard it. */
|
||||
void do_writeout_void(void)
|
||||
void do_writeout(void)
|
||||
{
|
||||
/* If the user chose to discard the buffer, close it. */
|
||||
if (do_writeout(FALSE, TRUE) == 2)
|
||||
if (write_it_out(FALSE, TRUE) == 2)
|
||||
close_and_go();
|
||||
}
|
||||
|
||||
/* If it has a name, write the current buffer to disk without prompting. */
|
||||
void do_savefile(void)
|
||||
{
|
||||
if (do_writeout(FALSE, FALSE) == 2)
|
||||
if (write_it_out(FALSE, FALSE) == 2)
|
||||
close_and_go();
|
||||
}
|
||||
|
||||
@@ -2629,6 +2628,7 @@ char *input_tab(char *morsel, size_t *place, void (*refresh_func)(void), bool *l
|
||||
|
||||
/* If there is more than one possible completion, show a sorted list. */
|
||||
if (num_matches > 1) {
|
||||
int lastrow = editwinrows - 1 - (ISSET(ZERO) && LINES > 1 ? 1 : 0);
|
||||
size_t longest_name = 0;
|
||||
size_t nrows, ncols;
|
||||
int row;
|
||||
@@ -2654,7 +2654,7 @@ char *input_tab(char *morsel, size_t *place, void (*refresh_func)(void), bool *l
|
||||
ncols = (COLS + 1) / (longest_name + 2);
|
||||
nrows = (num_matches + ncols - 1) / ncols;
|
||||
|
||||
row = (nrows < editwinrows - 1) ? editwinrows - nrows - 1 : 0;
|
||||
row = (nrows < lastrow) ? lastrow - nrows : 0;
|
||||
|
||||
/* Blank the edit window and hide the cursor. */
|
||||
blank_edit();
|
||||
@@ -2666,7 +2666,7 @@ char *input_tab(char *morsel, size_t *place, void (*refresh_func)(void), bool *l
|
||||
|
||||
wmove(edit, row, (longest_name + 2) * (match % ncols));
|
||||
|
||||
if (row == editwinrows - 1 && (match + 1) % ncols == 0 &&
|
||||
if (row == lastrow && (match + 1) % ncols == 0 &&
|
||||
match + 1 < num_matches) {
|
||||
waddstr(edit, _("(more)"));
|
||||
break;
|
||||
|
||||
252
src/global.c
252
src/global.c
@@ -80,8 +80,6 @@ linestruct *pletion_line = NULL;
|
||||
bool also_the_last = FALSE;
|
||||
/* Whether indenting/commenting should include the last line of
|
||||
* the marked region. */
|
||||
bool hide_cursor = FALSE;
|
||||
/* Whether to suppress the cursor when highlighting a search match. */
|
||||
|
||||
char *answer = NULL;
|
||||
/* The answer string used by the status-bar prompt. */
|
||||
@@ -218,15 +216,16 @@ funcstruct *exitfunc;
|
||||
|
||||
linestruct *search_history = NULL;
|
||||
/* The current item in the list of strings that were searched for. */
|
||||
linestruct *execute_history = NULL;
|
||||
/* The current item in the list of commands that were run with ^R ^X. */
|
||||
linestruct *replace_history = NULL;
|
||||
/* The current item in the list of replace strings. */
|
||||
linestruct *execute_history = NULL;
|
||||
/* The current item in the list of commands that were run with ^T. */
|
||||
|
||||
#ifdef ENABLE_HISTORIES
|
||||
linestruct *searchtop = NULL;
|
||||
/* The oldest item in the list of search strings. */
|
||||
linestruct *searchbot = NULL;
|
||||
/* The newest item in the list of search strings. */
|
||||
/* The empty item at the end of the list of search strings. */
|
||||
|
||||
linestruct *replacetop = NULL;
|
||||
linestruct *replacebot = NULL;
|
||||
@@ -282,72 +281,36 @@ size_t light_to_col = 0;
|
||||
#endif
|
||||
|
||||
/* Empty functions, for the most part corresponding to toggles. */
|
||||
void case_sens_void(void)
|
||||
{
|
||||
}
|
||||
void regexp_void(void)
|
||||
{
|
||||
}
|
||||
void backwards_void(void)
|
||||
{
|
||||
}
|
||||
void flip_replace(void)
|
||||
{
|
||||
}
|
||||
void flip_goto(void)
|
||||
{
|
||||
}
|
||||
void case_sens_void(void) {;}
|
||||
void regexp_void(void) {;}
|
||||
void backwards_void(void) {;}
|
||||
#ifdef ENABLE_HISTORIES
|
||||
void get_older_item(void) {;}
|
||||
void get_newer_item(void) {;}
|
||||
#endif
|
||||
void flip_replace(void) {;}
|
||||
void flip_goto(void) {;}
|
||||
#ifdef ENABLE_BROWSER
|
||||
void to_files(void)
|
||||
{
|
||||
}
|
||||
void goto_dir(void)
|
||||
{
|
||||
}
|
||||
void to_files(void) {;}
|
||||
void goto_dir(void) {;}
|
||||
#endif
|
||||
#ifndef NANO_TINY
|
||||
void do_nothing(void)
|
||||
{
|
||||
}
|
||||
void do_toggle_void(void)
|
||||
{
|
||||
}
|
||||
void dos_format_void(void)
|
||||
{
|
||||
}
|
||||
void mac_format_void(void)
|
||||
{
|
||||
}
|
||||
void append_void(void)
|
||||
{
|
||||
}
|
||||
void prepend_void(void)
|
||||
{
|
||||
}
|
||||
void backup_file_void(void)
|
||||
{
|
||||
}
|
||||
void flip_execute(void)
|
||||
{
|
||||
}
|
||||
void flip_pipe(void)
|
||||
{
|
||||
}
|
||||
void flip_convert(void)
|
||||
{
|
||||
}
|
||||
void do_nothing(void) {;}
|
||||
void do_toggle(void) {;}
|
||||
void dos_format(void) {;}
|
||||
void mac_format(void) {;}
|
||||
void append_it(void) {;}
|
||||
void prepend_it(void) {;}
|
||||
void back_it_up(void) {;}
|
||||
void flip_execute(void) {;}
|
||||
void flip_pipe(void) {;}
|
||||
void flip_convert(void) {;}
|
||||
#endif
|
||||
#ifdef ENABLE_MULTIBUFFER
|
||||
void flip_newbuffer(void)
|
||||
{
|
||||
}
|
||||
void flip_newbuffer(void) {;}
|
||||
#endif
|
||||
void discard_buffer(void)
|
||||
{
|
||||
}
|
||||
void do_cancel(void)
|
||||
{
|
||||
}
|
||||
void discard_buffer(void) {;}
|
||||
void do_cancel(void) {;}
|
||||
|
||||
/* Add a function to the linked list of functions. */
|
||||
void add_to_funcs(void (*func)(void), int menus, const char *desc,
|
||||
@@ -554,6 +517,14 @@ functionptrtype interpret(int *keycode)
|
||||
}
|
||||
#endif /* ENABLE_BROWSER || ENABLE_HELP */
|
||||
|
||||
#if defined(NANO_TINY) && defined(ENABLE_LINENUMBERS)
|
||||
/* Allow toggling line numbers also in the tiny version. */
|
||||
void toggle_numbers(void)
|
||||
{
|
||||
TOGGLE(LINE_NUMBERS);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* These two tags are used elsewhere too, so they are global. */
|
||||
/* TRANSLATORS: Try to keep the next two strings at most 10 characters. */
|
||||
const char *exit_tag = N_("Exit");
|
||||
@@ -651,9 +622,9 @@ void shortcut_init(void)
|
||||
#ifndef NANO_TINY
|
||||
const char *wordcount_gist =
|
||||
N_("Count the number of words, lines, and characters");
|
||||
const char *suspend_gist = N_("Suspend the editor (return to the shell)");
|
||||
#endif
|
||||
const char *refresh_gist = N_("Refresh (redraw) the current screen");
|
||||
const char *suspend_gist = N_("Suspend the editor (if suspension is enabled)");
|
||||
#ifdef ENABLE_WORDCOMPLETION
|
||||
const char *completion_gist = N_("Try and complete the current word");
|
||||
#endif
|
||||
@@ -755,7 +726,7 @@ void shortcut_init(void)
|
||||
add_to_funcs(flip_goto, MGOTOLINE, "Go To Text", "x", 0, VIEW);
|
||||
#endif
|
||||
|
||||
add_to_funcs(do_writeout_void, MMAIN,
|
||||
add_to_funcs(do_writeout, MMAIN,
|
||||
N_("Write Out"), WITHORSANS(writeout_gist), TOGETHER, NOVIEW);
|
||||
|
||||
#ifdef ENABLE_JUSTIFY
|
||||
@@ -763,7 +734,7 @@ void shortcut_init(void)
|
||||
* otherwise, show Insert anyway, to keep the help items paired. */
|
||||
if (!ISSET(RESTRICTED))
|
||||
#endif
|
||||
add_to_funcs(do_insertfile_void, MMAIN,
|
||||
add_to_funcs(do_insertfile, MMAIN,
|
||||
N_("Read File"), WITHORSANS(readfile_gist), BLANKAFTER,
|
||||
/* We allow inserting files in view mode if multibuffer mode
|
||||
* is available, so that the user can view multiple files. */
|
||||
@@ -821,7 +792,7 @@ void shortcut_init(void)
|
||||
#if defined(NANO_TINY) || defined(ENABLE_JUSTIFY)
|
||||
/* Conditionally placing this one here or further on, to keep the
|
||||
* help items nicely paired in most conditions. */
|
||||
add_to_funcs(do_gotolinecolumn_void, MMAIN,
|
||||
add_to_funcs(do_gotolinecolumn, MMAIN,
|
||||
N_("Go To Line"), WITHORSANS(gotoline_gist), BLANKAFTER, VIEW);
|
||||
#endif
|
||||
|
||||
@@ -851,9 +822,9 @@ void shortcut_init(void)
|
||||
N_("No Replace"), WITHORSANS(whereis_gist), BLANKAFTER, VIEW);
|
||||
|
||||
#ifdef ENABLE_HISTORIES
|
||||
add_to_funcs(get_history_older_void, MWHEREIS|MREPLACE|MREPLACEWITH|MWHEREISFILE,
|
||||
add_to_funcs(get_older_item, MWHEREIS|MREPLACE|MREPLACEWITH|MWHEREISFILE,
|
||||
N_("Older"), WITHORSANS(older_gist), TOGETHER, VIEW);
|
||||
add_to_funcs(get_history_newer_void, MWHEREIS|MREPLACE|MREPLACEWITH|MWHEREISFILE,
|
||||
add_to_funcs(get_newer_item, MWHEREIS|MREPLACE|MREPLACEWITH|MWHEREISFILE,
|
||||
N_("Newer"), WITHORSANS(newer_gist), BLANKAFTER, VIEW);
|
||||
#endif
|
||||
|
||||
@@ -968,7 +939,7 @@ void shortcut_init(void)
|
||||
#endif
|
||||
|
||||
#if !defined(NANO_TINY) && !defined(ENABLE_JUSTIFY)
|
||||
add_to_funcs(do_gotolinecolumn_void, MMAIN,
|
||||
add_to_funcs(do_gotolinecolumn, MMAIN,
|
||||
N_("Go To Line"), WITHORSANS(gotoline_gist), BLANKAFTER, VIEW);
|
||||
#endif
|
||||
|
||||
@@ -1005,21 +976,22 @@ void shortcut_init(void)
|
||||
#endif
|
||||
|
||||
#ifndef NANO_TINY
|
||||
add_to_funcs(do_wordlinechar_count, MMAIN,
|
||||
add_to_funcs(count_lines_words_and_characters, MMAIN,
|
||||
N_("Word Count"), WITHORSANS(wordcount_gist), TOGETHER, VIEW);
|
||||
#endif
|
||||
|
||||
add_to_funcs(do_verbatim_input, MMAIN,
|
||||
N_("Verbatim"), WITHORSANS(verbatim_gist), BLANKAFTER, NOVIEW);
|
||||
|
||||
#ifndef NANO_TINY
|
||||
add_to_funcs(do_suspend, MMAIN,
|
||||
N_("Suspend"), WITHORSANS(suspend_gist), TOGETHER, VIEW);
|
||||
#endif
|
||||
#ifdef ENABLE_HELP
|
||||
add_to_funcs(full_refresh, MMAIN,
|
||||
N_("Refresh"), WITHORSANS(refresh_gist), TOGETHER, VIEW);
|
||||
N_("Refresh"), WITHORSANS(refresh_gist), BLANKAFTER, VIEW);
|
||||
#endif
|
||||
|
||||
add_to_funcs(do_suspend_void, MMAIN,
|
||||
N_("Suspend"), WITHORSANS(suspend_gist), BLANKAFTER, VIEW);
|
||||
|
||||
#ifndef NANO_TINY
|
||||
add_to_funcs(do_indent, MMAIN,
|
||||
N_("Indent"), WITHORSANS(indent_gist), TOGETHER, NOVIEW);
|
||||
@@ -1111,9 +1083,9 @@ void shortcut_init(void)
|
||||
#endif
|
||||
|
||||
#ifndef NANO_TINY
|
||||
add_to_funcs(dos_format_void, MWRITEFILE,
|
||||
add_to_funcs(dos_format, MWRITEFILE,
|
||||
N_("DOS Format"), WITHORSANS(dos_gist), TOGETHER, NOVIEW);
|
||||
add_to_funcs(mac_format_void, MWRITEFILE,
|
||||
add_to_funcs(mac_format, MWRITEFILE,
|
||||
N_("Mac Format"), WITHORSANS(mac_gist), TOGETHER, NOVIEW);
|
||||
|
||||
/* If we're using restricted mode, the Append, Prepend, and Backup toggles
|
||||
@@ -1121,12 +1093,12 @@ void shortcut_init(void)
|
||||
* reduplicating the current file, and the third is not allowed as it
|
||||
* would write to a file not specified on the command line. */
|
||||
if (!ISSET(RESTRICTED)) {
|
||||
add_to_funcs(append_void, MWRITEFILE,
|
||||
add_to_funcs(append_it, MWRITEFILE,
|
||||
N_("Append"), WITHORSANS(append_gist), TOGETHER, NOVIEW);
|
||||
add_to_funcs(prepend_void, MWRITEFILE,
|
||||
add_to_funcs(prepend_it, MWRITEFILE,
|
||||
N_("Prepend"), WITHORSANS(prepend_gist), TOGETHER, NOVIEW);
|
||||
|
||||
add_to_funcs(backup_file_void, MWRITEFILE,
|
||||
add_to_funcs(back_it_up, MWRITEFILE,
|
||||
N_("Backup File"), WITHORSANS(backup_gist), BLANKAFTER, NOVIEW);
|
||||
}
|
||||
|
||||
@@ -1141,7 +1113,7 @@ void shortcut_init(void)
|
||||
add_to_funcs(cut_till_eof, MEXECUTE,
|
||||
N_("Cut Till End"), WITHORSANS(cuttilleof_gist), BLANKAFTER, NOVIEW);
|
||||
|
||||
add_to_funcs(do_suspend_void, MEXECUTE,
|
||||
add_to_funcs(do_suspend, MEXECUTE,
|
||||
N_("Suspend"), WITHORSANS(suspend_gist), BLANKAFTER, VIEW);
|
||||
}
|
||||
#endif /* !NANO_TINY */
|
||||
@@ -1206,9 +1178,9 @@ void shortcut_init(void)
|
||||
add_to_sclist(MMAIN|MBROWSER|MHELP, "^X", 0, do_exit, 0);
|
||||
if (!ISSET(PRESERVE))
|
||||
add_to_sclist(MMAIN, "^S", 0, do_savefile, 0);
|
||||
add_to_sclist(MMAIN, "^O", 0, do_writeout_void, 0);
|
||||
add_to_sclist(MMAIN, "^R", 0, do_insertfile_void, 0);
|
||||
add_to_sclist(MMAIN, "Ins", KEY_IC, do_insertfile_void, 0);
|
||||
add_to_sclist(MMAIN, "^O", 0, do_writeout, 0);
|
||||
add_to_sclist(MMAIN, "^R", 0, do_insertfile, 0);
|
||||
add_to_sclist(MMAIN, "Ins", KEY_IC, do_insertfile, 0);
|
||||
if (!ISSET(PRESERVE))
|
||||
add_to_sclist(MMAIN|MBROWSER|MHELP, "^Q", 0, do_search_backward, 0);
|
||||
add_to_sclist(MMAIN|MBROWSER|MHELP, "^W", 0, do_search_forward, 0);
|
||||
@@ -1223,8 +1195,13 @@ void shortcut_init(void)
|
||||
add_to_sclist(MMAIN, "^J", '\n', do_justify, 0);
|
||||
#endif
|
||||
#ifdef ENABLE_SPELLER
|
||||
add_to_sclist(MEXECUTE, "^S", 0, do_spell, 0);
|
||||
#ifndef NANO_TINY
|
||||
if (!ISSET(PRESERVE))
|
||||
add_to_sclist(MEXECUTE, "^S", 0, do_spell, 0);
|
||||
add_to_sclist(MEXECUTE, "^T", 0, do_spell, 0);
|
||||
#else
|
||||
add_to_sclist(MMAIN, "^T", 0, do_spell, 0);
|
||||
#endif
|
||||
#endif
|
||||
#ifdef ENABLE_COLOR
|
||||
add_to_sclist(MMAIN, "M-B", 0, do_linter, 0);
|
||||
@@ -1233,9 +1210,9 @@ void shortcut_init(void)
|
||||
add_to_sclist(MEXECUTE, "^O", 0, do_formatter, 0);
|
||||
#endif
|
||||
add_to_sclist(MMAIN, "^C", 0, report_cursor_position, 0);
|
||||
add_to_sclist(MMAIN, SLASH_OR_DASH, 0, do_gotolinecolumn_void, 0);
|
||||
add_to_sclist(MMAIN, "M-G", 0, do_gotolinecolumn_void, 0);
|
||||
add_to_sclist(MMAIN, "^_", 0, do_gotolinecolumn_void, 0);
|
||||
add_to_sclist(MMAIN, SLASH_OR_DASH, 0, do_gotolinecolumn, 0);
|
||||
add_to_sclist(MMAIN, "M-G", 0, do_gotolinecolumn, 0);
|
||||
add_to_sclist(MMAIN, "^_", 0, do_gotolinecolumn, 0);
|
||||
add_to_sclist(MMAIN|MBROWSER|MHELP|MLINTER, "^Y", 0, do_page_up, 0);
|
||||
add_to_sclist(MMAIN|MBROWSER|MHELP|MLINTER, "PgUp", KEY_PPAGE, do_page_up, 0);
|
||||
add_to_sclist(MMAIN|MBROWSER|MHELP|MLINTER, "^V", 0, do_page_down, 0);
|
||||
@@ -1250,9 +1227,13 @@ void shortcut_init(void)
|
||||
add_to_sclist(MMAIN|MBROWSER|MHELP, "M-W", 0, do_findnext, 0);
|
||||
add_to_sclist(MMAIN|MBROWSER|MHELP, "M-Q", 0, do_findprevious, 0);
|
||||
#ifdef NANO_TINY
|
||||
#ifdef ENABLE_LINENUMBERS
|
||||
add_to_sclist(MMAIN, "M-N", 0, toggle_numbers, 0);
|
||||
#else
|
||||
add_to_sclist(MMAIN, "M-B", 0, to_prev_word, 0);
|
||||
add_to_sclist(MMAIN, "M-D", 0, to_prev_word, 0);
|
||||
add_to_sclist(MMAIN, "M-N", 0, to_next_word, 0);
|
||||
#endif
|
||||
add_to_sclist(MMAIN, "M-D", 0, to_prev_word, 0);
|
||||
add_to_sclist(MMAIN, "M-F", 0, to_next_word, 0);
|
||||
#else
|
||||
add_to_sclist(MMAIN, "M-]", 0, do_find_bracket, 0);
|
||||
@@ -1369,7 +1350,9 @@ void shortcut_init(void)
|
||||
#ifndef NANO_TINY
|
||||
add_to_sclist(MMAIN, "M-T", 0, cut_till_eof, 0);
|
||||
add_to_sclist(MEXECUTE, "^V", 0, cut_till_eof, 0);
|
||||
add_to_sclist(MMAIN, "M-D", 0, do_wordlinechar_count, 0);
|
||||
add_to_sclist(MEXECUTE, "^Z", 0, do_suspend, 0);
|
||||
add_to_sclist(MMAIN, "^Z", 0, suggest_ctrlT_ctrlZ, 0);
|
||||
add_to_sclist(MMAIN, "M-D", 0, count_lines_words_and_characters, 0);
|
||||
#else
|
||||
add_to_sclist(MMAIN, "M-H", 0, do_help, 0);
|
||||
#endif
|
||||
@@ -1384,37 +1367,34 @@ void shortcut_init(void)
|
||||
add_to_sclist(MMOST|MBROWSER|MHELP|MYESNO, "^L", 0, full_refresh, 0);
|
||||
else
|
||||
add_to_sclist(MMOST|MBROWSER|MYESNO, "^L", 0, full_refresh, 0);
|
||||
add_to_sclist(MMAIN|MEXECUTE, "^Z", 0, do_suspend_void, 0);
|
||||
|
||||
#ifndef NANO_TINY
|
||||
/* Group of "Appearance" toggles. */
|
||||
add_to_sclist((MMOST|MBROWSER|MYESNO) & ~MFINDINHELP, "M-X", 0, do_toggle_void, NO_HELP);
|
||||
add_to_sclist(MMAIN, "M-C", 0, do_toggle_void, CONSTANT_SHOW);
|
||||
add_to_sclist(MMAIN, "M-S", 0, do_toggle_void, SOFTWRAP);
|
||||
add_to_sclist(MMAIN, "M-$", 0, do_toggle_void, SOFTWRAP);
|
||||
add_to_sclist(MMAIN, "M-Z", 0, do_toggle, ZERO);
|
||||
add_to_sclist((MMOST|MBROWSER|MYESNO) & ~MFINDINHELP, "M-X", 0, do_toggle, NO_HELP);
|
||||
add_to_sclist(MMAIN, "M-C", 0, do_toggle, CONSTANT_SHOW);
|
||||
add_to_sclist(MMAIN, "M-S", 0, do_toggle, SOFTWRAP);
|
||||
add_to_sclist(MMAIN, "M-$", 0, do_toggle, SOFTWRAP); /* Legacy keystroke. */
|
||||
#ifdef ENABLE_LINENUMBERS
|
||||
add_to_sclist(MMAIN, "M-N", 0, do_toggle_void, LINE_NUMBERS);
|
||||
add_to_sclist(MMAIN, "M-#", 0, do_toggle_void, LINE_NUMBERS);
|
||||
add_to_sclist(MMAIN, "M-N", 0, do_toggle, LINE_NUMBERS);
|
||||
add_to_sclist(MMAIN, "M-#", 0, do_toggle, LINE_NUMBERS); /* Legacy keystroke. */
|
||||
#endif
|
||||
add_to_sclist(MMAIN, "M-P", 0, do_toggle_void, WHITESPACE_DISPLAY);
|
||||
add_to_sclist(MMAIN, "M-P", 0, do_toggle, WHITESPACE_DISPLAY);
|
||||
#ifdef ENABLE_COLOR
|
||||
add_to_sclist(MMAIN, "M-Y", 0, do_toggle_void, NO_SYNTAX);
|
||||
add_to_sclist(MMAIN, "M-Y", 0, do_toggle, NO_SYNTAX);
|
||||
#endif
|
||||
|
||||
/* Group of "Editing-behavior" toggles. */
|
||||
add_to_sclist(MMAIN, "M-H", 0, do_toggle_void, SMART_HOME);
|
||||
add_to_sclist(MMAIN, "M-I", 0, do_toggle_void, AUTOINDENT);
|
||||
add_to_sclist(MMAIN, "M-K", 0, do_toggle_void, CUT_FROM_CURSOR);
|
||||
/* Group of "Behavior" toggles. */
|
||||
add_to_sclist(MMAIN, "M-H", 0, do_toggle, SMART_HOME);
|
||||
add_to_sclist(MMAIN, "M-I", 0, do_toggle, AUTOINDENT);
|
||||
add_to_sclist(MMAIN, "M-K", 0, do_toggle, CUT_FROM_CURSOR);
|
||||
#ifdef ENABLE_WRAPPING
|
||||
add_to_sclist(MMAIN, "M-L", 0, do_toggle_void, BREAK_LONG_LINES);
|
||||
add_to_sclist(MMAIN, "M-L", 0, do_toggle, BREAK_LONG_LINES);
|
||||
#endif
|
||||
add_to_sclist(MMAIN, "M-O", 0, do_toggle_void, TABS_TO_SPACES);
|
||||
|
||||
/* Group of "Peripheral-feature" toggles. */
|
||||
add_to_sclist(MMAIN, "M-O", 0, do_toggle, TABS_TO_SPACES);
|
||||
#ifdef ENABLE_MOUSE
|
||||
add_to_sclist(MMAIN, "M-M", 0, do_toggle_void, USE_MOUSE);
|
||||
add_to_sclist(MMAIN, "M-M", 0, do_toggle, USE_MOUSE);
|
||||
#endif
|
||||
add_to_sclist(MMAIN, "M-Z", 0, do_toggle_void, SUSPENDABLE);
|
||||
#endif /* !NANO_TINY */
|
||||
|
||||
add_to_sclist(((MMOST & ~MMAIN) | MYESNO), "^C", 0, do_cancel, 0);
|
||||
@@ -1425,17 +1405,17 @@ void shortcut_init(void)
|
||||
add_to_sclist(MWHEREIS|MREPLACE, "^R", 0, flip_replace, 0);
|
||||
add_to_sclist(MWHEREIS|MGOTOLINE, "^T", 0, flip_goto, 0);
|
||||
#ifdef ENABLE_HISTORIES
|
||||
add_to_sclist(MWHEREIS|MREPLACE|MREPLACEWITH|MWHEREISFILE|MFINDINHELP|MEXECUTE, "^P", 0, get_history_older_void, 0);
|
||||
add_to_sclist(MWHEREIS|MREPLACE|MREPLACEWITH|MWHEREISFILE|MFINDINHELP|MEXECUTE, "^N", 0, get_history_newer_void, 0);
|
||||
add_to_sclist(MWHEREIS|MREPLACE|MREPLACEWITH|MWHEREISFILE|MFINDINHELP|MEXECUTE, "^P", 0, get_older_item, 0);
|
||||
add_to_sclist(MWHEREIS|MREPLACE|MREPLACEWITH|MWHEREISFILE|MFINDINHELP|MEXECUTE, "^N", 0, get_newer_item, 0);
|
||||
#ifdef ENABLE_UTF8
|
||||
if (using_utf8()) {
|
||||
add_to_sclist(MWHEREIS|MREPLACE|MREPLACEWITH|MWHEREISFILE|MFINDINHELP|MEXECUTE, "\xE2\x96\xb4", KEY_UP, get_history_older_void, 0);
|
||||
add_to_sclist(MWHEREIS|MREPLACE|MREPLACEWITH|MWHEREISFILE|MFINDINHELP|MEXECUTE, "\xE2\x96\xbe", KEY_DOWN, get_history_newer_void, 0);
|
||||
add_to_sclist(MWHEREIS|MREPLACE|MREPLACEWITH|MWHEREISFILE|MFINDINHELP|MEXECUTE, "\xE2\x96\xb4", KEY_UP, get_older_item, 0);
|
||||
add_to_sclist(MWHEREIS|MREPLACE|MREPLACEWITH|MWHEREISFILE|MFINDINHELP|MEXECUTE, "\xE2\x96\xbe", KEY_DOWN, get_newer_item, 0);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
add_to_sclist(MWHEREIS|MREPLACE|MREPLACEWITH|MWHEREISFILE|MFINDINHELP|MEXECUTE, "Up", KEY_UP, get_history_older_void, 0);
|
||||
add_to_sclist(MWHEREIS|MREPLACE|MREPLACEWITH|MWHEREISFILE|MFINDINHELP|MEXECUTE, "Down", KEY_DOWN, get_history_newer_void, 0);
|
||||
add_to_sclist(MWHEREIS|MREPLACE|MREPLACEWITH|MWHEREISFILE|MFINDINHELP|MEXECUTE, "Up", KEY_UP, get_older_item, 0);
|
||||
add_to_sclist(MWHEREIS|MREPLACE|MREPLACEWITH|MWHEREISFILE|MFINDINHELP|MEXECUTE, "Down", KEY_DOWN, get_newer_item, 0);
|
||||
}
|
||||
#endif
|
||||
#ifdef ENABLE_JUSTIFY
|
||||
@@ -1461,14 +1441,14 @@ void shortcut_init(void)
|
||||
if (ISSET(SAVE_ON_EXIT) && !ISSET(PRESERVE))
|
||||
add_to_sclist(MWRITEFILE, "^Q", 0, discard_buffer, 0);
|
||||
#ifndef NANO_TINY
|
||||
add_to_sclist(MWRITEFILE, "M-D", 0, dos_format_void, 0);
|
||||
add_to_sclist(MWRITEFILE, "M-M", 0, mac_format_void, 0);
|
||||
add_to_sclist(MWRITEFILE, "M-D", 0, dos_format, 0);
|
||||
add_to_sclist(MWRITEFILE, "M-M", 0, mac_format, 0);
|
||||
/* Only when not in restricted mode, allow Appending, Prepending,
|
||||
* making backups, and executing a command. */
|
||||
if (!ISSET(RESTRICTED) && !ISSET(VIEW_MODE)) {
|
||||
add_to_sclist(MWRITEFILE, "M-A", 0, append_void, 0);
|
||||
add_to_sclist(MWRITEFILE, "M-P", 0, prepend_void, 0);
|
||||
add_to_sclist(MWRITEFILE, "M-B", 0, backup_file_void, 0);
|
||||
add_to_sclist(MWRITEFILE, "M-A", 0, append_it, 0);
|
||||
add_to_sclist(MWRITEFILE, "M-P", 0, prepend_it, 0);
|
||||
add_to_sclist(MWRITEFILE, "M-B", 0, back_it_up, 0);
|
||||
add_to_sclist(MINSERTFILE|MEXECUTE, "^X", 0, flip_execute, 0);
|
||||
}
|
||||
add_to_sclist(MINSERTFILE, "M-N", 0, flip_convert, 0);
|
||||
@@ -1504,11 +1484,11 @@ void shortcut_init(void)
|
||||
#endif
|
||||
add_to_sclist(MMOST & ~MFINDINHELP, "F1", KEY_F(1), do_help, 0);
|
||||
add_to_sclist(MMAIN|MBROWSER|MHELP, "F2", KEY_F(2), do_exit, 0);
|
||||
add_to_sclist(MMAIN, "F3", KEY_F(3), do_writeout_void, 0);
|
||||
add_to_sclist(MMAIN, "F3", KEY_F(3), do_writeout, 0);
|
||||
#ifdef ENABLE_JUSTIFY
|
||||
add_to_sclist(MMAIN, "F4", KEY_F(4), do_justify, 0);
|
||||
#endif
|
||||
add_to_sclist(MMAIN, "F5", KEY_F(5), do_insertfile_void, 0);
|
||||
add_to_sclist(MMAIN, "F5", KEY_F(5), do_insertfile, 0);
|
||||
add_to_sclist(MMAIN|MBROWSER|MHELP, "F6", KEY_F(6), do_search_forward, 0);
|
||||
add_to_sclist(MMAIN|MBROWSER|MHELP|MLINTER, "F7", KEY_F(7), do_page_up, 0);
|
||||
add_to_sclist(MMAIN|MBROWSER|MHELP|MLINTER, "F8", KEY_F(8), do_page_down, 0);
|
||||
@@ -1518,30 +1498,33 @@ void shortcut_init(void)
|
||||
#ifdef ENABLE_SPELLER
|
||||
add_to_sclist(MMAIN, "F12", KEY_F(12), do_spell, 0);
|
||||
#endif
|
||||
#if defined(KEY_CANCEL) && defined(KEY_SUSPEND) && defined(KEY_SIC)
|
||||
add_to_sclist((MMOST & ~MMAIN) | MYESNO, "", KEY_CANCEL, do_cancel, 0);
|
||||
add_to_sclist(MMAIN|MEXECUTE, "", KEY_SUSPEND, do_suspend_void, 0);
|
||||
add_to_sclist(MMAIN, "", KEY_SIC, do_insertfile_void, 0);
|
||||
#endif
|
||||
#ifndef NANO_TINY
|
||||
add_to_sclist((MMOST & ~MMAIN) | MYESNO, "", KEY_CANCEL, do_cancel, 0);
|
||||
add_to_sclist(MMAIN, "", KEY_SIC, do_insertfile, 0);
|
||||
/* Catch and ignore bracketed paste marker keys. */
|
||||
add_to_sclist(MMOST|MBROWSER|MHELP|MYESNO, "", BRACKETED_PASTE_MARKER, do_nothing, 0);
|
||||
#else
|
||||
add_to_sclist(MMOST|MBROWSER|MHELP|MYESNO, "", KEY_FRESH, full_refresh, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef NANO_TINY
|
||||
/* Return the textual description that corresponds to the given flag. */
|
||||
const char *flagtostr(int flag)
|
||||
const char *epithet_of_flag(int flag)
|
||||
{
|
||||
switch (flag) {
|
||||
case NO_HELP:
|
||||
case ZERO:
|
||||
/* TRANSLATORS: The next thirteen strings are toggle descriptions;
|
||||
* they are best kept shorter than 40 characters, but may be longer. */
|
||||
return N_("Hidden interface");
|
||||
case NO_HELP:
|
||||
return N_("Help mode");
|
||||
case CONSTANT_SHOW:
|
||||
return N_("Constant cursor position display");
|
||||
case SOFTWRAP:
|
||||
return N_("Soft wrapping of overlong lines");
|
||||
case LINE_NUMBERS:
|
||||
return N_("Line numbering");
|
||||
case WHITESPACE_DISPLAY:
|
||||
return N_("Whitespace display");
|
||||
case NO_SYNTAX:
|
||||
@@ -1558,13 +1541,8 @@ const char *flagtostr(int flag)
|
||||
return N_("Conversion of typed tabs to spaces");
|
||||
case USE_MOUSE:
|
||||
return N_("Mouse support");
|
||||
case SUSPENDABLE:
|
||||
return N_("Suspension");
|
||||
case LINE_NUMBERS:
|
||||
return N_("Line numbering");
|
||||
default:
|
||||
die("Bad toggle -- please report a bug\n");
|
||||
return "";
|
||||
return "Ehm...";
|
||||
}
|
||||
}
|
||||
#endif /* !NANO_TINY */
|
||||
|
||||
31
src/help.c
31
src/help.c
@@ -234,8 +234,8 @@ void help_init(void)
|
||||
size_t onoff_len = strlen(_("enable/disable"));
|
||||
|
||||
for (s = sclist; s != NULL; s = s->next)
|
||||
if (s->func == do_toggle_void)
|
||||
allocsize += strlen(_(flagtostr(s->toggle))) + onoff_len + 9;
|
||||
if (s->func == do_toggle)
|
||||
allocsize += strlen(_(epithet_of_flag(s->toggle))) + onoff_len + 9;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -303,8 +303,9 @@ void help_init(void)
|
||||
for (s = sclist; s != NULL; s = s->next)
|
||||
if (s->toggle && s->ordinal == counter) {
|
||||
ptr += sprintf(ptr, "%s\t\t %s %s\n", (s->menus & MMAIN ? s->keystr : ""),
|
||||
_(flagtostr(s->toggle)), _("enable/disable"));
|
||||
if (s->toggle == NO_SYNTAX || s->toggle == TABS_TO_SPACES)
|
||||
_(epithet_of_flag(s->toggle)), _("enable/disable"));
|
||||
/* Add a blank like between two groups. */
|
||||
if (s->toggle == NO_SYNTAX)
|
||||
ptr += sprintf(ptr, "\n");
|
||||
break;
|
||||
}
|
||||
@@ -323,6 +324,13 @@ void wrap_help_text_into_buffer(void)
|
||||
|
||||
make_new_buffer();
|
||||
|
||||
/* Ensure there is a blank line at the top of the text, for esthetics. */
|
||||
if ((ISSET(MINIBAR) || !ISSET(EMPTY_LINE)) && LINES > 6) {
|
||||
openfile->current->data = mallocstrcpy(openfile->current->data, " ");
|
||||
openfile->current->next = make_new_node(openfile->current);
|
||||
openfile->current = openfile->current->next;
|
||||
}
|
||||
|
||||
/* Copy the help text into the just-created new buffer. */
|
||||
while (*ptr != '\0') {
|
||||
int length, shim;
|
||||
@@ -403,8 +411,9 @@ void show_help(void)
|
||||
memcpy(stash, flags, sizeof(flags));
|
||||
|
||||
/* Ensure that the help screen's shortcut list can be displayed. */
|
||||
if (ISSET(NO_HELP) && LINES > 4) {
|
||||
if (ISSET(NO_HELP) || ISSET(ZERO)) {
|
||||
UNSET(NO_HELP);
|
||||
UNSET(ZERO);
|
||||
window_init();
|
||||
} else
|
||||
blank_statusbar();
|
||||
@@ -415,10 +424,8 @@ void show_help(void)
|
||||
UNSET(USE_REGEXP);
|
||||
|
||||
UNSET(WHITESPACE_DISPLAY);
|
||||
UNSET(NOREAD_MODE);
|
||||
|
||||
#ifdef ENABLE_LINENUMBERS
|
||||
UNSET(LINE_NUMBERS);
|
||||
editwincols = COLS - thebar;
|
||||
margin = 0;
|
||||
#endif
|
||||
@@ -462,7 +469,6 @@ void show_help(void)
|
||||
|
||||
#ifndef NANO_TINY
|
||||
spotlighted = FALSE;
|
||||
hide_cursor = FALSE;
|
||||
|
||||
if (bracketed_paste || kbinput == BRACKETED_PASTE_MARKER) {
|
||||
beep();
|
||||
@@ -543,13 +549,12 @@ void show_help(void)
|
||||
|
||||
curs_set(0);
|
||||
|
||||
if (ISSET(NO_HELP)) {
|
||||
currmenu = oldmenu;
|
||||
if (ISSET(NO_HELP) || ISSET(ZERO))
|
||||
window_init();
|
||||
} else {
|
||||
else
|
||||
blank_statusbar();
|
||||
bottombars(oldmenu);
|
||||
}
|
||||
|
||||
bottombars(oldmenu);
|
||||
|
||||
#ifdef ENABLE_BROWSER
|
||||
if (oldmenu & (MBROWSER|MWHEREISFILE|MGOTODIR))
|
||||
|
||||
220
src/history.c
220
src/history.c
@@ -63,21 +63,21 @@ void history_init(void)
|
||||
executebot = execute_history;
|
||||
}
|
||||
|
||||
/* Set the current position in the given history list to the bottom. */
|
||||
void history_reset(const linestruct *list)
|
||||
/* Reset the pointer into the history list that contains item to the bottom. */
|
||||
void reset_history_pointer_for(const linestruct *item)
|
||||
{
|
||||
if (list == search_history)
|
||||
if (item == search_history)
|
||||
search_history = searchbot;
|
||||
else if (list == replace_history)
|
||||
else if (item == replace_history)
|
||||
replace_history = replacebot;
|
||||
else if (list == execute_history)
|
||||
else if (item == execute_history)
|
||||
execute_history = executebot;
|
||||
}
|
||||
|
||||
/* Return from the history list that starts at start and ends at end
|
||||
* the first node that contains the first len characters of the given
|
||||
* text, or NULL if there is no such node. */
|
||||
linestruct *find_history(const linestruct *start, const linestruct *end,
|
||||
linestruct *find_in_history(const linestruct *start, const linestruct *end,
|
||||
const char *text, size_t len)
|
||||
{
|
||||
const linestruct *item;
|
||||
@@ -92,9 +92,10 @@ linestruct *find_history(const linestruct *start, const linestruct *end,
|
||||
|
||||
/* Update a history list (the one in which item is the current position)
|
||||
* with a fresh string text. That is: add text, or move it to the end. */
|
||||
void update_history(linestruct **item, const char *text)
|
||||
void update_history(linestruct **item, const char *text, bool avoid_duplicates)
|
||||
{
|
||||
linestruct **htop = NULL, **hbot = NULL, *thesame;
|
||||
linestruct **htop = NULL, **hbot = NULL;
|
||||
linestruct *thesame = NULL;
|
||||
|
||||
if (*item == search_history) {
|
||||
htop = &searchtop;
|
||||
@@ -107,11 +108,12 @@ void update_history(linestruct **item, const char *text)
|
||||
hbot = &executebot;
|
||||
}
|
||||
|
||||
/* See if the string is already in the history. */
|
||||
thesame = find_history(*hbot, *htop, text, HIGHEST_POSITIVE);
|
||||
/* When requested, check if the string is already in the history. */
|
||||
if (avoid_duplicates)
|
||||
thesame = find_in_history(*hbot, *htop, text, HIGHEST_POSITIVE);
|
||||
|
||||
/* If an identical string was found, delete that item. */
|
||||
if (thesame != NULL) {
|
||||
if (thesame) {
|
||||
linestruct *after = thesame->next;
|
||||
|
||||
/* If the string is at the head of the list, move the head. */
|
||||
@@ -145,98 +147,67 @@ void update_history(linestruct **item, const char *text)
|
||||
*item = *hbot;
|
||||
}
|
||||
|
||||
/* Move h to the string in the history list just before it, and return
|
||||
* that string. If there isn't one, don't move h and return NULL. */
|
||||
char *get_history_older(linestruct **h)
|
||||
{
|
||||
if ((*h)->prev == NULL)
|
||||
return NULL;
|
||||
|
||||
*h = (*h)->prev;
|
||||
|
||||
return (*h)->data;
|
||||
}
|
||||
|
||||
/* Move h to the string in the history list just after it, and return
|
||||
* that string. If there isn't one, don't move h and return NULL. */
|
||||
char *get_history_newer(linestruct **h)
|
||||
{
|
||||
if ((*h)->next == NULL)
|
||||
return NULL;
|
||||
|
||||
*h = (*h)->next;
|
||||
|
||||
return (*h)->data;
|
||||
}
|
||||
|
||||
/* Two empty placeholder functions. */
|
||||
void get_history_older_void(void)
|
||||
{
|
||||
}
|
||||
void get_history_newer_void(void)
|
||||
{
|
||||
}
|
||||
|
||||
#ifdef ENABLE_TABCOMP
|
||||
/* Go backward through one of three history lists, starting at its item h,
|
||||
* searching for a string that is a tab completion of the given string s,
|
||||
* looking at only the first len characters of s. When found, make h point
|
||||
* at it and return that string; otherwise, don't move h and return s. */
|
||||
char *get_history_completion(linestruct **h, char *s, size_t len)
|
||||
/* Go backward through one of three history lists, starting at item *here,
|
||||
* searching for a string that is a tab completion of the given string,
|
||||
* looking at only its first len characters. When found, make *here point
|
||||
* at the item and return its string; otherwise, just return the string. */
|
||||
char *get_history_completion(linestruct **here, char *string, size_t len)
|
||||
{
|
||||
linestruct *htop = NULL, *hbot = NULL, *p;
|
||||
linestruct *htop = NULL, *hbot = NULL;
|
||||
linestruct *item;
|
||||
|
||||
if (*h == search_history) {
|
||||
if (*here == search_history) {
|
||||
htop = searchtop;
|
||||
hbot = searchbot;
|
||||
} else if (*h == replace_history) {
|
||||
} else if (*here == replace_history) {
|
||||
htop = replacetop;
|
||||
hbot = replacebot;
|
||||
} else if (*h == execute_history) {
|
||||
} else if (*here == execute_history) {
|
||||
htop = executetop;
|
||||
hbot = executebot;
|
||||
}
|
||||
|
||||
/* First search from the current position to the top of the list
|
||||
* for a match of len characters. Skip over an exact match. */
|
||||
p = find_history((*h)->prev, htop, s, len);
|
||||
item = find_in_history((*here)->prev, htop, string, len);
|
||||
|
||||
while (p != NULL && strcmp(p->data, s) == 0)
|
||||
p = find_history(p->prev, htop, s, len);
|
||||
while (item != NULL && strcmp(item->data, string) == 0)
|
||||
item = find_in_history(item->prev, htop, string, len);
|
||||
|
||||
if (p != NULL) {
|
||||
*h = p;
|
||||
return mallocstrcpy(s, (*h)->data);
|
||||
if (item) {
|
||||
*here = item;
|
||||
return mallocstrcpy(string, item->data);
|
||||
}
|
||||
|
||||
/* Now search from the bottom of the list to the original position. */
|
||||
p = find_history(hbot, *h, s, len);
|
||||
item = find_in_history(hbot, *here, string, len);
|
||||
|
||||
while (p != NULL && strcmp(p->data, s) == 0)
|
||||
p = find_history(p->prev, *h, s, len);
|
||||
while (item != NULL && strcmp(item->data, string) == 0)
|
||||
item = find_in_history(item->prev, *here, string, len);
|
||||
|
||||
if (p != NULL) {
|
||||
*h = p;
|
||||
return mallocstrcpy(s, (*h)->data);
|
||||
if (item) {
|
||||
*here = item;
|
||||
return mallocstrcpy(string, item->data);
|
||||
}
|
||||
|
||||
/* When no useful match was found, simply return the given string. */
|
||||
return (char *)s;
|
||||
return (char *)string;
|
||||
}
|
||||
#endif /* ENABLE_TABCOMP */
|
||||
|
||||
/* Check whether we have or could make a directory for history files. */
|
||||
bool have_statedir(void)
|
||||
{
|
||||
struct stat dirstat;
|
||||
const char *xdgdatadir;
|
||||
struct stat dirinfo;
|
||||
|
||||
get_homedir();
|
||||
|
||||
if (homedir != NULL) {
|
||||
statedir = concatenate(homedir, "/.nano/");
|
||||
|
||||
if (stat(statedir, &dirstat) == 0 && S_ISDIR(dirstat.st_mode)) {
|
||||
if (stat(statedir, &dirinfo) == 0 && S_ISDIR(dirinfo.st_mode)) {
|
||||
poshistname = concatenate(statedir, POSITION_HISTORY);
|
||||
return TRUE;
|
||||
}
|
||||
@@ -253,7 +224,7 @@ bool have_statedir(void)
|
||||
else
|
||||
statedir = concatenate(homedir, "/.local/share/nano/");
|
||||
|
||||
if (stat(statedir, &dirstat) == -1) {
|
||||
if (stat(statedir, &dirinfo) == -1) {
|
||||
if (xdgdatadir == NULL) {
|
||||
char *statepath = concatenate(homedir, "/.local");
|
||||
mkdir(statepath, S_IRWXU | S_IRWXG | S_IRWXO);
|
||||
@@ -269,7 +240,7 @@ bool have_statedir(void)
|
||||
statedir, strerror(errno));
|
||||
return FALSE;
|
||||
}
|
||||
} else if (!S_ISDIR(dirstat.st_mode)) {
|
||||
} else if (!S_ISDIR(dirinfo.st_mode)) {
|
||||
jot_error(N_("Path %s is not a directory and needs to be.\n"
|
||||
"Nano will be unable to load or save "
|
||||
"search history or cursor positions.\n"),
|
||||
@@ -309,7 +280,7 @@ void load_history(void)
|
||||
stanza[--read] = '\0';
|
||||
if (read > 0) {
|
||||
recode_NUL_to_LF(stanza, read);
|
||||
update_history(history, stanza);
|
||||
update_history(history, stanza, IGNORE_DUPLICATES);
|
||||
} else if (history == &search_history)
|
||||
history = &replace_history;
|
||||
else
|
||||
@@ -394,12 +365,14 @@ void load_poshistory(void)
|
||||
if (histfile == NULL)
|
||||
return;
|
||||
|
||||
ssize_t read, count = 0;
|
||||
struct stat fileinfo;
|
||||
poshiststruct *record_ptr = NULL, *newrecord;
|
||||
poshiststruct *lastitem = NULL;
|
||||
poshiststruct *newitem;
|
||||
char *lineptr, *columnptr;
|
||||
char *stanza = NULL;
|
||||
struct stat fileinfo;
|
||||
size_t dummy = 0;
|
||||
ssize_t count = 0;
|
||||
ssize_t read;
|
||||
|
||||
/* Read and parse each line, and store the extracted data. */
|
||||
while ((read = getline(&stanza, &dummy, histfile)) > 5) {
|
||||
@@ -419,19 +392,19 @@ void load_poshistory(void)
|
||||
*(lineptr++) = '\0';
|
||||
|
||||
/* Create a new position record. */
|
||||
newrecord = nmalloc(sizeof(poshiststruct));
|
||||
newrecord->filename = copy_of(stanza);
|
||||
newrecord->linenumber = atoi(lineptr);
|
||||
newrecord->columnnumber = atoi(columnptr);
|
||||
newrecord->next = NULL;
|
||||
newitem = nmalloc(sizeof(poshiststruct));
|
||||
newitem->filename = copy_of(stanza);
|
||||
newitem->linenumber = atoi(lineptr);
|
||||
newitem->columnnumber = atoi(columnptr);
|
||||
newitem->next = NULL;
|
||||
|
||||
/* Add the record to the list. */
|
||||
if (position_history == NULL)
|
||||
position_history = newrecord;
|
||||
position_history = newitem;
|
||||
else
|
||||
record_ptr->next = newrecord;
|
||||
lastitem->next = newitem;
|
||||
|
||||
record_ptr = newrecord;
|
||||
lastitem = newitem;
|
||||
|
||||
/* Impose a limit, so the file will not grow indefinitely. */
|
||||
if (++count > 200) {
|
||||
@@ -456,9 +429,9 @@ void load_poshistory(void)
|
||||
/* Save the recorded cursor positions for files that were edited. */
|
||||
void save_poshistory(void)
|
||||
{
|
||||
poshiststruct *posptr;
|
||||
struct stat fileinfo;
|
||||
FILE *histfile = fopen(poshistname, "wb");
|
||||
struct stat fileinfo;
|
||||
poshiststruct *item;
|
||||
|
||||
if (histfile == NULL) {
|
||||
jot_error(N_("Error writing %s: %s"), poshistname, strerror(errno));
|
||||
@@ -469,15 +442,15 @@ void save_poshistory(void)
|
||||
if (chmod(poshistname, S_IRUSR | S_IWUSR) < 0)
|
||||
jot_error(N_("Cannot limit permissions on %s: %s"), poshistname, strerror(errno));
|
||||
|
||||
for (posptr = position_history; posptr != NULL; posptr = posptr->next) {
|
||||
for (item = position_history; item != NULL; item = item->next) {
|
||||
char *path_and_place;
|
||||
size_t length;
|
||||
|
||||
/* Assume 20 decimal positions each for line and column number,
|
||||
* plus two spaces, plus the line feed, plus the null byte. */
|
||||
path_and_place = nmalloc(strlen(posptr->filename) + 44);
|
||||
path_and_place = nmalloc(strlen(item->filename) + 44);
|
||||
sprintf(path_and_place, "%s %zd %zd\n",
|
||||
posptr->filename, posptr->linenumber, posptr->columnnumber);
|
||||
item->filename, item->linenumber, item->columnnumber);
|
||||
length = strlen(path_and_place);
|
||||
|
||||
/* Encode newlines in filenames as NULs. */
|
||||
@@ -501,29 +474,30 @@ void save_poshistory(void)
|
||||
/* Reload the position history file if it has been modified since last load. */
|
||||
void reload_positions_if_needed(void)
|
||||
{
|
||||
poshiststruct *item, *nextone;
|
||||
struct stat fileinfo;
|
||||
|
||||
if (stat(poshistname, &fileinfo) == 0 && fileinfo.st_mtime != latest_timestamp) {
|
||||
poshiststruct *item, *nextone;
|
||||
if (stat(poshistname, &fileinfo) != 0 || fileinfo.st_mtime == latest_timestamp)
|
||||
return;
|
||||
|
||||
for (item = position_history; item != NULL; item = nextone) {
|
||||
nextone = item->next;
|
||||
free(item->filename);
|
||||
free(item);
|
||||
}
|
||||
|
||||
position_history = NULL;
|
||||
|
||||
load_poshistory();
|
||||
for (item = position_history; item != NULL; item = nextone) {
|
||||
nextone = item->next;
|
||||
free(item->filename);
|
||||
free(item);
|
||||
}
|
||||
|
||||
position_history = NULL;
|
||||
|
||||
load_poshistory();
|
||||
}
|
||||
|
||||
/* Update the recorded last file positions with the current position in the
|
||||
* current buffer. If no existing entry is found, add a new one at the end. */
|
||||
void update_poshistory(void)
|
||||
{
|
||||
poshiststruct *posptr, *theone, *posprev = NULL;
|
||||
char *fullpath = get_full_path(openfile->filename);
|
||||
poshiststruct *previous = NULL;
|
||||
poshiststruct *item, *theone;
|
||||
|
||||
if (fullpath == NULL || openfile->filename[0] == '\0') {
|
||||
free(fullpath);
|
||||
@@ -533,28 +507,28 @@ void update_poshistory(void)
|
||||
reload_positions_if_needed();
|
||||
|
||||
/* Look for a matching filename in the list. */
|
||||
for (posptr = position_history; posptr != NULL; posptr = posptr->next) {
|
||||
if (!strcmp(posptr->filename, fullpath))
|
||||
for (item = position_history; item != NULL; item = item->next) {
|
||||
if (!strcmp(item->filename, fullpath))
|
||||
break;
|
||||
posprev = posptr;
|
||||
previous = item;
|
||||
}
|
||||
|
||||
/* Don't record files that have the default cursor position. */
|
||||
if (openfile->current->lineno == 1 && openfile->current_x == 0) {
|
||||
if (posptr != NULL) {
|
||||
if (posprev == NULL)
|
||||
position_history = posptr->next;
|
||||
if (item != NULL) {
|
||||
if (previous == NULL)
|
||||
position_history = item->next;
|
||||
else
|
||||
posprev->next = posptr->next;
|
||||
free(posptr->filename);
|
||||
free(posptr);
|
||||
previous->next = item->next;
|
||||
free(item->filename);
|
||||
free(item);
|
||||
save_poshistory();
|
||||
}
|
||||
free(fullpath);
|
||||
return;
|
||||
}
|
||||
|
||||
theone = posptr;
|
||||
theone = item;
|
||||
|
||||
/* If we didn't find it, make a new node; otherwise, if we're
|
||||
* not at the end, move the matching one to the end. */
|
||||
@@ -564,15 +538,15 @@ void update_poshistory(void)
|
||||
if (position_history == NULL)
|
||||
position_history = theone;
|
||||
else
|
||||
posprev->next = theone;
|
||||
} else if (posptr->next != NULL) {
|
||||
if (posprev == NULL)
|
||||
position_history = posptr->next;
|
||||
previous->next = theone;
|
||||
} else if (item->next != NULL) {
|
||||
if (previous == NULL)
|
||||
position_history = item->next;
|
||||
else
|
||||
posprev->next = posptr->next;
|
||||
while (posptr->next != NULL)
|
||||
posptr = posptr->next;
|
||||
posptr->next = theone;
|
||||
previous->next = item->next;
|
||||
while (item->next != NULL)
|
||||
item = item->next;
|
||||
item->next = theone;
|
||||
}
|
||||
|
||||
/* Store the last cursor position. */
|
||||
@@ -590,25 +564,25 @@ void update_poshistory(void)
|
||||
* set line and column to the retrieved values. */
|
||||
bool has_old_position(const char *file, ssize_t *line, ssize_t *column)
|
||||
{
|
||||
poshiststruct *posptr;
|
||||
char *fullpath = get_full_path(file);
|
||||
poshiststruct *item;
|
||||
|
||||
if (fullpath == NULL)
|
||||
return FALSE;
|
||||
|
||||
reload_positions_if_needed();
|
||||
|
||||
posptr = position_history;
|
||||
while (posptr != NULL && strcmp(posptr->filename, fullpath) != 0)
|
||||
posptr = posptr->next;
|
||||
item = position_history;
|
||||
while (item != NULL && strcmp(item->filename, fullpath) != 0)
|
||||
item = item->next;
|
||||
|
||||
free(fullpath);
|
||||
|
||||
if (posptr == NULL)
|
||||
if (item == NULL)
|
||||
return FALSE;
|
||||
|
||||
*line = posptr->linenumber;
|
||||
*column = posptr->columnnumber;
|
||||
*line = item->linenumber;
|
||||
*column = item->columnnumber;
|
||||
return TRUE;
|
||||
}
|
||||
#endif /* ENABLE_HISTORIES */
|
||||
|
||||
30
src/move.c
30
src/move.c
@@ -265,10 +265,10 @@ void to_next_block(void)
|
||||
edit_redraw(was_current, CENTERING);
|
||||
}
|
||||
|
||||
/* Move to the previous word. If allow_punct is TRUE, treat punctuation
|
||||
* as part of a word. */
|
||||
void do_prev_word(bool allow_punct)
|
||||
/* Move to the previous word. */
|
||||
void do_prev_word(void)
|
||||
{
|
||||
bool punctuation_as_letters = ISSET(WORD_BOUNDS);
|
||||
bool seen_a_word = FALSE, step_forward = FALSE;
|
||||
|
||||
/* Move backward until we pass over the start of a word. */
|
||||
@@ -286,7 +286,7 @@ void do_prev_word(bool allow_punct)
|
||||
openfile->current_x);
|
||||
|
||||
if (is_word_char(openfile->current->data + openfile->current_x,
|
||||
allow_punct)) {
|
||||
punctuation_as_letters)) {
|
||||
seen_a_word = TRUE;
|
||||
/* If at the head of a line now, this surely is a word start. */
|
||||
if (openfile->current_x == 0)
|
||||
@@ -309,12 +309,12 @@ void do_prev_word(bool allow_punct)
|
||||
}
|
||||
|
||||
/* Move to the next word. If after_ends is TRUE, stop at the ends of words
|
||||
* instead of their beginnings. If allow_punct is TRUE, treat punctuation as
|
||||
* part of a word. Return TRUE if we started on a word, and FALSE otherwise. */
|
||||
bool do_next_word(bool after_ends, bool allow_punct)
|
||||
* instead of at their beginnings. Return TRUE if we started on a word. */
|
||||
bool do_next_word(bool after_ends)
|
||||
{
|
||||
bool punctuation_as_letters = ISSET(WORD_BOUNDS);
|
||||
bool started_on_word = is_word_char(openfile->current->data +
|
||||
openfile->current_x, allow_punct);
|
||||
openfile->current_x, punctuation_as_letters);
|
||||
bool seen_space = !started_on_word;
|
||||
#ifndef NANO_TINY
|
||||
bool seen_word = started_on_word;
|
||||
@@ -341,7 +341,7 @@ bool do_next_word(bool after_ends, bool allow_punct)
|
||||
/* If this is a word character, continue; else it's a separator,
|
||||
* and if we've already seen a word, then it's a word end. */
|
||||
if (is_word_char(openfile->current->data + openfile->current_x,
|
||||
allow_punct))
|
||||
punctuation_as_letters))
|
||||
seen_word = TRUE;
|
||||
#ifdef ENABLE_UTF8
|
||||
else if (is_zerowidth(openfile->current->data + openfile->current_x))
|
||||
@@ -360,7 +360,7 @@ bool do_next_word(bool after_ends, bool allow_punct)
|
||||
/* If this is not a word character, then it's a separator; else
|
||||
* if we've already seen a separator, then it's a word start. */
|
||||
if (!is_word_char(openfile->current->data + openfile->current_x,
|
||||
allow_punct))
|
||||
punctuation_as_letters))
|
||||
seen_space = TRUE;
|
||||
else if (seen_space)
|
||||
break;
|
||||
@@ -370,25 +370,23 @@ bool do_next_word(bool after_ends, bool allow_punct)
|
||||
return started_on_word;
|
||||
}
|
||||
|
||||
/* Move to the previous word in the file, treating punctuation as part of a
|
||||
* word if the WORD_BOUNDS flag is set, and update the screen afterwards. */
|
||||
/* Move to the previous word in the file, and update the screen afterwards. */
|
||||
void to_prev_word(void)
|
||||
{
|
||||
linestruct *was_current = openfile->current;
|
||||
|
||||
do_prev_word(ISSET(WORD_BOUNDS));
|
||||
do_prev_word();
|
||||
|
||||
edit_redraw(was_current, FLOWING);
|
||||
}
|
||||
|
||||
/* Move to the next word in the file. If the AFTER_ENDS flag is set, stop
|
||||
* at word ends instead of beginnings. If the WORD_BOUNDS flag is set, treat
|
||||
* punctuation as part of a word. Update the screen afterwards. */
|
||||
* at word ends instead of beginnings. Update the screen afterwards. */
|
||||
void to_next_word(void)
|
||||
{
|
||||
linestruct *was_current = openfile->current;
|
||||
|
||||
do_next_word(ISSET(AFTER_ENDS), ISSET(WORD_BOUNDS));
|
||||
do_next_word(ISSET(AFTER_ENDS));
|
||||
|
||||
edit_redraw(was_current, FLOWING);
|
||||
}
|
||||
|
||||
211
src/nano.c
211
src/nano.c
@@ -212,6 +212,18 @@ bool in_restricted_mode(void)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#ifndef NANO_TINY
|
||||
/* Say how the user can achieve suspension (when they typed ^Z). */
|
||||
void suggest_ctrlT_ctrlZ(void)
|
||||
{
|
||||
#ifdef ENABLE_NANORC
|
||||
if (first_sc_for(MMAIN, do_execute) && first_sc_for(MMAIN, do_execute)->keycode == 0x14 &&
|
||||
first_sc_for(MEXECUTE, do_suspend) && first_sc_for(MEXECUTE, do_suspend)->keycode == 0x1A)
|
||||
#endif
|
||||
statusline(AHEM, _("To suspend, type ^T^Z"));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Make sure the cursor is visible, then exit from curses mode, disable
|
||||
* bracketed-paste mode, and restore the original terminal settings. */
|
||||
void restore_terminal(void)
|
||||
@@ -303,7 +315,7 @@ void do_exit(void)
|
||||
}
|
||||
|
||||
/* When not saving, or the save succeeds, close the buffer. */
|
||||
if (choice == 0 || (choice == 1 && do_writeout(TRUE, TRUE) > 0))
|
||||
if (choice == 0 || (choice == 1 && write_it_out(TRUE, TRUE) > 0))
|
||||
close_and_go();
|
||||
else if (choice != 1)
|
||||
statusbar(_("Cancelled"));
|
||||
@@ -402,30 +414,30 @@ void window_init(void)
|
||||
|
||||
/* If the terminal is very flat, don't set up a title bar. */
|
||||
if (LINES < 3) {
|
||||
editwinrows = 1;
|
||||
editwinrows = (ISSET(ZERO) ? LINES : 1);
|
||||
/* Set up two subwindows. If the terminal is just one line,
|
||||
* edit window and status-bar window will cover each other. */
|
||||
edit = newwin(1, COLS, 0, 0);
|
||||
edit = newwin(editwinrows, COLS, 0, 0);
|
||||
bottomwin = newwin(1, COLS, LINES - 1, 0);
|
||||
} else {
|
||||
int toprows = ((ISSET(EMPTY_LINE) && LINES > 5) ? 2 : 1);
|
||||
int bottomrows = ((ISSET(NO_HELP) || LINES < 5) ? 1 : 3);
|
||||
int toprows = ((ISSET(EMPTY_LINE) && LINES > 6) ? 2 : 1);
|
||||
int bottomrows = ((ISSET(NO_HELP) || LINES < 6) ? 1 : 3);
|
||||
|
||||
#ifndef NANO_TINY
|
||||
if (ISSET(MINIBAR))
|
||||
if (ISSET(MINIBAR) || ISSET(ZERO))
|
||||
toprows = 0;
|
||||
#endif
|
||||
editwinrows = LINES - toprows - bottomrows;
|
||||
editwinrows = LINES - toprows - bottomrows + (ISSET(ZERO) ? 1 : 0);
|
||||
|
||||
/* Set up the normal three subwindows. */
|
||||
if (toprows > 0)
|
||||
topwin = newwin(toprows, COLS, 0, 0);
|
||||
edit = newwin(editwinrows, COLS, toprows, 0);
|
||||
bottomwin = newwin(bottomrows, COLS, toprows + editwinrows, 0);
|
||||
bottomwin = newwin(bottomrows, COLS, LINES - bottomrows, 0);
|
||||
}
|
||||
|
||||
/* In case the terminal shrunk, make sure the status line is clear. */
|
||||
wipe_statusbar();
|
||||
wnoutrefresh(bottomwin);
|
||||
|
||||
/* When not disabled, turn escape-sequence translation on. */
|
||||
if (!ISSET(RAW_SEQUENCES)) {
|
||||
@@ -639,12 +651,9 @@ void usage(void)
|
||||
print_opt("-x", "--nohelp", N_("Don't show the two help lines"));
|
||||
#ifndef NANO_TINY
|
||||
print_opt("-y", "--afterends", N_("Make Ctrl+Right stop at word ends"));
|
||||
#endif
|
||||
if (!ISSET(RESTRICTED))
|
||||
print_opt("-z", "--suspendable", N_("Enable suspension"));
|
||||
#ifndef NANO_TINY
|
||||
print_opt("-%", "--stateflags", N_("Show some states on the title bar"));
|
||||
print_opt("-_", "--minibar", N_("Show a feedback bar at the bottom"));
|
||||
print_opt("-0", "--zero", N_("Hide all bars, use whole terminal"));
|
||||
#endif
|
||||
#ifdef HAVE_LIBMAGIC
|
||||
print_opt("-!", "--magic", N_("Also try magic to determine syntax"));
|
||||
@@ -888,17 +897,17 @@ void signal_init(void)
|
||||
/* Trap SIGWINCH because we want to handle window resizes. */
|
||||
deed.sa_handler = handle_sigwinch;
|
||||
sigaction(SIGWINCH, &deed, NULL);
|
||||
#endif
|
||||
|
||||
/* In the suspend and continue handlers, block all other signals.
|
||||
* If we don't do this, other stuff interrupts them! */
|
||||
sigfillset(&deed.sa_mask);
|
||||
#ifdef SIGTSTP
|
||||
deed.sa_handler = do_suspend;
|
||||
/* Prevent the suspend handler from getting interrupted. */
|
||||
sigfillset(&deed.sa_mask);
|
||||
deed.sa_handler = suspend_nano;
|
||||
sigaction(SIGTSTP, &deed, NULL);
|
||||
#endif
|
||||
#endif /* !NANO_TINY */
|
||||
#ifdef SIGCONT
|
||||
deed.sa_handler = do_continue;
|
||||
sigfillset(&deed.sa_mask);
|
||||
deed.sa_handler = continue_nano;
|
||||
sigaction(SIGCONT, &deed, NULL);
|
||||
#endif
|
||||
|
||||
@@ -929,8 +938,9 @@ void handle_crash(int signal)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef NANO_TINY
|
||||
/* Handler for SIGTSTP (suspend). */
|
||||
void do_suspend(int signal)
|
||||
void suspend_nano(int signal)
|
||||
{
|
||||
#ifdef ENABLE_MOUSE
|
||||
disable_mouse_support();
|
||||
@@ -952,20 +962,20 @@ void do_suspend(int signal)
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Put nano to sleep (if suspension is enabled). */
|
||||
void do_suspend_void(void)
|
||||
/* When permitted, put nano to sleep. */
|
||||
void do_suspend(void)
|
||||
{
|
||||
if (!ISSET(SUSPENDABLE)) {
|
||||
statusline(AHEM, _("Suspension is not enabled"));
|
||||
beep();
|
||||
} else
|
||||
do_suspend(0);
|
||||
if (in_restricted_mode())
|
||||
return;
|
||||
|
||||
suspend_nano(0);
|
||||
|
||||
ran_a_tool = TRUE;
|
||||
}
|
||||
#endif /* !NANO_TINY */
|
||||
|
||||
/* Handler for SIGCONT (continue after suspend). */
|
||||
void do_continue(int signal)
|
||||
void continue_nano(int signal)
|
||||
{
|
||||
#ifdef ENABLE_MOUSE
|
||||
if (ISSET(USE_MOUSE))
|
||||
@@ -981,7 +991,7 @@ void do_continue(int signal)
|
||||
#endif
|
||||
|
||||
/* Insert a fake keystroke, to neutralize a key-eating issue. */
|
||||
ungetch(KEY_FLUSH);
|
||||
ungetch(KEY_FRESH);
|
||||
}
|
||||
|
||||
#if !defined(NANO_TINY) || defined(ENABLE_SPELLER) || defined(ENABLE_COLOR)
|
||||
@@ -1056,25 +1066,35 @@ void regenerate_screen(void)
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle the global toggle specified in flag. */
|
||||
void do_toggle(int flag)
|
||||
/* Invert the given global flag and adjust things for its new value. */
|
||||
void toggle_this(int flag)
|
||||
{
|
||||
if (flag == SUSPENDABLE && in_restricted_mode())
|
||||
return;
|
||||
bool enabled = !ISSET(flag);
|
||||
|
||||
TOGGLE(flag);
|
||||
focusing = FALSE;
|
||||
|
||||
switch (flag) {
|
||||
case ZERO:
|
||||
window_init();
|
||||
draw_all_subwindows();
|
||||
return;
|
||||
case NO_HELP:
|
||||
if (LINES < 6) {
|
||||
statusline(AHEM, _("Too tiny"));
|
||||
TOGGLE(flag);
|
||||
return;
|
||||
}
|
||||
window_init();
|
||||
draw_all_subwindows();
|
||||
break;
|
||||
#ifdef ENABLE_MOUSE
|
||||
case USE_MOUSE:
|
||||
mouse_init();
|
||||
break;
|
||||
#endif
|
||||
case CONSTANT_SHOW:
|
||||
if (ISSET(ZERO) || LINES == 1) {
|
||||
statusline(AHEM, _("Not possible"));
|
||||
TOGGLE(flag);
|
||||
} else if (!ISSET(MINIBAR))
|
||||
wipe_statusbar();
|
||||
return;
|
||||
case SOFTWRAP:
|
||||
if (!ISSET(SOFTWRAP))
|
||||
openfile->firstcolumn = 0;
|
||||
@@ -1089,30 +1109,37 @@ void do_toggle(int flag)
|
||||
precalc_multicolorinfo();
|
||||
refresh_needed = TRUE;
|
||||
break;
|
||||
case TABS_TO_SPACES:
|
||||
if (openfile->syntax && openfile->syntax->tab) {
|
||||
statusline(AHEM, _("Current syntax determines Tab"));
|
||||
TOGGLE(flag);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
#ifdef ENABLE_MOUSE
|
||||
case USE_MOUSE:
|
||||
mouse_init();
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (!ISSET(MINIBAR) && ISSET(STATEFLAGS))
|
||||
if (flag == AUTOINDENT || flag == BREAK_LONG_LINES || flag == SOFTWRAP)
|
||||
if (flag == AUTOINDENT || flag == BREAK_LONG_LINES || flag == SOFTWRAP) {
|
||||
if (ISSET(MINIBAR) && !ISSET(ZERO) && ISSET(STATEFLAGS))
|
||||
return;
|
||||
if (ISSET(STATEFLAGS))
|
||||
titlebar(NULL);
|
||||
|
||||
if (ISSET(MINIBAR) && (flag == NO_HELP || flag == LINE_NUMBERS))
|
||||
return;
|
||||
|
||||
if (flag == CONSTANT_SHOW)
|
||||
wipe_statusbar();
|
||||
else if (!ISSET(MINIBAR) || !ISSET(STATEFLAGS) || flag == SMART_HOME ||
|
||||
flag == NO_SYNTAX || flag == WHITESPACE_DISPLAY ||
|
||||
flag == CUT_FROM_CURSOR || flag == TABS_TO_SPACES ||
|
||||
flag == USE_MOUSE || flag == SUSPENDABLE) {
|
||||
bool enabled = ISSET(flag);
|
||||
|
||||
if (flag == NO_HELP || flag == NO_SYNTAX)
|
||||
enabled = !enabled;
|
||||
|
||||
statusline(REMARK, "%s %s", _(flagtostr(flag)),
|
||||
enabled ? _("enabled") : _("disabled"));
|
||||
}
|
||||
|
||||
if (flag == NO_HELP || flag == LINE_NUMBERS || flag == WHITESPACE_DISPLAY)
|
||||
if (ISSET(MINIBAR) || ISSET(ZERO) || LINES == 1)
|
||||
return;
|
||||
|
||||
if (flag == NO_HELP || flag == NO_SYNTAX)
|
||||
enabled = !enabled;
|
||||
|
||||
statusline(REMARK, "%s %s", _(epithet_of_flag(flag)),
|
||||
enabled ? _("enabled") : _("disabled"));
|
||||
}
|
||||
#endif /* !NANO_TINY */
|
||||
|
||||
@@ -1240,8 +1267,9 @@ void confirm_margin(void)
|
||||
#ifndef NANO_TINY
|
||||
/* Ensure a proper starting column for the first screen row. */
|
||||
ensure_firstcolumn_is_aligned();
|
||||
focusing = keep_focus;
|
||||
#endif
|
||||
focusing = keep_focus;
|
||||
|
||||
/* The margin has changed -- schedule a full refresh. */
|
||||
refresh_needed = TRUE;
|
||||
}
|
||||
@@ -1255,6 +1283,11 @@ void unbound_key(int code)
|
||||
/* TRANSLATORS: This refers to a sequence of escape codes
|
||||
* (from the keyboard) that nano does not recognize. */
|
||||
statusline(AHEM, _("Unknown sequence"));
|
||||
#ifndef NANO_TINY
|
||||
else if (code > KEY_F0 && code < KEY_F0 + 25)
|
||||
/* TRANSLATORS: This refers to an unbound function key. */
|
||||
statusline(AHEM, _("Unbound key: F%i"), code - KEY_F0);
|
||||
#endif
|
||||
else if (code > 0x7F)
|
||||
statusline(AHEM, _("Unbound key"));
|
||||
else if (meta_key) {
|
||||
@@ -1465,9 +1498,8 @@ void inject(char *burst, size_t count)
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_WRAPPING
|
||||
/* Wrap the line when needed, and if so, schedule a refresh. */
|
||||
if (ISSET(BREAK_LONG_LINES) && do_wrap())
|
||||
refresh_needed = TRUE;
|
||||
if (ISSET(BREAK_LONG_LINES))
|
||||
do_wrap();
|
||||
#endif
|
||||
|
||||
#ifndef NANO_TINY
|
||||
@@ -1511,7 +1543,6 @@ void process_a_keystroke(void)
|
||||
input = get_kbinput(edit, VISIBLE);
|
||||
|
||||
lastmessage = VACUUM;
|
||||
hide_cursor = FALSE;
|
||||
|
||||
#ifndef NANO_TINY
|
||||
if (input == KEY_WINCH)
|
||||
@@ -1599,8 +1630,8 @@ void process_a_keystroke(void)
|
||||
}
|
||||
#endif
|
||||
#ifndef NANO_TINY
|
||||
if (shortcut->func == do_toggle_void) {
|
||||
do_toggle(shortcut->toggle);
|
||||
if (shortcut->func == do_toggle) {
|
||||
toggle_this(shortcut->toggle);
|
||||
if (shortcut->toggle == CUT_FROM_CURSOR)
|
||||
keep_cutbuffer = FALSE;
|
||||
return;
|
||||
@@ -1727,7 +1758,7 @@ int main(int argc, char **argv)
|
||||
{"nowrap", 0, NULL, 'w'},
|
||||
#endif
|
||||
{"nohelp", 0, NULL, 'x'},
|
||||
{"suspendable", 0, NULL, 'z'},
|
||||
{"suspendable", 0, NULL, 'z'}, /* Obsolete; remove in 2022. */
|
||||
#ifndef NANO_TINY
|
||||
{"smarthome", 0, NULL, 'A'},
|
||||
{"backup", 0, NULL, 'B'},
|
||||
@@ -1756,6 +1787,7 @@ int main(int argc, char **argv)
|
||||
{"afterends", 0, NULL, 'y'},
|
||||
{"stateflags", 0, NULL, '%'},
|
||||
{"minibar", 0, NULL, '_'},
|
||||
{"zero", 0, NULL, '0'},
|
||||
#endif
|
||||
#ifdef HAVE_LIBMAGIC
|
||||
{"magic", 0, NULL, '!'},
|
||||
@@ -1799,7 +1831,7 @@ int main(int argc, char **argv)
|
||||
if (*(tail(argv[0])) == 'r')
|
||||
SET(RESTRICTED);
|
||||
|
||||
while ((optchr = getopt_long(argc, argv, "ABC:DEFGHIJ:KLMNOPQ:RST:UVWX:Y:Z"
|
||||
while ((optchr = getopt_long(argc, argv, "0ABC:DEFGHIJ:KLMNOPQ:RST:UVWX:Y:Z"
|
||||
"abcdef:ghijklmno:pqr:s:tuvwxyz$%_!", long_options, NULL)) != -1) {
|
||||
switch (optchr) {
|
||||
#ifndef NANO_TINY
|
||||
@@ -2034,7 +2066,6 @@ int main(int argc, char **argv)
|
||||
break;
|
||||
#endif
|
||||
case 'z':
|
||||
SET(SUSPENDABLE);
|
||||
break;
|
||||
#ifndef NANO_TINY
|
||||
case '%':
|
||||
@@ -2043,6 +2074,9 @@ int main(int argc, char **argv)
|
||||
case '_':
|
||||
SET(MINIBAR);
|
||||
break;
|
||||
case '0':
|
||||
SET(ZERO);
|
||||
break;
|
||||
#endif
|
||||
#ifdef HAVE_LIBMAGIC
|
||||
case '!':
|
||||
@@ -2178,11 +2212,10 @@ int main(int argc, char **argv)
|
||||
if (ISSET(BOLD_TEXT))
|
||||
hilite_attribute = A_BOLD;
|
||||
|
||||
/* When in restricted mode, disable backups, suspending, and history files,
|
||||
* since they allow writing to files not specified on the command line. */
|
||||
/* When in restricted mode, disable backups and history files, since they
|
||||
* would allow writing to files not specified on the command line. */
|
||||
if (ISSET(RESTRICTED)) {
|
||||
UNSET(MAKE_BACKUP);
|
||||
UNSET(SUSPENDABLE);
|
||||
#ifdef ENABLE_NANORC
|
||||
UNSET(HISTORYLOG);
|
||||
UNSET(POSITIONLOG);
|
||||
@@ -2193,6 +2226,10 @@ int main(int argc, char **argv)
|
||||
if (ISSET(RAW_SEQUENCES))
|
||||
UNSET(USE_MOUSE);
|
||||
|
||||
/* When suppressing title bar or minibar, suppress also the help lines. */
|
||||
if (ISSET(ZERO))
|
||||
SET(NO_HELP);
|
||||
|
||||
#ifdef ENABLE_HISTORIES
|
||||
/* Initialize the pointers for the Search/Replace/Execute histories. */
|
||||
history_init();
|
||||
@@ -2432,7 +2469,7 @@ int main(int argc, char **argv)
|
||||
|
||||
/* If a position was given on the command line, go there. */
|
||||
if (givenline != 0 || givencol != 0)
|
||||
do_gotolinecolumn(givenline, givencol, FALSE, FALSE);
|
||||
goto_line_and_column(givenline, givencol, FALSE, FALSE);
|
||||
#ifndef NANO_TINY
|
||||
else if (searchstring != NULL) {
|
||||
if (ISSET(USE_REGEXP))
|
||||
@@ -2455,11 +2492,14 @@ int main(int argc, char **argv)
|
||||
ssize_t savedline, savedcol;
|
||||
/* If edited before, restore the last cursor position. */
|
||||
if (has_old_position(argv[optind - 1], &savedline, &savedcol))
|
||||
do_gotolinecolumn(savedline, savedcol, FALSE, FALSE);
|
||||
goto_line_and_column(savedline, savedcol, FALSE, FALSE);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* After handling the files on the command line, allow inserting files. */
|
||||
UNSET(NOREAD_MODE);
|
||||
|
||||
/* If no filenames were given, or all of them were invalid things like
|
||||
* directories, then open a blank buffer and allow editing. Otherwise,
|
||||
* switch from the last opened file to the next, that is: the first. */
|
||||
@@ -2512,24 +2552,37 @@ int main(int argc, char **argv)
|
||||
bottombars(MMAIN);
|
||||
|
||||
#ifndef NANO_TINY
|
||||
if (ISSET(MINIBAR) && LINES > 1 && lastmessage < REMARK)
|
||||
if (ISSET(MINIBAR) && !ISSET(ZERO) && LINES > 1 && lastmessage < REMARK)
|
||||
minibar();
|
||||
else
|
||||
#endif
|
||||
/* Update the displayed current cursor position only when there
|
||||
* is no message and no keys are waiting in the input buffer. */
|
||||
if (ISSET(CONSTANT_SHOW) && lastmessage == VACUUM && LINES > 1 &&
|
||||
get_key_buffer_len() == 0)
|
||||
!ISSET(ZERO) && get_key_buffer_len() == 0)
|
||||
report_cursor_position();
|
||||
|
||||
as_an_at = TRUE;
|
||||
|
||||
/* Refresh just the cursor position or the entire edit window. */
|
||||
if (!refresh_needed) {
|
||||
place_the_cursor();
|
||||
wnoutrefresh(edit);
|
||||
} else if (LINES > 1 || lastmessage == VACUUM)
|
||||
if ((refresh_needed && LINES > 1) || (LINES == 1 && lastmessage <= HUSH))
|
||||
edit_refresh();
|
||||
else
|
||||
place_the_cursor();
|
||||
|
||||
#ifndef NANO_TINY
|
||||
/* In barless mode, either redraw a relevant status message,
|
||||
* or overwrite a minor, redundant one. */
|
||||
if (ISSET(ZERO) && lastmessage > HUSH) {
|
||||
if (openfile->current_y == editwinrows - 1 && LINES > 1) {
|
||||
edit_scroll(FORWARD);
|
||||
wnoutrefresh(edit);
|
||||
}
|
||||
wredrawln(bottomwin, 0 ,1);
|
||||
wnoutrefresh(bottomwin);
|
||||
place_the_cursor();
|
||||
} else if (ISSET(ZERO) && lastmessage > VACUUM)
|
||||
wredrawln(edit, editwinrows - 1, 1);
|
||||
#endif
|
||||
|
||||
errno = 0;
|
||||
focusing = TRUE;
|
||||
|
||||
76
src/prompt.c
76
src/prompt.c
@@ -304,8 +304,8 @@ int do_statusbar_input(bool *finished)
|
||||
if (shortcut->func == do_tab || shortcut->func == do_enter)
|
||||
;
|
||||
#ifdef ENABLE_HISTORIES
|
||||
else if (shortcut->func == get_history_older_void ||
|
||||
shortcut->func == get_history_newer_void)
|
||||
else if (shortcut->func == get_older_item ||
|
||||
shortcut->func == get_newer_item)
|
||||
;
|
||||
#endif
|
||||
else if (shortcut->func == do_left)
|
||||
@@ -446,10 +446,8 @@ functionptrtype acquire_an_answer(int *actual, bool *listed,
|
||||
bool finished;
|
||||
functionptrtype func;
|
||||
#ifdef ENABLE_HISTORIES
|
||||
char *history = NULL;
|
||||
/* The current history string. */
|
||||
char *magichistory = NULL;
|
||||
/* The (partial) answer that was typed at the prompt, if any. */
|
||||
char *stored_string = NULL;
|
||||
/* Whatever the answer was before the user foraged into history. */
|
||||
#ifdef ENABLE_TABCOMP
|
||||
bool previous_was_tab = FALSE;
|
||||
/* Whether the previous keystroke was an attempt at tab completion. */
|
||||
@@ -472,7 +470,7 @@ functionptrtype acquire_an_answer(int *actual, bool *listed,
|
||||
refresh_func();
|
||||
*actual = KEY_WINCH;
|
||||
#ifdef ENABLE_HISTORIES
|
||||
free(magichistory);
|
||||
free(stored_string);
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
@@ -503,36 +501,33 @@ functionptrtype acquire_an_answer(int *actual, bool *listed,
|
||||
} else
|
||||
#endif /* ENABLE_TABCOMP */
|
||||
#ifdef ENABLE_HISTORIES
|
||||
if (func == get_history_older_void) {
|
||||
if (history_list != NULL) {
|
||||
/* If we're scrolling up at the bottom of the history list
|
||||
* and answer isn't blank, save answer in magichistory. */
|
||||
if ((*history_list)->next == NULL && *answer != '\0')
|
||||
magichistory = mallocstrcpy(magichistory, answer);
|
||||
if (func == get_older_item && history_list != NULL) {
|
||||
/* If this is the first step into history, start at the bottom. */
|
||||
if (stored_string == NULL)
|
||||
reset_history_pointer_for(*history_list);
|
||||
|
||||
/* Get the older search from the history list and save it in
|
||||
* answer. If there is no older search, don't do anything. */
|
||||
if ((history = get_history_older(history_list)) != NULL) {
|
||||
answer = mallocstrcpy(answer, history);
|
||||
typing_x = strlen(answer);
|
||||
}
|
||||
/* When moving up from the bottom, remember the current answer. */
|
||||
if ((*history_list)->next == NULL)
|
||||
stored_string = mallocstrcpy(stored_string, answer);
|
||||
|
||||
/* If there is an older item, move to it and copy its string. */
|
||||
if ((*history_list)->prev != NULL) {
|
||||
*history_list = (*history_list)->prev;
|
||||
answer = mallocstrcpy(answer, (*history_list)->data);
|
||||
typing_x = strlen(answer);
|
||||
}
|
||||
} else if (func == get_newer_item && history_list != NULL) {
|
||||
/* If there is a newer item, move to it and copy its string. */
|
||||
if ((*history_list)->next != NULL) {
|
||||
*history_list = (*history_list)->next;
|
||||
answer = mallocstrcpy(answer, (*history_list)->data);
|
||||
typing_x = strlen(answer);
|
||||
}
|
||||
} else if (func == get_history_newer_void) {
|
||||
if (history_list != NULL) {
|
||||
/* Get the newer search from the history list and save it in
|
||||
* answer. If there is no newer search, don't do anything. */
|
||||
if ((history = get_history_newer(history_list)) != NULL) {
|
||||
answer = mallocstrcpy(answer, history);
|
||||
typing_x = strlen(answer);
|
||||
}
|
||||
|
||||
/* If we've reached the bottom of the history list, and answer
|
||||
* is blank, and magichistory is set, restore the old answer. */
|
||||
if ((*history_list)->next == NULL &&
|
||||
*answer == '\0' && magichistory != NULL) {
|
||||
answer = mallocstrcpy(answer, magichistory);
|
||||
typing_x = strlen(answer);
|
||||
}
|
||||
/* When at the bottom of the history list, restore the old answer. */
|
||||
if ((*history_list)->next == NULL && stored_string && *answer == '\0') {
|
||||
answer = mallocstrcpy(answer, stored_string);
|
||||
typing_x = strlen(answer);
|
||||
}
|
||||
} else
|
||||
#endif /* ENABLE_HISTORIES */
|
||||
@@ -542,7 +537,7 @@ functionptrtype acquire_an_answer(int *actual, bool *listed,
|
||||
#ifndef NANO_TINY
|
||||
else if (func == do_nothing)
|
||||
finished = FALSE;
|
||||
else if (func == do_toggle_void) {
|
||||
else if (func == do_toggle) {
|
||||
TOGGLE(NO_HELP);
|
||||
window_init();
|
||||
focusing = FALSE;
|
||||
@@ -563,10 +558,10 @@ functionptrtype acquire_an_answer(int *actual, bool *listed,
|
||||
}
|
||||
|
||||
#ifdef ENABLE_HISTORIES
|
||||
/* Set the current position in the history list to the bottom. */
|
||||
if (history_list != NULL) {
|
||||
history_reset(*history_list);
|
||||
free(magichistory);
|
||||
/* If the history pointer was moved, point it at the bottom again. */
|
||||
if (stored_string != NULL) {
|
||||
reset_history_pointer_for(*history_list);
|
||||
free(stored_string);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -770,12 +765,13 @@ int do_yesno_prompt(bool all, const char *msg)
|
||||
else if (func_from_key(&kbinput) == full_refresh)
|
||||
full_refresh();
|
||||
#ifndef NANO_TINY
|
||||
else if (func_from_key(&kbinput) == do_toggle_void) {
|
||||
else if (func_from_key(&kbinput) == do_toggle) {
|
||||
TOGGLE(NO_HELP);
|
||||
window_init();
|
||||
titlebar(NULL);
|
||||
focusing = FALSE;
|
||||
edit_refresh();
|
||||
focusing = TRUE;
|
||||
}
|
||||
#endif
|
||||
else
|
||||
|
||||
@@ -53,7 +53,6 @@ extern message_type lastmessage;
|
||||
extern linestruct *pletion_line;
|
||||
|
||||
extern bool also_the_last;
|
||||
extern bool hide_cursor;
|
||||
|
||||
extern char *answer;
|
||||
|
||||
@@ -282,7 +281,7 @@ void close_buffer(void);
|
||||
void read_file(FILE *f, int fd, const char *filename, bool undoable);
|
||||
int open_file(const char *filename, bool new_one, FILE **f);
|
||||
char *get_next_filename(const char *name, const char *suffix);
|
||||
void do_insertfile_void(void);
|
||||
void do_insertfile(void);
|
||||
#ifndef NANO_TINY
|
||||
void do_execute(void);
|
||||
#endif
|
||||
@@ -302,8 +301,8 @@ bool write_file(const char *name, FILE *thefile, bool normal,
|
||||
bool write_region_to_file(const char *name, FILE *stream, bool normal,
|
||||
kind_of_writing_type method);
|
||||
#endif
|
||||
int do_writeout(bool exiting, bool withprompt);
|
||||
void do_writeout_void(void);
|
||||
int write_it_out(bool exiting, bool withprompt);
|
||||
void do_writeout(void);
|
||||
void do_savefile(void);
|
||||
char *real_dir_from_tilde(const char *path);
|
||||
#if defined(ENABLE_TABCOMP) || defined(ENABLE_BROWSER)
|
||||
@@ -323,7 +322,7 @@ functionptrtype interpret(int *keycode);
|
||||
#endif
|
||||
int keycode_from_string(const char *keystring);
|
||||
void shortcut_init(void);
|
||||
const char *flagtostr(int flag);
|
||||
const char *epithet_of_flag(int flag);
|
||||
|
||||
/* Some functions in help.c. */
|
||||
#ifdef ENABLE_HELP
|
||||
@@ -334,12 +333,8 @@ void do_help(void);
|
||||
/* Most functions in history.c. */
|
||||
#ifdef ENABLE_HISTORIES
|
||||
void history_init(void);
|
||||
void history_reset(const linestruct *list);
|
||||
void update_history(linestruct **item, const char *text);
|
||||
char *get_history_older(linestruct **h);
|
||||
char *get_history_newer(linestruct **h);
|
||||
void get_history_older_void(void);
|
||||
void get_history_newer_void(void);
|
||||
void reset_history_pointer_for(const linestruct *list);
|
||||
void update_history(linestruct **item, const char *text, bool avoid_duplicates);
|
||||
#ifdef ENABLE_TABCOMP
|
||||
char *get_history_completion(linestruct **h, char *s, size_t len);
|
||||
#endif
|
||||
@@ -364,8 +359,8 @@ void to_para_end(void);
|
||||
#endif
|
||||
void to_prev_block(void);
|
||||
void to_next_block(void);
|
||||
void do_prev_word(bool allow_punct);
|
||||
bool do_next_word(bool after_ends, bool allow_punct);
|
||||
void do_prev_word(void);
|
||||
bool do_next_word(bool after_ends);
|
||||
void to_prev_word(void);
|
||||
void to_next_word(void);
|
||||
void do_home(void);
|
||||
@@ -390,6 +385,9 @@ void free_lines(linestruct *src);
|
||||
void renumber_from(linestruct *line);
|
||||
void print_view_warning(void);
|
||||
bool in_restricted_mode(void);
|
||||
#ifndef NANO_TINY
|
||||
void suggest_ctrlT_ctrlZ(void);
|
||||
#endif
|
||||
void finish(void);
|
||||
void close_and_go(void);
|
||||
void do_exit(void);
|
||||
@@ -404,15 +402,15 @@ void handle_hupterm(int signal);
|
||||
#ifndef DEBUG
|
||||
void handle_crash(int signal);
|
||||
#endif
|
||||
void do_suspend(int signal);
|
||||
void do_continue(int signal);
|
||||
void suspend_nano(int signal);
|
||||
void do_suspend(void);
|
||||
void continue_nano(int signal);
|
||||
#if !defined(NANO_TINY) || defined(ENABLE_SPELLER) || defined(ENABLE_COLOR)
|
||||
void block_sigwinch(bool blockit);
|
||||
#endif
|
||||
#ifndef NANO_TINY
|
||||
void handle_sigwinch(int signal);
|
||||
void regenerate_screen(void);
|
||||
void do_toggle(int flag);
|
||||
#endif
|
||||
void disable_kb_interrupt(void);
|
||||
void enable_kb_interrupt(void);
|
||||
@@ -465,9 +463,9 @@ ssize_t do_replace_loop(const char *needle, bool whole_word_only,
|
||||
void do_replace(void);
|
||||
void ask_for_and_do_replacements(void);
|
||||
void goto_line_posx(ssize_t line, size_t pos_x);
|
||||
void do_gotolinecolumn(ssize_t line, ssize_t column, bool retain_answer,
|
||||
void goto_line_and_column(ssize_t line, ssize_t column, bool retain_answer,
|
||||
bool interactive);
|
||||
void do_gotolinecolumn_void(void);
|
||||
void do_gotolinecolumn(void);
|
||||
#ifndef NANO_TINY
|
||||
void do_find_bracket(void);
|
||||
void put_or_lift_anchor(void);
|
||||
@@ -497,7 +495,7 @@ void update_multiline_undo(ssize_t lineno, char *indentation);
|
||||
void update_undo(undo_type action);
|
||||
#endif /* !NANO_TINY */
|
||||
#ifdef ENABLE_WRAPPING
|
||||
bool do_wrap(void);
|
||||
void do_wrap(void);
|
||||
#endif
|
||||
#if defined(ENABLE_HELP) || defined(ENABLED_WRAPORJUSTIFY)
|
||||
ssize_t break_line(const char *textstart, ssize_t goal, bool snap_at_nl);
|
||||
@@ -520,7 +518,7 @@ void do_linter(void);
|
||||
void do_formatter(void);
|
||||
#endif
|
||||
#ifndef NANO_TINY
|
||||
void do_wordlinechar_count(void);
|
||||
void count_lines_words_and_characters(void);
|
||||
#endif
|
||||
void do_verbatim_input(void);
|
||||
void complete_a_word(void);
|
||||
@@ -625,7 +623,6 @@ void spotlight(size_t from_col, size_t to_col);
|
||||
#ifndef NANO_TINY
|
||||
void spotlight_softwrapped(size_t from_col, size_t to_col);
|
||||
#endif
|
||||
void do_suspend_void(void);
|
||||
#ifdef ENABLE_EXTRA
|
||||
void do_credits(void);
|
||||
#endif
|
||||
@@ -634,6 +631,10 @@ void do_credits(void);
|
||||
void case_sens_void(void);
|
||||
void regexp_void(void);
|
||||
void backwards_void(void);
|
||||
#ifdef ENABLE_HISTORIES
|
||||
void get_older_item(void);
|
||||
void get_newer_item(void);
|
||||
#endif
|
||||
void flip_replace(void);
|
||||
void flip_goto(void);
|
||||
#ifdef ENABLE_BROWSER
|
||||
@@ -642,12 +643,12 @@ void goto_dir(void);
|
||||
#endif
|
||||
#ifndef NANO_TINY
|
||||
void do_nothing(void);
|
||||
void do_toggle_void(void);
|
||||
void dos_format_void(void);
|
||||
void mac_format_void(void);
|
||||
void append_void(void);
|
||||
void prepend_void(void);
|
||||
void backup_file_void(void);
|
||||
void do_toggle(void);
|
||||
void dos_format(void);
|
||||
void mac_format(void);
|
||||
void append_it(void);
|
||||
void prepend_it(void);
|
||||
void back_it_up(void);
|
||||
void flip_execute(void);
|
||||
void flip_pipe(void);
|
||||
void flip_convert(void);
|
||||
|
||||
102
src/rcfile.c
102
src/rcfile.c
@@ -91,7 +91,7 @@ static const rcoption rcopts[] = {
|
||||
{"speller", 0},
|
||||
#endif
|
||||
{"suspend", SUSPENDABLE}, /* Deprecated; remove in 2022. */
|
||||
{"suspendable", SUSPENDABLE},
|
||||
{"suspendable", SUSPENDABLE}, /* Obsolete; remove in 2022. */
|
||||
{"tempfile", SAVE_ON_EXIT}, /* Deprecated; remove in 2022. */
|
||||
#ifndef NANO_TINY
|
||||
{"afterends", AFTER_ENDS},
|
||||
@@ -122,6 +122,7 @@ static const rcoption rcopts[] = {
|
||||
{"wordbounds", WORD_BOUNDS},
|
||||
{"wordchars", 0},
|
||||
{"zap", LET_THEM_ZAP},
|
||||
{"zero", ZERO},
|
||||
#endif
|
||||
#ifdef ENABLE_COLOR
|
||||
{"titlecolor", 0},
|
||||
@@ -242,11 +243,11 @@ keystruct *strtosc(const char *input)
|
||||
else if (!strcmp(input, "discardbuffer"))
|
||||
s->func = discard_buffer;
|
||||
else if (!strcmp(input, "writeout"))
|
||||
s->func = do_writeout_void;
|
||||
s->func = do_writeout;
|
||||
else if (!strcmp(input, "savefile"))
|
||||
s->func = do_savefile;
|
||||
else if (!strcmp(input, "insert"))
|
||||
s->func = do_insertfile_void;
|
||||
s->func = do_insertfile;
|
||||
else if (!strcmp(input, "whereis"))
|
||||
s->func = do_search_forward;
|
||||
else if (!strcmp(input, "wherewas"))
|
||||
@@ -288,7 +289,7 @@ keystruct *strtosc(const char *input)
|
||||
!strcmp(input, "curpos")) /* Deprecated; remove in 2022. */
|
||||
s->func = report_cursor_position;
|
||||
else if (!strcmp(input, "gotoline"))
|
||||
s->func = do_gotolinecolumn_void;
|
||||
s->func = do_gotolinecolumn;
|
||||
#ifdef ENABLE_JUSTIFY
|
||||
else if (!strcmp(input, "justify"))
|
||||
s->func = do_justify;
|
||||
@@ -312,16 +313,14 @@ keystruct *strtosc(const char *input)
|
||||
s->func = do_indent;
|
||||
else if (!strcmp(input, "unindent"))
|
||||
s->func = do_unindent;
|
||||
else if (!strcmp(input, "chopwordleft") ||
|
||||
!strcmp(input, "cutwordleft")) /* Deprecated; remove in 2021. */
|
||||
else if (!strcmp(input, "chopwordleft"))
|
||||
s->func = chop_previous_word;
|
||||
else if (!strcmp(input, "chopwordright") ||
|
||||
!strcmp(input, "cutwordright")) /* Deprecated; remove in 2021. */
|
||||
else if (!strcmp(input, "chopwordright"))
|
||||
s->func = chop_next_word;
|
||||
else if (!strcmp(input, "findbracket"))
|
||||
s->func = do_find_bracket;
|
||||
else if (!strcmp(input, "wordcount"))
|
||||
s->func = do_wordlinechar_count;
|
||||
s->func = count_lines_words_and_characters;
|
||||
else if (!strcmp(input, "recordmacro"))
|
||||
s->func = record_macro;
|
||||
else if (!strcmp(input, "runmacro"))
|
||||
@@ -397,8 +396,10 @@ keystruct *strtosc(const char *input)
|
||||
s->func = do_backspace;
|
||||
else if (!strcmp(input, "refresh"))
|
||||
s->func = full_refresh;
|
||||
#ifndef NANO_TINY
|
||||
else if (!strcmp(input, "suspend"))
|
||||
s->func = do_suspend_void;
|
||||
s->func = do_suspend;
|
||||
#endif
|
||||
else if (!strcmp(input, "casesens"))
|
||||
s->func = case_sens_void;
|
||||
else if (!strcmp(input, "regexp"))
|
||||
@@ -411,21 +412,21 @@ keystruct *strtosc(const char *input)
|
||||
s->func = flip_goto;
|
||||
#ifdef ENABLE_HISTORIES
|
||||
else if (!strcmp(input, "older"))
|
||||
s->func = get_history_older_void;
|
||||
s->func = get_older_item;
|
||||
else if (!strcmp(input, "newer"))
|
||||
s->func = get_history_newer_void;
|
||||
s->func = get_newer_item;
|
||||
#endif
|
||||
#ifndef NANO_TINY
|
||||
else if (!strcmp(input, "dosformat"))
|
||||
s->func = dos_format_void;
|
||||
s->func = dos_format;
|
||||
else if (!strcmp(input, "macformat"))
|
||||
s->func = mac_format_void;
|
||||
s->func = mac_format;
|
||||
else if (!strcmp(input, "append"))
|
||||
s->func = append_void;
|
||||
s->func = append_it;
|
||||
else if (!strcmp(input, "prepend"))
|
||||
s->func = prepend_void;
|
||||
s->func = prepend_it;
|
||||
else if (!strcmp(input, "backup"))
|
||||
s->func = backup_file_void;
|
||||
s->func = back_it_up;
|
||||
else if (!strcmp(input, "flipexecute"))
|
||||
s->func = flip_execute;
|
||||
else if (!strcmp(input, "flippipe"))
|
||||
@@ -450,9 +451,11 @@ keystruct *strtosc(const char *input)
|
||||
#endif
|
||||
else {
|
||||
#ifndef NANO_TINY
|
||||
s->func = do_toggle_void;
|
||||
s->func = do_toggle;
|
||||
if (!strcmp(input, "nohelp"))
|
||||
s->toggle = NO_HELP;
|
||||
else if (!strcmp(input, "zero"))
|
||||
s->toggle = ZERO;
|
||||
else if (!strcmp(input, "constantshow"))
|
||||
s->toggle = CONSTANT_SHOW;
|
||||
else if (!strcmp(input, "softwrap"))
|
||||
@@ -484,9 +487,6 @@ keystruct *strtosc(const char *input)
|
||||
else if (!strcmp(input, "mouse"))
|
||||
s->toggle = USE_MOUSE;
|
||||
#endif
|
||||
else if (!strcmp(input, "suspendable") ||
|
||||
!strcmp(input, "suspendenable")) /* Deprecated; remove in 2022. */
|
||||
s->toggle = SUSPENDABLE;
|
||||
else
|
||||
#endif /* !NANO_TINY */
|
||||
{
|
||||
@@ -828,9 +828,9 @@ void parse_binding(char *ptr, bool dobind)
|
||||
if (is_universal(newsc->func))
|
||||
menu &= MMOST|MBROWSER;
|
||||
#ifndef NANO_TINY
|
||||
else if (newsc->func == do_toggle_void && newsc->toggle == NO_HELP)
|
||||
else if (newsc->func == do_toggle && newsc->toggle == NO_HELP)
|
||||
menu &= (MMOST|MBROWSER|MYESNO) & ~MFINDINHELP;
|
||||
else if (newsc->func == do_toggle_void)
|
||||
else if (newsc->func == do_toggle)
|
||||
menu &= MMAIN;
|
||||
#endif
|
||||
else if (newsc->func == full_refresh)
|
||||
@@ -868,9 +868,9 @@ void parse_binding(char *ptr, bool dobind)
|
||||
|
||||
#ifndef NANO_TINY
|
||||
/* If this is a toggle, find and copy its sequence number. */
|
||||
if (newsc->func == do_toggle_void) {
|
||||
if (newsc->func == do_toggle) {
|
||||
for (keystruct *s = sclist; s != NULL; s = s->next)
|
||||
if (s->func == do_toggle_void && s->toggle == newsc->toggle)
|
||||
if (s->func == do_toggle && s->toggle == newsc->toggle)
|
||||
newsc->ordinal = s->ordinal;
|
||||
} else
|
||||
newsc->ordinal = 0;
|
||||
@@ -992,7 +992,20 @@ void parse_includes(char *ptr)
|
||||
free(expanded);
|
||||
}
|
||||
|
||||
#define COLORCOUNT 20
|
||||
/* Return the index of the color that is closest to the given RGB levels,
|
||||
* assuming that the terminal uses the 6x6x6 color cube of xterm-256color. */
|
||||
short closest_index_color(short red, short green, short blue)
|
||||
{
|
||||
/* Translation table, from 16 intended levels to 6 available levels. */
|
||||
static const short level[] = { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 };
|
||||
|
||||
if (COLORS == 256)
|
||||
return (36 * level[red] + 6 * level[green] + level[blue] + 16);
|
||||
else
|
||||
return THE_DEFAULT;
|
||||
}
|
||||
|
||||
#define COLORCOUNT 34
|
||||
|
||||
const char hues[COLORCOUNT][8] = { "red", "green", "blue",
|
||||
"yellow", "cyan", "magenta",
|
||||
@@ -1000,12 +1013,19 @@ const char hues[COLORCOUNT][8] = { "red", "green", "blue",
|
||||
"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" };
|
||||
|
||||
short indices[COLORCOUNT] = { COLOR_RED, COLOR_GREEN, COLOR_BLUE,
|
||||
COLOR_YELLOW, COLOR_CYAN, COLOR_MAGENTA,
|
||||
COLOR_WHITE, COLOR_BLACK, THE_DEFAULT,
|
||||
204, 163, 134, 38, 48, 148, 215, 208, 137,
|
||||
175, 127, 98, 32, 111, 66, 35, 107, 100,
|
||||
142, 186, 136, 166, 161,
|
||||
COLOR_BLACK + 8, COLOR_BLACK + 8 };
|
||||
|
||||
/* Return the short value corresponding to the given color name, and set
|
||||
@@ -1026,6 +1046,18 @@ short color_to_short(const char *colorname, bool *vivid, bool *thick)
|
||||
*thick = FALSE;
|
||||
}
|
||||
|
||||
if (colorname[0] == '#' && strlen(colorname) == 4) {
|
||||
unsigned short r, g, b;
|
||||
|
||||
if (*vivid) {
|
||||
jot_error(N_("Color '%s' takes no prefix"), colorname);
|
||||
return BAD_COLOR;
|
||||
}
|
||||
|
||||
if (sscanf(colorname, "#%1hX%1hX%1hX", &r, &g, &b) == 3)
|
||||
return closest_index_color(r, g, b);
|
||||
}
|
||||
|
||||
for (int index = 0; index < COLORCOUNT; index++)
|
||||
if (strcmp(colorname, hues[index]) == 0) {
|
||||
if (index > 7 && *vivid) {
|
||||
@@ -1567,7 +1599,7 @@ void parse_rcfile(FILE *rcstream, bool just_syntax, bool intros_only)
|
||||
#endif
|
||||
#ifdef ENABLE_OPERATINGDIR
|
||||
if (strcmp(option, "operatingdir") == 0)
|
||||
operating_dir = copy_of(argument);
|
||||
operating_dir = mallocstrcpy(operating_dir, argument);
|
||||
else
|
||||
#endif
|
||||
#ifdef ENABLED_WRAPORJUSTIFY
|
||||
@@ -1585,12 +1617,12 @@ void parse_rcfile(FILE *rcstream, bool just_syntax, bool intros_only)
|
||||
else if (mbstrlen(argument) % 2 != 0)
|
||||
jot_error(N_("Even number of characters required"));
|
||||
else
|
||||
matchbrackets = copy_of(argument);
|
||||
matchbrackets = mallocstrcpy(matchbrackets, argument);
|
||||
} else if (strcmp(option, "whitespace") == 0) {
|
||||
if (mbstrlen(argument) != 2 || breadth(argument) != 2)
|
||||
jot_error(N_("Two single-column characters required"));
|
||||
else {
|
||||
whitespace = copy_of(argument);
|
||||
whitespace = mallocstrcpy(whitespace, argument);
|
||||
whitelen[0] = char_length(whitespace);
|
||||
whitelen[1] = char_length(whitespace + whitelen[0]);
|
||||
}
|
||||
@@ -1601,26 +1633,26 @@ void parse_rcfile(FILE *rcstream, bool just_syntax, bool intros_only)
|
||||
if (has_blank_char(argument))
|
||||
jot_error(N_("Non-blank characters required"));
|
||||
else
|
||||
punct = copy_of(argument);
|
||||
punct = mallocstrcpy(punct, argument);
|
||||
} else if (strcmp(option, "brackets") == 0) {
|
||||
if (has_blank_char(argument))
|
||||
jot_error(N_("Non-blank characters required"));
|
||||
else
|
||||
brackets = copy_of(argument);
|
||||
brackets = mallocstrcpy(brackets, argument);
|
||||
} else if (strcmp(option, "quotestr") == 0)
|
||||
quotestr = copy_of(argument);
|
||||
quotestr = mallocstrcpy(quotestr, argument);
|
||||
else
|
||||
#endif
|
||||
#ifdef ENABLE_SPELLER
|
||||
if (strcmp(option, "speller") == 0)
|
||||
alt_speller = copy_of(argument);
|
||||
alt_speller = mallocstrcpy(alt_speller, argument);
|
||||
else
|
||||
#endif
|
||||
#ifndef NANO_TINY
|
||||
if (strcmp(option, "backupdir") == 0)
|
||||
backup_dir = copy_of(argument);
|
||||
backup_dir = mallocstrcpy(backup_dir, argument);
|
||||
else if (strcmp(option, "wordchars") == 0)
|
||||
word_chars = copy_of(argument);
|
||||
word_chars = mallocstrcpy(word_chars, argument);
|
||||
else if (strcmp(option, "guidestripe") == 0) {
|
||||
if (!parse_num(argument, &stripe_column) || stripe_column <= 0) {
|
||||
jot_error(N_("Guide column \"%s\" is invalid"), argument);
|
||||
|
||||
20
src/search.c
20
src/search.c
@@ -118,7 +118,7 @@ void search_init(bool replacing, bool retain_answer)
|
||||
if (*answer != '\0') {
|
||||
last_search = mallocstrcpy(last_search, answer);
|
||||
#ifdef ENABLE_HISTORIES
|
||||
update_history(&search_history, answer);
|
||||
update_history(&search_history, answer, PRUNE_DUPLICATE);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -152,7 +152,7 @@ void search_init(bool replacing, bool retain_answer)
|
||||
} else
|
||||
replacing = !replacing;
|
||||
} else if (func == flip_goto) {
|
||||
do_gotolinecolumn(openfile->current->lineno,
|
||||
goto_line_and_column(openfile->current->lineno,
|
||||
openfile->placewewant + 1, TRUE, TRUE);
|
||||
break;
|
||||
} else
|
||||
@@ -327,9 +327,7 @@ int findnextstr(const char *needle, bool whole_word_only, int modus,
|
||||
spotlighted = TRUE;
|
||||
light_from_col = xplustabs();
|
||||
light_to_col = wideness(line->data, found_x + found_len);
|
||||
if (!ISSET(SHOW_CURSOR))
|
||||
hide_cursor = TRUE;
|
||||
edit_refresh();
|
||||
refresh_needed = TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -706,7 +704,7 @@ void ask_for_and_do_replacements(void)
|
||||
#ifdef ENABLE_HISTORIES
|
||||
/* When not "", add the replace string to the replace history list. */
|
||||
if (response == 0)
|
||||
update_history(&replace_history, answer);
|
||||
update_history(&replace_history, answer, PRUNE_DUPLICATE);
|
||||
#endif
|
||||
|
||||
/* When cancelled, or when a function was run, get out. */
|
||||
@@ -724,7 +722,7 @@ void ask_for_and_do_replacements(void)
|
||||
openfile->current = beginline;
|
||||
openfile->current_x = begin_x;
|
||||
|
||||
edit_refresh();
|
||||
refresh_needed = TRUE;
|
||||
|
||||
if (numreplaced >= 0)
|
||||
statusline(REMARK, P_("Replaced %zd occurrence",
|
||||
@@ -747,8 +745,8 @@ void goto_line_posx(ssize_t line, size_t pos_x)
|
||||
/* Go to the specified line and column, or ask for them if interactive
|
||||
* is TRUE. In the latter case also update the screen afterwards.
|
||||
* Note that both the line and column number should be one-based. */
|
||||
void do_gotolinecolumn(ssize_t line, ssize_t column, bool retain_answer,
|
||||
bool interactive)
|
||||
void goto_line_and_column(ssize_t line, ssize_t column, bool retain_answer,
|
||||
bool interactive)
|
||||
{
|
||||
if (interactive) {
|
||||
/* Ask for the line and column. */
|
||||
@@ -844,9 +842,9 @@ void do_gotolinecolumn(ssize_t line, ssize_t column, bool retain_answer,
|
||||
}
|
||||
|
||||
/* Go to the specified line and column, asking for them beforehand. */
|
||||
void do_gotolinecolumn_void(void)
|
||||
void do_gotolinecolumn(void)
|
||||
{
|
||||
do_gotolinecolumn(openfile->current->lineno,
|
||||
goto_line_and_column(openfile->current->lineno,
|
||||
openfile->placewewant + 1, FALSE, TRUE);
|
||||
}
|
||||
|
||||
|
||||
27
src/text.c
27
src/text.c
@@ -1212,9 +1212,9 @@ void update_undo(undo_type action)
|
||||
|
||||
#ifdef ENABLE_WRAPPING
|
||||
/* When the current line is overlong, hard-wrap it at the furthest possible
|
||||
* whitespace character, and (if possible) prepend the remainder of the line
|
||||
* to the next line. Return TRUE if wrapping occurred, and FALSE otherwise. */
|
||||
bool do_wrap(void)
|
||||
* whitespace character, and prepend the excess part to an "overflow" line
|
||||
* (when it already exists, otherwise create one). */
|
||||
void do_wrap(void)
|
||||
{
|
||||
linestruct *line = openfile->current;
|
||||
/* The line to be wrapped, if needed and possible. */
|
||||
@@ -1243,7 +1243,7 @@ bool do_wrap(void)
|
||||
|
||||
/* If no wrapping point was found before end-of-line, we don't wrap. */
|
||||
if (wrap_loc < 0 || lead_len + wrap_loc == line_len)
|
||||
return FALSE;
|
||||
return;
|
||||
|
||||
/* Adjust the wrap location to its position in the full line,
|
||||
* and step forward to the character just after the blank. */
|
||||
@@ -1251,7 +1251,7 @@ bool do_wrap(void)
|
||||
|
||||
/* When now at end-of-line, no need to wrap. */
|
||||
if (line->data[wrap_loc] == '\0')
|
||||
return FALSE;
|
||||
return;
|
||||
|
||||
#ifndef NANO_TINY
|
||||
add_undo(SPLIT_BEGIN, NULL);
|
||||
@@ -1360,7 +1360,7 @@ bool do_wrap(void)
|
||||
add_undo(SPLIT_END, NULL);
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
refresh_needed = TRUE;
|
||||
}
|
||||
#endif /* ENABLE_WRAPPING */
|
||||
|
||||
@@ -1465,9 +1465,8 @@ bool begpar(const linestruct *const line, int depth)
|
||||
{
|
||||
size_t quot_len, indent_len, prev_dent_len;
|
||||
|
||||
/* If this is the very first line of the buffer, it counts as a BOP
|
||||
* even when it contains no text. */
|
||||
if (line == openfile->filetop)
|
||||
/* The very first line counts as a BOP, even when it contains no text. */
|
||||
if (line->prev == NULL)
|
||||
return TRUE;
|
||||
|
||||
/* If recursion is going too deep, just say it's not a BOP. */
|
||||
@@ -2564,7 +2563,7 @@ void do_linter(void)
|
||||
if (choice == -1) {
|
||||
statusbar(_("Cancelled"));
|
||||
return;
|
||||
} else if (choice == 1 && (do_writeout(FALSE, FALSE) != 1))
|
||||
} else if (choice == 1 && (write_it_out(FALSE, FALSE) != 1))
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2718,7 +2717,7 @@ void do_linter(void)
|
||||
return;
|
||||
}
|
||||
|
||||
if (helpless && LINES > 4) {
|
||||
if (helpless && LINES > 5) {
|
||||
UNSET(NO_HELP);
|
||||
window_init();
|
||||
}
|
||||
@@ -2919,9 +2918,9 @@ void do_formatter(void)
|
||||
#endif /* ENABLE_COLOR */
|
||||
|
||||
#ifndef NANO_TINY
|
||||
/* Our own version of "wc". Note that its character counts are in
|
||||
/* Our own version of "wc". Note that the character count is in
|
||||
* multibyte characters instead of single-byte characters. */
|
||||
void do_wordlinechar_count(void)
|
||||
void count_lines_words_and_characters(void)
|
||||
{
|
||||
linestruct *was_current = openfile->current;
|
||||
size_t was_x = openfile->current_x;
|
||||
@@ -2960,7 +2959,7 @@ void do_wordlinechar_count(void)
|
||||
* incrementing the word count for each successful step. */
|
||||
while (openfile->current->lineno < botline->lineno ||
|
||||
(openfile->current == botline && openfile->current_x < bot_x)) {
|
||||
if (do_next_word(FALSE, TRUE))
|
||||
if (do_next_word(FALSE))
|
||||
words++;
|
||||
}
|
||||
|
||||
|
||||
114
src/winio.c
114
src/winio.c
@@ -182,20 +182,17 @@ void read_keys_from(WINDOW *win)
|
||||
bool timed = FALSE;
|
||||
#endif
|
||||
|
||||
/* On a one-row terminal, overwrite an unimportant message. */
|
||||
if (LINES == 1 && currmenu == MMAIN && lastmessage == HUSH)
|
||||
edit_refresh();
|
||||
|
||||
/* Before reading the first keycode, display any pending screen updates. */
|
||||
doupdate();
|
||||
|
||||
if (reveal_cursor && !hide_cursor && (LINES > 1 || lastmessage <= HUSH))
|
||||
if (reveal_cursor && (!spotlighted || ISSET(SHOW_CURSOR) || currmenu == MSPELL) &&
|
||||
(LINES > 1 || lastmessage <= HUSH))
|
||||
curs_set(1);
|
||||
|
||||
#ifndef NANO_TINY
|
||||
if (currmenu == MMAIN && (spotlighted || ((ISSET(MINIBAR) || LINES == 1) &&
|
||||
lastmessage > HUSH &&
|
||||
lastmessage != INFO && lastmessage < ALERT))) {
|
||||
if (currmenu == MMAIN && (((ISSET(MINIBAR) || ISSET(ZERO) || LINES == 1) &&
|
||||
lastmessage > HUSH && lastmessage < ALERT &&
|
||||
lastmessage != INFO) || spotlighted)) {
|
||||
timed = TRUE;
|
||||
halfdelay(ISSET(QUICK_BLANK) ? 8 : 15);
|
||||
disable_kb_interrupt();
|
||||
@@ -217,14 +214,16 @@ void read_keys_from(WINDOW *win)
|
||||
raw();
|
||||
|
||||
if (input == ERR) {
|
||||
if (spotlighted || LINES == 1) {
|
||||
if (spotlighted || ISSET(ZERO) || LINES == 1) {
|
||||
if (ISSET(ZERO) && lastmessage > VACUUM)
|
||||
wredrawln(edit, editwinrows - 1 , 1);
|
||||
lastmessage = VACUUM;
|
||||
spotlighted = FALSE;
|
||||
update_line(openfile->current, openfile->current_x);
|
||||
wnoutrefresh(edit);
|
||||
curs_set(1);
|
||||
}
|
||||
if (ISSET(MINIBAR) && LINES > 1)
|
||||
if (ISSET(MINIBAR) && !ISSET(ZERO) && LINES > 1)
|
||||
minibar();
|
||||
as_an_at = TRUE;
|
||||
place_the_cursor();
|
||||
@@ -250,8 +249,10 @@ void read_keys_from(WINDOW *win)
|
||||
|
||||
#ifndef NANO_TINY
|
||||
/* Cancel the highlighting of a search match, if there still is one. */
|
||||
refresh_needed |= spotlighted;
|
||||
spotlighted = FALSE;
|
||||
if (currmenu == MMAIN) {
|
||||
refresh_needed |= spotlighted;
|
||||
spotlighted = FALSE;
|
||||
}
|
||||
|
||||
/* If we got a SIGWINCH, get out as the win argument is no longer valid. */
|
||||
if (input == KEY_WINCH)
|
||||
@@ -506,8 +507,9 @@ int convert_SS3_sequence(const int *seq, size_t length, int *consumed)
|
||||
/* Translate a sequence that began with "Esc [" to its corresponding key code. */
|
||||
int convert_CSI_sequence(const int *seq, size_t length, int *consumed)
|
||||
{
|
||||
if (seq[0] < '9')
|
||||
if (seq[0] < '9' && length > 1)
|
||||
*consumed = 2;
|
||||
|
||||
switch (seq[0]) {
|
||||
case '1':
|
||||
if (length > 1 && seq[1] == '~')
|
||||
@@ -840,10 +842,6 @@ int parse_escape_sequence(int starter)
|
||||
keycode = convert_SS3_sequence(key_buffer, key_buffer_len, &consumed);
|
||||
else if (starter == '[')
|
||||
keycode = convert_CSI_sequence(key_buffer, key_buffer_len, &consumed);
|
||||
#ifndef NANO_TINY
|
||||
else
|
||||
die("Bad sequence starter -- please report a bug\n");
|
||||
#endif
|
||||
|
||||
/* Remove the consumed sequence bytes from the keystroke buffer. */
|
||||
key_buffer_len -= consumed;
|
||||
@@ -1110,7 +1108,8 @@ int parse_kbinput(WINDOW *win)
|
||||
} else if (keycode == shiftaltdown) {
|
||||
shift_held = TRUE;
|
||||
return KEY_NPAGE;
|
||||
}
|
||||
} else if ((KEY_F0 + 24) < keycode && keycode < (KEY_F0 + 64))
|
||||
return FOREIGN_SEQUENCE;
|
||||
#endif
|
||||
|
||||
#ifdef __linux__
|
||||
@@ -1247,7 +1246,8 @@ int parse_kbinput(WINDOW *win)
|
||||
case KEY_SCANCEL:
|
||||
return KEY_CANCEL;
|
||||
case KEY_SSUSPEND:
|
||||
return KEY_SUSPEND;
|
||||
case KEY_SUSPEND:
|
||||
return 0x1A; /* The ASCII code for Ctrl+Z. */
|
||||
case KEY_BTAB:
|
||||
return SHIFT_TAB;
|
||||
|
||||
@@ -1265,7 +1265,9 @@ int parse_kbinput(WINDOW *win)
|
||||
#ifdef KEY_RESIZE /* SunOS 5.7-5.9 doesn't know KEY_RESIZE. */
|
||||
case KEY_RESIZE:
|
||||
#endif
|
||||
case KEY_FLUSH:
|
||||
#ifndef NANO_TINY
|
||||
case KEY_FRESH:
|
||||
#endif
|
||||
return ERR; /* Ignore this keystroke. */
|
||||
}
|
||||
|
||||
@@ -1495,6 +1497,9 @@ char *get_verbatim_kbinput(WINDOW *win, size_t *count)
|
||||
/* Turn bracketed-paste mode back on. */
|
||||
printf("\x1B[?2004h");
|
||||
fflush(stdout);
|
||||
|
||||
if (ISSET(ZERO) && currmenu == MMAIN)
|
||||
wredrawln(edit, editwinrows - 1, 1);
|
||||
#endif
|
||||
|
||||
/* Turn flow control characters back on if necessary and turn the
|
||||
@@ -1676,40 +1681,38 @@ void blank_statusbar(void)
|
||||
/* Wipe the status bar clean and include this in the next screen update. */
|
||||
void wipe_statusbar(void)
|
||||
{
|
||||
lastmessage = VACUUM;
|
||||
|
||||
if (ISSET(ZERO) || ISSET(MINIBAR) || LINES == 1)
|
||||
return;
|
||||
|
||||
blank_row(bottomwin, 0);
|
||||
wnoutrefresh(bottomwin);
|
||||
lastmessage = VACUUM;
|
||||
}
|
||||
|
||||
/* Blank out the two help lines (when they are present). */
|
||||
void blank_bottombars(void)
|
||||
{
|
||||
if (!ISSET(NO_HELP) && LINES > 4) {
|
||||
if (!ISSET(NO_HELP) && LINES > 5) {
|
||||
blank_row(bottomwin, 1);
|
||||
blank_row(bottomwin, 2);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if the number of keystrokes needed to blank the status bar has
|
||||
* been pressed. If so, blank the status bar, unless constant cursor
|
||||
* position display is on and we are in the editing screen. */
|
||||
/* When some number of keystrokes has been reached, wipe the status bar. */
|
||||
void check_statusblank(void)
|
||||
{
|
||||
if (statusblank == 0)
|
||||
return;
|
||||
|
||||
statusblank--;
|
||||
|
||||
/* When editing and 'constantshow' is active, skip the blanking. */
|
||||
if (currmenu == MMAIN && ISSET(CONSTANT_SHOW) && LINES > 1)
|
||||
return;
|
||||
|
||||
if (statusblank == 0)
|
||||
if (--statusblank == 0)
|
||||
wipe_statusbar();
|
||||
|
||||
/* If the subwindows overlap, make sure to show the edit window now. */
|
||||
if (LINES == 1)
|
||||
edit_refresh();
|
||||
/* When windows overlap, make sure to show the edit window now. */
|
||||
if (currmenu == MMAIN && (ISSET(ZERO) || LINES == 1)) {
|
||||
wredrawln(edit, editwinrows - 1, 1);
|
||||
wnoutrefresh(edit);
|
||||
}
|
||||
}
|
||||
|
||||
/* Ensure that the status bar will be wiped upon the next keystroke. */
|
||||
@@ -2139,9 +2142,11 @@ void minibar(void)
|
||||
* plus a star when the file has been modified. */
|
||||
if (COLS > 4) {
|
||||
if (namewidth > COLS - 2) {
|
||||
thename = display_string(thename, namewidth - COLS + 5, COLS - 5, FALSE, FALSE);
|
||||
char *shortname = display_string(thename, namewidth - COLS + 5,
|
||||
COLS - 5, FALSE, FALSE);
|
||||
mvwaddstr(bottomwin, 0, 0, "...");
|
||||
waddstr(bottomwin, thename);
|
||||
waddstr(bottomwin, shortname);
|
||||
free(shortname);
|
||||
} else
|
||||
mvwaddstr(bottomwin, 0, padding, thename);
|
||||
|
||||
@@ -2245,16 +2250,12 @@ void minibar(void)
|
||||
* is higher than that of a message that is already there. */
|
||||
void statusline(message_type importance, const char *msg, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int colorpair;
|
||||
char *compound, *message;
|
||||
bool showed_whitespace = ISSET(WHITESPACE_DISPLAY);
|
||||
static size_t start_col = 0;
|
||||
char *compound, *message;
|
||||
bool bracketed;
|
||||
#ifndef NANO_TINY
|
||||
bool old_whitespace = ISSET(WHITESPACE_DISPLAY);
|
||||
|
||||
UNSET(WHITESPACE_DISPLAY);
|
||||
#endif
|
||||
int colorpair;
|
||||
va_list ap;
|
||||
|
||||
/* Ignore a message with an importance that is lower than the last one. */
|
||||
if (importance < lastmessage && lastmessage > NOTICE)
|
||||
@@ -2313,8 +2314,12 @@ void statusline(message_type importance, const char *msg, ...)
|
||||
|
||||
blank_statusbar();
|
||||
|
||||
UNSET(WHITESPACE_DISPLAY);
|
||||
|
||||
message = display_string(compound, 0, COLS, FALSE, FALSE);
|
||||
free(compound);
|
||||
|
||||
if (showed_whitespace)
|
||||
SET(WHITESPACE_DISPLAY);
|
||||
|
||||
start_col = (COLS - breadth(message)) / 2;
|
||||
bracketed = (start_col > 1);
|
||||
@@ -2336,12 +2341,9 @@ void statusline(message_type importance, const char *msg, ...)
|
||||
|
||||
/* Push the message to the screen straightaway. */
|
||||
wrefresh(bottomwin);
|
||||
free(message);
|
||||
|
||||
#ifndef NANO_TINY
|
||||
if (old_whitespace)
|
||||
SET(WHITESPACE_DISPLAY);
|
||||
#endif
|
||||
free(compound);
|
||||
free(message);
|
||||
|
||||
/* When requested, wipe the status bar after just one keystroke. */
|
||||
statusblank = (ISSET(QUICK_BLANK) ? 1 : 20);
|
||||
@@ -2394,7 +2396,7 @@ void bottombars(int menu)
|
||||
/* Set the global variable to the given menu. */
|
||||
currmenu = menu;
|
||||
|
||||
if (ISSET(NO_HELP) || LINES < 5)
|
||||
if (ISSET(NO_HELP) || LINES < 6)
|
||||
return;
|
||||
|
||||
/* Determine how many shortcuts must be shown. */
|
||||
@@ -3328,6 +3330,8 @@ bool current_is_above_screen(void)
|
||||
return (openfile->current->lineno < openfile->edittop->lineno);
|
||||
}
|
||||
|
||||
#define SHIM (ISSET(ZERO) && (currmenu == MREPLACEWITH || currmenu == MYESNO) ? 1 : 0)
|
||||
|
||||
/* Return TRUE if current[current_x] is beyond the viewport. */
|
||||
bool current_is_below_screen(void)
|
||||
{
|
||||
@@ -3338,14 +3342,14 @@ bool current_is_below_screen(void)
|
||||
|
||||
/* If current[current_x] is more than a screen's worth of lines after
|
||||
* edittop at column firstcolumn, it's below the screen. */
|
||||
return (go_forward_chunks(editwinrows - 1, &line, &leftedge) == 0 &&
|
||||
return (go_forward_chunks(editwinrows - 1 - SHIM, &line, &leftedge) == 0 &&
|
||||
(line->lineno < openfile->current->lineno ||
|
||||
(line->lineno == openfile->current->lineno &&
|
||||
leftedge < leftedge_for(xplustabs(), openfile->current))));
|
||||
} else
|
||||
#endif
|
||||
return (openfile->current->lineno >=
|
||||
openfile->edittop->lineno + editwinrows);
|
||||
openfile->edittop->lineno + editwinrows - SHIM);
|
||||
}
|
||||
|
||||
/* Return TRUE if current[current_x] is outside the viewport. */
|
||||
@@ -3466,7 +3470,7 @@ void adjust_viewport(update_type manner)
|
||||
else if (manner == CENTERING)
|
||||
goal = editwinrows / 2;
|
||||
else if (!current_is_above_screen())
|
||||
goal = editwinrows - 1;
|
||||
goal = editwinrows - 1 - SHIM;
|
||||
|
||||
openfile->edittop = openfile->current;
|
||||
#ifndef NANO_TINY
|
||||
|
||||
@@ -36,13 +36,12 @@ pkgdata_DATA = asm.nanorc \
|
||||
tcl.nanorc \
|
||||
tex.nanorc \
|
||||
texinfo.nanorc \
|
||||
xml.nanorc
|
||||
xml.nanorc \
|
||||
yaml.nanorc
|
||||
|
||||
nobase_pkgdata_DATA = \
|
||||
extra/ada.nanorc \
|
||||
extra/debian.nanorc \
|
||||
extra/fortran.nanorc \
|
||||
extra/gentoo.nanorc \
|
||||
extra/haskell.nanorc \
|
||||
extra/povray.nanorc \
|
||||
extra/spec.nanorc
|
||||
|
||||
@@ -11,8 +11,8 @@ color brightyellow "\.(ascii|asciz|byte|double|float|hword|int|long|short|single
|
||||
color brightred "^[[:blank:]]*[.0-9A-Za-z_]*:"
|
||||
color brightcyan "^[[:blank:]]*#[[:blank:]]*(define|undef|include|ifn?def|endif|elif|else|if|warning|error)"
|
||||
|
||||
# Strings.
|
||||
color brightyellow "<[^= ]*>" ""(\\.|[^"])*""
|
||||
# Strings and names of included files.
|
||||
color brightyellow ""([^"\]|\\.)*"|<[^= ]*>"
|
||||
|
||||
# Comments.
|
||||
color brightblue "//.*"
|
||||
|
||||
@@ -17,7 +17,7 @@ color cyan "\<[[:upper:]_[:digit:]]+\>"
|
||||
color red "\<[-_.0-9]+\>"
|
||||
|
||||
# Strings:
|
||||
color red ""[^"]*"" "'[^']*'"
|
||||
color red ""[^"]*"|'[^']*'"
|
||||
|
||||
# Backticks:
|
||||
color green "`[^`]*`"
|
||||
|
||||
@@ -29,9 +29,9 @@ color magenta "\<(and|compl|lshift|or|rshift|xor)\>"
|
||||
color magenta "\<(bindtextdomain|dcgettext|dcngettext)\>"
|
||||
|
||||
# Strings.
|
||||
color brightyellow "<[^= ]*>" ""(\\.|[^"])*""
|
||||
color brightyellow ""([^"\]|\\.)*""
|
||||
# Comments.
|
||||
color brightblue "(^|[[:blank:]])#.*$"
|
||||
color brightblue "(^|[[:blank:]])#.*"
|
||||
|
||||
# Trailing whitespace.
|
||||
color ,green "[[:space:]]+$"
|
||||
|
||||
@@ -23,17 +23,16 @@ color brightyellow "\<(try|throw|catch|operator|new|delete)\>"
|
||||
color magenta "\<(break|continue|goto|return)\>"
|
||||
|
||||
# Single-quoted stuff (characters, backslash escapes, hex and octal byte codes).
|
||||
color brightmagenta "'([^'\]|\\(["'\abfnrtv]|x[0-9A-Fa-f]{1,2}|[0-3]?[0-7]{1,2}))'"
|
||||
color brightmagenta "'([^'\]|\\(["'\abfnrtv]|x[[:xdigit:]]{1,2}|[0-3]?[0-7]{1,2}))'"
|
||||
|
||||
# GCC builtins.
|
||||
color cyan "__attribute__[[:blank:]]*\(\([^)]*\)\)" "__(aligned|asm|builtin|hidden|inline|packed|restrict|section|typeof|weak)__"
|
||||
|
||||
# Strings. (In general you will want your strings and comments to come last,
|
||||
# because highlighting rules are applied in the order they are read in.)
|
||||
# Strings and names of included files.
|
||||
color brightyellow ""([^"]|\\")*"" "#[[:blank:]]*include[[:blank:]]*<[^>]+>"
|
||||
|
||||
# Preprocessor directives.
|
||||
color brightcyan start="^[[:blank:]]*#[[:blank:]]*(if(n?def)?|elif|warning|error|pragma)\>" end="(\`|[^\\])$"
|
||||
color brightcyan start="^[[:blank:]]*#[[:blank:]]*(if(n?def)?|elif|warning|error|pragma)\>" end="(\`|[^\])$"
|
||||
color brightcyan "^[[:blank:]]*#[[:blank:]]*((define|else|endif|include(_next)?|line|undef)\>|$)"
|
||||
|
||||
# Comments.
|
||||
|
||||
@@ -13,13 +13,13 @@ color red "^(19|20)[0-9-]{8}"
|
||||
color yellow "<[^>]*@[^>]*>"
|
||||
|
||||
# Command-line options.
|
||||
color cyan "[[:blank:]]-[a-zA-Z\$]" "--[8a-z-]+"
|
||||
color cyan "[[:blank:]]-[a-zA-Z\$]|--[8a-z-]+"
|
||||
# Bug and patch numbers.
|
||||
color cyan "(BZ|bug|patch)[ ]#[0-9]+" "PR [[:alnum:]]+/[0-9]+"
|
||||
color cyan "(BZ|bug|patch)[ ]#[0-9]+|PR [[:alnum:]]+/[0-9]+"
|
||||
# Probable constants, for variety.
|
||||
color brightred "\<[A-Z_][0-9A-Z_]+\>"
|
||||
# Key sequences.
|
||||
color brightblue "\^[A-Z^\]" "\<M-." "\<F1?[0-9]" "(\^|M-)Space"
|
||||
color brightblue "\^[A-Z^\]|\<M-.|\<F1?[0-9]|(\^|M-)Space"
|
||||
|
||||
# Changed files.
|
||||
color magenta start="^( | {8})\* " end="(:( |$)|^$)"
|
||||
|
||||
@@ -15,5 +15,8 @@ icolor brightred "^[[:blank:]]*((end)?(function|macro)|return)"
|
||||
icolor cyan start="\$(ENV)?\{" end="\}"
|
||||
color magenta "\<(APPLE|UNIX|WIN32|CYGWIN|BORLAND|MINGW|MSVC(_IDE|60|71|80|90)?)\>"
|
||||
|
||||
# Comments.
|
||||
color brightblue "(^|[[:blank:]])#.*"
|
||||
|
||||
# Trailing whitespace.
|
||||
color ,green "[[:space:]]+$"
|
||||
|
||||
@@ -4,17 +4,17 @@ syntax css "\.css$"
|
||||
comment "/*|*/"
|
||||
|
||||
# First make everything red:
|
||||
color brightred "."
|
||||
color brightred "."
|
||||
# Then everything between braces yellow:
|
||||
color brightyellow start="\{" end="\}"
|
||||
color brightyellow start="\{" end="\}"
|
||||
# Then everything after a colon white:
|
||||
color brightwhite start=":" end="([;^{]|$)"
|
||||
color brightwhite start=":" end="([;^{]|$)"
|
||||
|
||||
# Pseudo-classes:
|
||||
color brightcyan ":(active|checked|focus|hover|link|visited|after|before)\>"
|
||||
color brightcyan ":(active|checked|focus|hover|link|visited|after|before)\>"
|
||||
|
||||
# Comments:
|
||||
color brightblue start="/\*" end="\*/"
|
||||
color brightblue start="/\*" end="\*/"
|
||||
|
||||
# Syntactic characters:
|
||||
color green ";|:|\{|\}"
|
||||
color green ";|:|\{|\}"
|
||||
|
||||
@@ -4,20 +4,27 @@
|
||||
syntax default
|
||||
comment "#"
|
||||
|
||||
# Comments.
|
||||
color cyan "^[[:blank:]]*#.*"
|
||||
|
||||
# Spaces in front of tabs.
|
||||
color ,red " + +"
|
||||
|
||||
# Nano's name, including version.
|
||||
color brightred "(GNU )?[Nn]ano [1-5]\.[0-9][-.[:alnum:]]*\>"
|
||||
# Nano's release motto, then name plus version.
|
||||
color italic,lime "\<[Nn]ano [1-6]\.[0-9][-.[:alnum:]]* "[^"]+""
|
||||
color brightred "\<(GNU )?[Nn]ano [1-6]\.[0-9][-.[:alnum:]]*\>"
|
||||
|
||||
# Dates
|
||||
color latte "\<[12][0-9]{3}\.(0[1-9]|1[012])\.(0[1-9]|[12][0-9]|3[01])\>"
|
||||
|
||||
# Email addresses.
|
||||
color magenta "<[[:alnum:].%_+-]+@[[:alnum:].-]+\.[[:alpha:]]{2,}>"
|
||||
|
||||
# URLs.
|
||||
color lightblue "\<https?://\S+\.\S+[^[:space:],.)]"
|
||||
|
||||
# Bracketed captions in certain config files.
|
||||
color brightgreen "^\[[^][]+\]$"
|
||||
|
||||
# Comments.
|
||||
color cyan "^[[:blank:]]*#.*"
|
||||
|
||||
# Control codes.
|
||||
color latte "[[:cntrl:]]"
|
||||
color orange "[[:cntrl:]]"
|
||||
|
||||
@@ -28,6 +28,6 @@ color brightred "\<(t|nil)\>"
|
||||
color blue ":(\w|[?-])+"
|
||||
# Strings
|
||||
color yellow start="^[[:blank:]]+"" end="[^\]""
|
||||
color yellow ""(\\.|[^"])*""
|
||||
color yellow ""([^"\]|\\.)*""
|
||||
# Comments
|
||||
color cyan "(^|[[:blank:]]);.*"
|
||||
|
||||
@@ -11,7 +11,7 @@ color yellow "^> ?> ?>.*"
|
||||
color brightmagenta "<[^@]+@[^@]+>"
|
||||
|
||||
# URLs.
|
||||
color brightblue "(https?|ftp)://\S+\.\S+[^\s.)]"
|
||||
color brightblue "(https?|ftp)://\S+\.\S+[^[:space:].)]"
|
||||
|
||||
# Signatures, even quoted ones.
|
||||
color yellow start="^>* ?-- $" end="^>* ?$"
|
||||
|
||||
@@ -30,7 +30,7 @@ color cyan "'[[:alnum:]]+"
|
||||
color green "\<[0-9][0-9A-Fa-f_#.+-]*"
|
||||
|
||||
# Characters / Strings
|
||||
color red "'.'" ""[^"]*""
|
||||
color red "'.'|"[^"]*""
|
||||
|
||||
# Comments
|
||||
color brightblue "--.*"
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
## Syntax highlighting for apt's sources.list.
|
||||
|
||||
syntax sources.list "sources\.list(\.d/.*\.list)?(~|\.old|\.save)?$"
|
||||
comment "#"
|
||||
|
||||
# Coloring the deb lines, working from tail to head. First the
|
||||
# components -- well, everything, and thus also the components.
|
||||
color brightmagenta "^deb.*"
|
||||
# Distribution -- well, everything, except the components.
|
||||
color brightred "^deb(-src)?\s+.*((ftp|https?|rsh|ssh|copy|file|spacewalk|tor):/\S+|cdrom:\[.+\]/)\s+\S+"
|
||||
# URIs.
|
||||
color brightgreen "^deb(-src)?\s+.*(ftp|https?|rsh|ssh|copy|file|spacewalk|tor):/\S+"
|
||||
# CDroms.
|
||||
color brightgreen "^deb(-src)?\s+.*cdrom:\[.+\]/"
|
||||
# Options.
|
||||
color brightcyan "^deb(-src)?\s+\[.+\]\s+"
|
||||
# And finally the initial deb tag.
|
||||
color yellow "^deb(-src)?"
|
||||
|
||||
# Comments.
|
||||
color brightblue "#.*"
|
||||
@@ -34,7 +34,7 @@ icolor yellow "\<(.or.|repeat|select case|then|where|while)\>"
|
||||
icolor magenta "\<(continue|cycle|exit|go?to|result|return)\>"
|
||||
|
||||
# Strings.
|
||||
color yellow "<[^= ]*>" ""(\\.|[^"])*""
|
||||
color yellow ""([^"\]|\\.)*""
|
||||
|
||||
# Comments.
|
||||
color blue "!.*"
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
## Syntax highlighting for Gentoo ebuilds/eclasses,
|
||||
## and (further down) for Portage control files.
|
||||
|
||||
syntax ebuild "\.e(build|class)$"
|
||||
comment "#"
|
||||
|
||||
## All the standard portage functions:
|
||||
color brightgreen "(^|\<default_)src_(unpack|prepare|configure|compile|install|test)\>"
|
||||
color brightgreen "^pkg_(config|nofetch|info|pretend|setup|(pre|post)(inst|rm))\>"
|
||||
color brightgreen "\<default(_pkg_nofetch|_src_(unpack|prepare|configure|compile|test))?\>"
|
||||
## Bash-related syntax:
|
||||
color green "\<(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 "-[defhnrsuwxzL]\>"
|
||||
color green "-(eq|ne|gt|lt|ge|le)\>"
|
||||
## Variables... official portage ones in red, all others in bright red:
|
||||
color brightred "\$[-0-9@*#?$!]" "\$[[:alpha:]_][[:alnum:]_]*"
|
||||
color brightred "\$\{[#!]?([-@*#?$!]|[0-9]+|[[:alpha:]_][[:alnum:]_]*)(\[([[:digit:]]|@)+\])?(([#%/]|:?[-=?+])[^}]*\}|\[|\})"
|
||||
color red "\<(EAPI|ARCH|HOMEPAGE|DESCRIPTION|IUSE|SRC_URI|LICENSE|SLOT|KEYWORDS|[BIPR]?DEPEND|PROVIDE|PROPERTIES|REQUIRED_USE|RESTRICT|USERLAND)\>"
|
||||
color red "\<(S|E?D|T|PV|PF|P|PN|PR|PVR|A|CATEGORY|DISTDIR|FILESDIR|EPREFIX|(B|E|E?SYS)?ROOT|WORKDIR)\>"
|
||||
color red "\<(AS|C(PP|XX)?|LD)FLAGS\>" "\<C(HOST|TARGET|BUILD)\>" "\<(MERGE_TYPE|REPLACING_VERSIONS|REPLACED_BY_VERSION)\>"
|
||||
color red "\<EBUILD_PHASE(_FUNC)?\>"
|
||||
color red "\<QA_((TEXTRELS|EXECSTACK|WX_LOAD)(_[a-zA-Z_0-9]+)?|DT_HASH|PRESTRIPPED)\>"
|
||||
color red "\<(PATCHES|(HTML_)?DOCS)\>" "\<WANT_(AUTO(CONF|MAKE)|LIBTOOL)\>" "\<AT_M4DIR\>"
|
||||
## Portage commands:
|
||||
color magenta "\<(use(_(with|enable|if_iuse)|x)?|in_iuse) [!a-zA-Z0-9_+ -]*" "inherit.*"
|
||||
color brightblue "\<e(apply(_user)?|begin|end|conf|install|make|ninja|qmake5|ant|(qa)?warn|infon?|error|log|patch(_user)?|new(group|user))\>"
|
||||
color brightblue "\<e(pause|beep|mktemp|(cvs|svn)_clean|punt_cxx)\>" "\<e(aclocal|auto(reconf|header|conf|make)|libtoolize)\>"
|
||||
color brightblue "\<e(stack|shopts|umask)_(push|pop)\>" "\<get_libdir\>" "\<ver_(cut|rs|test)\>" "\<version_is_at_least\>"
|
||||
color brightblue "\<make_desktop_entry\>" "\<unpack(_(makeself|pdv))?\>"
|
||||
color brightblue "\<(die|hasv?|inherit|nonfatal)\>" "\<(use(_(with|enable|if_iuse)|x)?|in_iuse)\>" "\<(has|best)_version\>"
|
||||
color brightblue "\<(do|new)(ins|s?bin|doc|header|lib(\.so|\.a)?|man|info|exe|initd|confd|envd|pam|menu|icon)\>"
|
||||
color brightblue "\<do(compress|dir|html|mo|strip|sym)\>" "\<keepdir\>"
|
||||
color brightblue "\<prepall(docs|info|man|strip)?\>" "\<prep(info|lib|lib\.(so|a)|man|strip)\>"
|
||||
color brightblue "\<(doc|ins|exe)?into\>" "\<f(owners|perms)\>" "\<(exe|ins|dir)opts\>"
|
||||
color brightblue "\<tc-get(BUILD_)?(AR|AS|CC|CPP|CXX|LD|NM|OBJCOPY|PKG_CONFIG|RANLIB)\>"
|
||||
color brightblue "\<tc-(arch(-kernel)?|export|has-(tls|openmp)|is-cross-compiler)\>"
|
||||
## Common commands used in ebuilds:
|
||||
color blue "\<(awk|cat|cd|chmod|chown|cp|echo|env|find|e?grep|ln|make|mkdir|mv|popd|printf|pushd|rm|rmdir|sed|set|tar|touch|unset|xargs)\>"
|
||||
## Comments (doesn't work that well):
|
||||
color yellow "(^|[[:space:]])#.*"
|
||||
## Strings (doesn't work that well):
|
||||
color brightyellow ""(\\.|[^\"])*"" "'(\\.|[^'])*'"
|
||||
## Trailing space is bad!
|
||||
color ,green "[[:space:]]+$"
|
||||
## Mixed whitespace is also bad.
|
||||
color ,green " "
|
||||
|
||||
|
||||
syntax /etc/portage "\.(accept_keywords|env|keywords|mask|unmask|use)(/.+)?$"
|
||||
comment "#"
|
||||
|
||||
## Base text:
|
||||
color green ".+"
|
||||
## Likely version and slot numbers:
|
||||
color magenta "-[[:digit:].]+(_(alpha|beta|pre|rc|p)[[:digit:]]*)*(-r[[:digit:]]+)?([:[:space:]]|$)"
|
||||
color magenta ":[^[:space:]]+([[:space:]]|$)"
|
||||
## Use flags (must come after version/slot):
|
||||
color brightred "[[:space:]]+\+?[A-Za-z0-9+_@-]+"
|
||||
color brightblue "[[:space:]]+-[A-Za-z0-9+_@-]+"
|
||||
## Accepted arches:
|
||||
color white "[~-]?\<(alpha|amd64|arm(64)?|hppa|ia64|m68k|mips|ppc(64)?|riscv|s390|sparc|x86)(-(cygwin|linux|macos|solaris|winnt))?\>"
|
||||
color white "[[:space:]][*~-]?\*"
|
||||
## Categories:
|
||||
color cyan "^[[:space:]]*[^/]*/"
|
||||
## Masking regulators:
|
||||
color brightmagenta "^[[:space:]]*(=|~|<|<=|>|>=)"
|
||||
## Comments:
|
||||
color yellow "#.*"
|
||||
## Trailing space is bad!
|
||||
color ,green "[[:space:]]+$"
|
||||
## Mixed whitespace is also bad.
|
||||
color ,green " "
|
||||
@@ -28,9 +28,9 @@ color magenta "\<(Bounded|Data|Enum|Eq|Floating|Fractional|Functor|Integral|Mona
|
||||
color brightred "undefined"
|
||||
|
||||
# Strings
|
||||
color yellow ""([^\"]|\\.)*""
|
||||
color yellow ""([^"\]|\\.)*""
|
||||
# Characters
|
||||
color brightyellow "'([^\']|\\.)'"
|
||||
color brightyellow "'([^'\]|\\.)'"
|
||||
|
||||
# Comments
|
||||
color green "--.*"
|
||||
|
||||
@@ -26,17 +26,16 @@ color magenta "\<(break|continue|fallthrough|goto|return)\>"
|
||||
color brightcyan "\<(package|import)\>"
|
||||
|
||||
# Literals.
|
||||
color red "\<([1-9][0-9]*|0[0-7]*|0[xX][0-9A-Fa-f]+)\>"
|
||||
color red "\<(true|false|nil|iota|_)\>"
|
||||
color red "\<([1-9][0-9]*|0[0-7]*|0[xX][[:xdigit:]]+)\>"
|
||||
color red "\<[0-9]+\.[0-9]*([eE][+-]?[0-9]+)?i?\>"
|
||||
color red "\<[0-9]+[eE][+-]?[0-9]+i?\>"
|
||||
color red "\B\.[0-9]+([eE][+-]?[0-9]+)?i?\>"
|
||||
color red "\<[0-9]+i\>"
|
||||
|
||||
# Strings and characters; slightly fuzzy.
|
||||
color red "\<(true|false|nil|iota|_)\>"
|
||||
color red "'(\\.|[^'])+'"
|
||||
color red ""(\\.|[^"])*""
|
||||
color red start=""(\\.|[^"])*\\[[:blank:]]*$" end="^(\\.|[^"])*""
|
||||
color red ""([^"\]|\\.)*"|'([^'\]|\\.)+'"
|
||||
color red start=""([^"\]|\\.)*\\[[:blank:]]*$" end="^([^"\]|\\.)*""
|
||||
|
||||
# Comments.
|
||||
color brightblue "//.*"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
## Syntax highlighting for groff.
|
||||
|
||||
syntax groff "(/tmac\.[^/]+$|\.(m[ems]|rof|tmac)$)"
|
||||
syntax groff "\.(m[ems]|rof|tmac)$|/tmac\.[^/]+$"
|
||||
comment ".\""
|
||||
|
||||
# The argument of .ds or .nr
|
||||
|
||||
@@ -11,14 +11,13 @@ color brightcyan "\<define(-macro|-module|-public|-syntax)?\>"
|
||||
# Quoted symbols
|
||||
color brightyellow "'\<(\w|-)+\>"
|
||||
# Chars
|
||||
color brightmagenta "#\\."
|
||||
color brightmagenta "#\\\w+\>"
|
||||
color brightmagenta "#\\(.|\w+)"
|
||||
# Booleans
|
||||
color brightred "(#t|#f)\>"
|
||||
# Keywords
|
||||
color blue "#?:(\w|[?-])+"
|
||||
# Strings
|
||||
color yellow start="^[[:blank:]]+"" end="[^\]""
|
||||
color yellow ""(\\.|[^"])*""
|
||||
color yellow ""([^"\]|\\.)*""
|
||||
# Comments
|
||||
color cyan "(^|[[:blank:]]);.*"
|
||||
|
||||
@@ -25,7 +25,7 @@ color red "\<(rows(pan)?|rules|scheme|scope|scrolling|selected|shape|size|span|s
|
||||
color red "\<(tabindex|target|text|title|type|usemap|valign|value(type)?|vlink|vspace|width|xmlns|xml:space)="
|
||||
|
||||
# Strings:
|
||||
color green ""(\\.|[^"])*""
|
||||
color green ""([^"\]|\\.)*""
|
||||
|
||||
# Comments:
|
||||
color yellow start="<!--" end="-->"
|
||||
|
||||
@@ -12,12 +12,12 @@ color brightyellow "\<(await|export|import|throw|try|catch|finally|new|delete)\>
|
||||
color magenta "\<(break|continue|return|yield)\>"
|
||||
|
||||
# Octal/decimal and hexadecimal numbers.
|
||||
color cyan "\<([0-9]+|0x[0-9A-Fa-f]+)\>"
|
||||
color cyan "\<([0-9]+|0x[[:xdigit:]]+)\>"
|
||||
# Special values.
|
||||
color cyan "\<(true|false|null|undefined)\>"
|
||||
|
||||
# Strings.
|
||||
color brightmagenta ""(\\.|[^"])*"" "'(\\.|[^'])*'" "`(\\.|[^`])*`"
|
||||
color brightmagenta ""([^"\]|\\.)*"|'([^'\]|\\.)*'|`([^`\]|\\.)*`"
|
||||
# Comments.
|
||||
color brightblue "(^|[[:blank:]])//.*"
|
||||
color brightblue start="/\*" end="\*/"
|
||||
|
||||
@@ -12,9 +12,9 @@ color green ":[[:blank:]]*\-?(0|[1-9][0-9]*)(\.[0-9]+)?([Ee]?[-+]?[0-9]+)?"
|
||||
# Values (well, any string).
|
||||
color brightmagenta "".+""
|
||||
# Hex numbers (used as value).
|
||||
color green ":[[:blank:]]*"#[0-9abcdefABCDEF]+""
|
||||
color green ":[[:blank:]]*"#[[:xdigit:]]+""
|
||||
# Escapes.
|
||||
color green "\\\\" "\\"" "\\[bfnrt]" "\\u[0-9abcdefABCDEF]{4})"
|
||||
color green "\\(["\/bfnrt]|u[[:xdigit:]]{4})"
|
||||
# Special words.
|
||||
color green "\<(true|false|null)\>"
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ color brightmagenta "\<(false|nil|true)\>"
|
||||
|
||||
# Decimal and hexadecimal numbers
|
||||
color red "\<[0-9]+(\.[0-9]*)?([Ee][+-]?[0-9]+)?\>"
|
||||
color red "\<0x[0-9A-Fa-f]+(\.[0-9A-Fa-f]*)?([Pp][+-]?[0-9]+)?\>"
|
||||
color red "\<0x[[:xdigit:]]+(\.[[:xdigit:]]*)?([Pp][+-]?[0-9]+)?\>"
|
||||
|
||||
# Brackets
|
||||
color brightmagenta "\(|\)|\[|\]|\{|\}"
|
||||
@@ -54,7 +54,7 @@ color brightmagenta "\(|\)|\[|\]|\{|\}"
|
||||
color brightcyan "^#!.*"
|
||||
|
||||
# Strings
|
||||
color red ""(\\.|[^"\])*"|'(\\.|[^'\])*'"
|
||||
color red ""([^"\]|\\.)*"|'([^'\]|\\.)*'"
|
||||
|
||||
# Simple comments and multiline comments
|
||||
color green "--.*"
|
||||
|
||||
@@ -1,35 +1,39 @@
|
||||
## Syntax highlighting for nanorc files.
|
||||
|
||||
syntax nanorc "\.?nanorc(\.in)?$"
|
||||
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|grey|gray)?(,(((light)?(white|black|red|blue|green|yellow|magenta|cyan))|normal|pink|purple|mauve|lagoon|mint|lime|peach|orange|latte|grey|gray))?\>"
|
||||
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}))?\>"
|
||||
|
||||
# Keywords
|
||||
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|suspendable|tabstospaces|trimblanks|unix|wordbounds|zap)\>"
|
||||
# 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|browser|whereisfile|gotodir|execute|spell|linter|all)([[:blank:]]+#|[[:blank:]]*$)"
|
||||
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:]]+(all|main|search|replace(with)?|yesno|gotoline|writeout|insert|ext(ernal)?cmd|help|spell|linter|browser|whereisfile|gotodir)([[:blank:]]+#|[[:blank:]]*$)"
|
||||
color brightgreen "^[[:blank:]]*extendsyntax[[:blank:]]+[[:alpha:]]+[[:blank:]]+(i?color|header|magic|comment|formatter|linter|tabgives)[[:blank:]]+.*"
|
||||
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:]]+.+)"
|
||||
color green "^[[:blank:]]*((un)?(bind|set)|include|syntax|header|magic|comment|formatter|linter|tabgives|extendsyntax)\>"
|
||||
|
||||
# Strings
|
||||
color brightmagenta "([[:blank:]]|(start|end)=)".+"([[:blank:]]|$)"
|
||||
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:]]"
|
||||
|
||||
# Color commands
|
||||
color magenta "^[[:blank:]]*i?color\>" "\<(start|end)="
|
||||
|
||||
# Comments
|
||||
color brightblue "(^|[[:blank:]]+)#.*"
|
||||
color brightblue "^[[:blank:]]*#.*|[[:blank:]]#.{0,2}[^[:xdigit:]].*"
|
||||
color cyan "^[[:blank:]]*##.*"
|
||||
|
||||
# Trailing whitespace
|
||||
|
||||
@@ -25,9 +25,11 @@ color cyan "(^|[[:blank:]])#.*"
|
||||
# Trailing whitespace
|
||||
color ,green "[[:space:]]+$"
|
||||
|
||||
# Strings and others
|
||||
color yellow ""(\\.|[^"])*"" "'(\\.|[^'])*'"
|
||||
color green "[{}():;|`$<>!=&\\]" "(\]|\[)"
|
||||
# Strings
|
||||
color yellow ""([^"\]|\\.)*"|'([^'\]|\\.)*'"
|
||||
|
||||
# Syntactic symbols
|
||||
color green "[][{}():;|`$<>!=&\]"
|
||||
|
||||
# Basic variable names
|
||||
color brightred "(\$|@)[[:alpha:]_-][[:alnum:]_.-]*"
|
||||
|
||||
@@ -4,7 +4,7 @@ syntax m "\.m$"
|
||||
magic "Objective-C source"
|
||||
comment "//"
|
||||
|
||||
# Stuffs,
|
||||
# Stuffs.
|
||||
color brightwhite "\<[A-Z_][0-9A-Z_]+\>"
|
||||
color green "\<(float|double|BOOL|bool|char|int|short|long|id|sizeof|enum|void|static|const|struct|union|typedef|extern|(un)?signed|inline)\>"
|
||||
color green "\<[[:alpha:]_][[:alnum:]_]*_t\>"
|
||||
@@ -24,9 +24,9 @@ color magenta "[[:alnum:]]*:"
|
||||
color white "\[[^][:blank:]]*\]"
|
||||
|
||||
# Strings.
|
||||
color brightblack "'([^'\]|(\\["'abfnrtv\\]))'" "'\\(([0-3]?[0-7]{1,2}))'" "'\\x[0-9A-Fa-f]{1,2}'"
|
||||
color brightblack "<[^= ]*>" ""(\\.|[^"])*""
|
||||
color brightblue "@"(\\.|[^"])*""
|
||||
color brightblack "'([^'\]|\\(["'\abfnrtv]|x[[:xdigit:]]{1,2}|[0-3]?[0-7]{1,2}))'"
|
||||
color brightblack "<[^= ]*>|"([^"\]|\\.)*""
|
||||
color brightblue "@"([^"\]|\\.)*""
|
||||
|
||||
# Preprocessor commands.
|
||||
color brightblue "^[[:blank:]]*#[[:blank:]]*(define|include|import|(un|ifn?)def|endif|el(if|se)|if|warning|error)"
|
||||
|
||||
@@ -26,5 +26,5 @@ color green "\<(include|inherit|initializer)\>"
|
||||
color yellow "\<(new|ref|mutable|lazy|assert|raise)\>"
|
||||
# Comments:
|
||||
color white start="\(\*" end="\*\)"
|
||||
# Strings: (no multiline handling yet)
|
||||
color brightblack ""[^\"]*""
|
||||
# Strings:
|
||||
color brightblack ""[^"\]*""
|
||||
|
||||
@@ -25,7 +25,7 @@ color brightcyan "\<(and|or|xor)\>"
|
||||
color magenta "\<(break|continue|goto|return)\>"
|
||||
|
||||
# Strings.
|
||||
color brightyellow ""(\.|[^"])*"" "'(\.|[^'])*'"
|
||||
color brightyellow ""([^"\]|\\.)*"|'([^'\]|\\.)*'"
|
||||
|
||||
# Comments.
|
||||
color brightblue "(^|[[:blank:]]+)//.*"
|
||||
|
||||
@@ -7,7 +7,7 @@ syntax po "\.pot?$"
|
||||
comment "#"
|
||||
|
||||
# Comments.
|
||||
color green "^#.*$"
|
||||
color green "^#.*"
|
||||
color yellow "Copyright|\(C\)"
|
||||
# Header fields.
|
||||
color brightred "^"X-Bugs:.*"$"
|
||||
@@ -25,7 +25,7 @@ color yellow " (no-)?[-[:alpha:]]+-format(,|$)"
|
||||
color brightmagenta "%([1-9]\$)?[#0 +'I-]?(\*([1-9]\$)?|[1-9](\.[0-9]?)?)?[hlLjzt]?[diouxXeEfFgGaAcspnm%]"
|
||||
# Quotes and escaped characters.
|
||||
color yellow """
|
||||
color cyan "\\([abcefnrtv"\]|x[0-9abcdefABCDEF]{2}|[0-7]{3})"
|
||||
color cyan "\\([abcefnrtv"\]|x[[:xdigit:]]{2}|[0-7]{3})"
|
||||
# Reminders.
|
||||
color brightwhite,yellow "\<(FIXME|TODO|XXX)\>"
|
||||
# Obsolete strings.
|
||||
|
||||
@@ -24,14 +24,17 @@ color brightcyan "\<(exec|print)([[:blank:]]|$)"
|
||||
color brightmagenta "\<(False|None|True)\>"
|
||||
|
||||
# Mono-quoted strings.
|
||||
color brightgreen "'([^'\]|\\.)*'|'''"
|
||||
color brightgreen ""([^"\]|\\.)*"|""""
|
||||
color brightgreen "'([^'\]|\\.)*'|"([^"\]|\\.)*"|'''|""""
|
||||
color normal "'''|""""
|
||||
# Comments.
|
||||
color brightred "(^|[[:blank:]])#.*"
|
||||
# Triple-quoted strings.
|
||||
color brightgreen start="'''([^'),]|$)" end="(^|[^(\])'''"
|
||||
color brightgreen start=""""([^"),]|$)" end="(^|[^(\])""""
|
||||
color brightgreen start="'''([^'),]|$)" end="(^|[^(\])'''"
|
||||
color brightgreen start=""""([^"),]|$)" end="(^|[^(\])""""
|
||||
|
||||
# Backslash escapes.
|
||||
color lime "\\($|[\'"abfnrtv]|[0-3]?[0-7]?[0-7]|x[[:xdigit:]]{2})"
|
||||
color lime "\\(N\{[[:alpha:]]+\}|u[[:xdigit:]]{4}|U[[:xdigit:]]{8})"
|
||||
|
||||
# Reminders.
|
||||
color brightwhite,yellow "\<(FIXME|TODO|XXX)\>"
|
||||
|
||||
@@ -16,20 +16,23 @@ color yellow "\<(next|nil|not|or|redo|rescue|retry|return|self|super|then|true|u
|
||||
color magenta "([ ]|^):[0-9A-Za-z_]+\>"
|
||||
# Some unique things we want to stand out.
|
||||
color brightyellow "\<(__FILE__|__LINE__)\>"
|
||||
|
||||
# Regular expressions.
|
||||
color brightmagenta "/([^/]|(\\/))*/[iomx]*" "%r\{([^}]|(\\}))*\}[iomx]*"
|
||||
# Shell command expansion is in `backticks` or like %x{this}. These are
|
||||
# "double-quotish" (to use a perlism).
|
||||
color brightblue "`[^`]*`" "%x\{[^}]*\}"
|
||||
color brightmagenta "(/([^/]|\\/)*/|%r\{([^}]|\\\})*\})[iomx]*"
|
||||
# Shell command expansion is in `backticks` or like %x{this}.
|
||||
color brightblue "`[^`]*`|%x\{[^}]*\}"
|
||||
|
||||
# Strings, double-quoted.
|
||||
color green ""([^"]|(\\"))*"" "%[QW]?\{[^}]*\}" "%[QW]?\([^)]*\)" "%[QW]?<[^>]*>" "%[QW]?\[[^]]*\]" "%[QW]?\$[^$]*\$" "%[QW]?\^[^^]*\^" "%[QW]?![^!]*!"
|
||||
# Expression substitution. These go inside double-quoted strings,
|
||||
# "like #{this}".
|
||||
color green ""([^"]|\\")*"" "%[QW]?(\{[^}]*\}|\([^)]*\)|<[^>]*>|\[[^]]*\]|\$[^$]*\$|\^[^^]*\^|![^!]*!)"
|
||||
# Expression substitution for inside double-quoted strings, "like #{this}".
|
||||
color brightgreen "#\{[^}]*\}"
|
||||
# Strings, single-quoted.
|
||||
color green "'([^']|(\\'))*'" "%[qw]\{[^}]*\}" "%[qw]\([^)]*\)" "%[qw]<[^>]*>" "%[qw]\[[^]]*\]" "%[qw]\$[^$]*\$" "%[qw]\^[^^]*\^" "%[qw]![^!]*!"
|
||||
color green "'([^']|\\')*'" "%[qw](\{[^}]*\}|\([^)]*\)|<[^>]*>|\[[^]]*\]|\$[^$]*\$|\^[^^]*\^|![^!]*!)"
|
||||
|
||||
# Comments.
|
||||
color cyan "#[^{].*" "#$"
|
||||
color brightcyan "##[^{].*" "##$"
|
||||
color cyan "#([^{#].*|$)"
|
||||
color brightcyan "##([^{].*|$)"
|
||||
color cyan start="^=begin\>" end="^=end\>"
|
||||
|
||||
# Some common markers.
|
||||
color brightcyan "XXX|TODO|FIXME|\?\?\?"
|
||||
|
||||
@@ -22,9 +22,9 @@ color magenta "[A-Z][A-Z_0-9]+"
|
||||
color magenta "[A-Z][A-Za-z0-9]+"
|
||||
|
||||
# Strings
|
||||
color green "".*""
|
||||
color green start="".*\\$" end=".*""
|
||||
## NOTE: This isn't accurate, but matching "#{0,} for the end of the string is too liberal.
|
||||
color green ""([^"]|\\")*""
|
||||
color green start=""([^"]|\\")*\\$" end="(^|.*[^\])""
|
||||
## Inaccurate, but it's not possible to balance the number of hashes.
|
||||
color green start="r#+"" end=""#+"
|
||||
|
||||
# Comments
|
||||
|
||||
@@ -14,11 +14,11 @@ color brightgreen "^[A-Za-z0-9_-]+\(\)"
|
||||
# Keywords, symbols, and comparisons.
|
||||
color green "\<(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 "[][{}():;|`$<>!=&\]"
|
||||
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-]+\>"
|
||||
color brightmagenta "[[:blank:]](-[A-Za-z]|--\<[A-Za-z-]+)\>"
|
||||
|
||||
# Common commands.
|
||||
color brightblue "\<(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)\>"
|
||||
@@ -33,7 +33,7 @@ color brightred "\$\{[#!]?([-@*#?$!]|[0-9]+|[[:alpha:]_][[:alnum:]_]*)(\[([[:bla
|
||||
color cyan "(^|[[:blank:]])#.*"
|
||||
|
||||
# Strings.
|
||||
color brightyellow ""(\\.|[^"])*"" "'(\\.|[^'])*'"
|
||||
color brightyellow ""([^"\]|\\.)*"|'([^'\]|\\.)*'"
|
||||
|
||||
# Trailing whitespace.
|
||||
color ,green "[[:space:]]+$"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user