Compare commits
180 Commits
v1.3.12
...
v1.9.99pre
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
890ea443d7 | ||
|
|
495fe91e97 | ||
|
|
4d5cd6be1e | ||
|
|
89ca96bd88 | ||
|
|
8fd5193b74 | ||
|
|
1512503b2b | ||
|
|
d6972ae74f | ||
|
|
5187b504d4 | ||
|
|
fa38795ef5 | ||
|
|
e1e2cb7064 | ||
|
|
17408b52e5 | ||
|
|
e5e6d9b696 | ||
|
|
98332d40dc | ||
|
|
62591da0fe | ||
|
|
fa67260c53 | ||
|
|
56ec5925f3 | ||
|
|
f7b8783eaa | ||
|
|
6835102ce5 | ||
|
|
0bbd290168 | ||
|
|
5c55e85410 | ||
|
|
5a22dbb159 | ||
|
|
73e337594e | ||
|
|
dbc415fc47 | ||
|
|
f351176756 | ||
|
|
69583ad664 | ||
|
|
30d7f33954 | ||
|
|
6da4e56f1e | ||
|
|
c6bef76a6c | ||
|
|
2ea7fb0154 | ||
|
|
cbab273a08 | ||
|
|
28a6802307 | ||
|
|
2578025e7f | ||
|
|
5b17ef85e7 | ||
|
|
3714e07d7b | ||
|
|
7b0531aa0b | ||
|
|
e517613c01 | ||
|
|
57703086e2 | ||
|
|
550ca10378 | ||
|
|
f9f8cc36e4 | ||
|
|
ad344e9d1d | ||
|
|
6827146dd2 | ||
|
|
b159f941e8 | ||
|
|
c7c49c48da | ||
|
|
4ce755072c | ||
|
|
2f702285eb | ||
|
|
592ccf9a5e | ||
|
|
bd28ee472b | ||
|
|
1b4ae6997e | ||
|
|
722b728a1c | ||
|
|
97cd67c3d4 | ||
|
|
f28ff9dece | ||
|
|
ec177be416 | ||
|
|
1dc7c1225a | ||
|
|
8a72370040 | ||
|
|
5370b0cd19 | ||
|
|
19f3bd6546 | ||
|
|
a44ca78a50 | ||
|
|
006fc2338c | ||
|
|
118cb37e63 | ||
|
|
d3887dc695 | ||
|
|
c81aa0641c | ||
|
|
f8758833cd | ||
|
|
4ac129c4bf | ||
|
|
e53e12559f | ||
|
|
23994bd8a0 | ||
|
|
6e308c0442 | ||
|
|
7c06be5ff7 | ||
|
|
3bb45ae00b | ||
|
|
6ff22e7020 | ||
|
|
0a4b737b73 | ||
|
|
32a3ce4cd2 | ||
|
|
935594b14a | ||
|
|
a5ad825f30 | ||
|
|
f968a18a3f | ||
|
|
eec40df2a1 | ||
|
|
c346701d09 | ||
|
|
9a145d906f | ||
|
|
49172cad95 | ||
|
|
0d8feb9a85 | ||
|
|
1e1117775f | ||
|
|
84b9f4bd17 | ||
|
|
82697f2fcd | ||
|
|
1a473483b1 | ||
|
|
c6c98f7c7a | ||
|
|
b8592ce2bb | ||
|
|
b08c9f004c | ||
|
|
87b37bde9b | ||
|
|
35c9fa6da3 | ||
|
|
083cc12861 | ||
|
|
4ea2eac360 | ||
|
|
e328169b6d | ||
|
|
4e68588596 | ||
|
|
7f3fdb4790 | ||
|
|
d59c42363b | ||
|
|
c284e1ddb8 | ||
|
|
664e0da48e | ||
|
|
a5322ee5ad | ||
|
|
c2e585ef6c | ||
|
|
2c36e2eb00 | ||
|
|
bf104950fd | ||
|
|
ec15fdb30b | ||
|
|
b006367878 | ||
|
|
99a06d344f | ||
|
|
aee00d4d14 | ||
|
|
7f80174373 | ||
|
|
a89e39a35e | ||
|
|
afeed5f640 | ||
|
|
aa4eb40e71 | ||
|
|
19cb1e6de6 | ||
|
|
85e35e67a2 | ||
|
|
51b7b0e7d8 | ||
|
|
0cae087784 | ||
|
|
567d471681 | ||
|
|
f1a8e7221d | ||
|
|
ca53a6e35a | ||
|
|
a7bdd2e9c6 | ||
|
|
4953e49d92 | ||
|
|
051e953f17 | ||
|
|
bc7dc36c7d | ||
|
|
60d22f012a | ||
|
|
2f7c1a0613 | ||
|
|
b520d509cc | ||
|
|
c0ba4bf3e0 | ||
|
|
f8d085d2ed | ||
|
|
3528a034f2 | ||
|
|
49c85d076c | ||
|
|
015c434be1 | ||
|
|
afa1542b76 | ||
|
|
9f2e3f7654 | ||
|
|
458d004efe | ||
|
|
139dc4a844 | ||
|
|
a0283b7710 | ||
|
|
345a5b84bf | ||
|
|
d44f322f6d | ||
|
|
ed467e50ff | ||
|
|
7d6dd41a4a | ||
|
|
a43827d1cb | ||
|
|
224b6d5b77 | ||
|
|
5ee89c6898 | ||
|
|
6fa1144d1a | ||
|
|
96514a242f | ||
|
|
6b90657d94 | ||
|
|
85ffaeeefc | ||
|
|
fef3c8679d | ||
|
|
c021925abb | ||
|
|
46c29c4351 | ||
|
|
17e12691b0 | ||
|
|
3d7c2bd2d6 | ||
|
|
21cdee5517 | ||
|
|
0457eb97af | ||
|
|
a43b10854f | ||
|
|
a662c5579a | ||
|
|
990a695f54 | ||
|
|
6f499096ad | ||
|
|
296ee153b0 | ||
|
|
8f975a11f0 | ||
|
|
2458b295d9 | ||
|
|
a4e92c8ad6 | ||
|
|
fef232a672 | ||
|
|
8cd0d2c751 | ||
|
|
0fd5d60477 | ||
|
|
780f1d3f78 | ||
|
|
6cefb9f21a | ||
|
|
d04037760d | ||
|
|
ef45a2528c | ||
|
|
727c244ab6 | ||
|
|
68e2c375e7 | ||
|
|
99c87ccb0c | ||
|
|
4e71ab6891 | ||
|
|
b0c1bc28f8 | ||
|
|
0e92adf153 | ||
|
|
3b722460b8 | ||
|
|
865ad94100 | ||
|
|
6c8f92c092 | ||
|
|
2f94f42730 | ||
|
|
98e4d4f3b1 | ||
|
|
f23cc46655 | ||
|
|
decae6c25e | ||
|
|
74d8ebc041 | ||
|
|
899d0360ec |
2
AUTHORS
2
AUTHORS
@@ -12,7 +12,7 @@ David Lawrence Ramsey <pooka109@cox.net>
|
||||
wrapping code, spelling fixes, const mode, parts of the UTF-8
|
||||
support, and various other fixes.
|
||||
|
||||
Jordi Mallach <jordi@sindominio.net>
|
||||
Jordi Mallach <jordi@gnu.org>
|
||||
* Debian package maintainer, fellow bug squasher.
|
||||
* Internationalization support head, ca.po maintainer.
|
||||
|
||||
|
||||
262
ChangeLog
262
ChangeLog
@@ -1,3 +1,255 @@
|
||||
GNU nano 1.9.99pre1 - 2006.08.29
|
||||
- General:
|
||||
- Miscellaneous comment fixes. (DLR)
|
||||
- Fix option descriptions. At least one of the two parts of
|
||||
+LINE,COLUMN must be specified at all times; COLUMN is not the
|
||||
only optional value. Also, fix wording problems in
|
||||
-O/--morespace and -W/--wordbounds. Changes to usage(),
|
||||
UPGRADE, nano.1, nanorc.5, rnano.1, nano.texi, and
|
||||
nanorc.sample.in. (DLR)
|
||||
- Fix mouse support so that it truly ignores everything except
|
||||
releases and clicks of button 1. Changes to
|
||||
enable_mouse_support() and get_mouseinput(). (DLR)
|
||||
- In certain places, call wnoutrefresh(bottomwin) after calling
|
||||
blank_statusbar(), in order to ensure that the statusbar is
|
||||
actually blanked. Changes to do_help(), do_continue(),
|
||||
handle_sigwinch(), and update_statusbar_line(). (DLR)
|
||||
- If the mark isn't on, allow Meta-} and Meta-{ to indent and
|
||||
unindent only the current line, just as it would if the mark
|
||||
covered only the current line, instead of displaying a
|
||||
statusbar message and quitting. Changes to shortcut_init(),
|
||||
do_indent_marked() (renamed do_indent()),
|
||||
do_indent_marked_void() (renamed do_indent_void()),
|
||||
do_unindent_marked_void() (renamed do_unindent()), and
|
||||
UPGRADE. (DLR, suggested by John M. Gabriele)
|
||||
- Consolidate do_scroll_(up|down)() into do_(up|down)(), as
|
||||
they have a lot of duplicate code. New functions do_up_void()
|
||||
and do_down_void(); changes to shortcut_init(), do_up(),
|
||||
do_scroll_up(), do_down(), do_scroll_down(), do_left(), and
|
||||
do_right(). (DLR)
|
||||
- Make Jordi's email address, and the description of what the
|
||||
manual pages were written for, consistent in the
|
||||
documentation. Changes to AUTHORS, nano.1, nanorc.5, and
|
||||
rnano.1. (DLR, based on suggestions by Jordi)
|
||||
- Don't include sys/ioctl.h in nano.c when NANO_TINY is defined,
|
||||
as ioctl() is never used then. (DLR)
|
||||
- Improve the display of bools in debugging statements. Changes
|
||||
to parse_kbinput(), get_escape_seq_kbinput(),
|
||||
parse_escape_seq_kbinput(), get_shortcut(), and get_toggle().
|
||||
(DLR)
|
||||
- Rename the values of the scroll_dir enum to UP_DIR and
|
||||
DOWN_DIR, since UP is defined as a termcap value in Tru64's
|
||||
and NetBSD 3.0's curses.h, which breaks compilation on those
|
||||
systems. Changes to do_page_up(), do_page_down(), do_up(),
|
||||
do_down(), nano.h, and edit_scroll(). (DLR; found by Daniel
|
||||
Richard G. and Adam Wysocki, repectively)
|
||||
- Rename the DISABLE_ROOTWRAP #define to DISABLE_ROOTWRAPPING.
|
||||
(DLR)
|
||||
- When using slang 2.x, call SLutf8_enable() with an argument of
|
||||
1 instead of TRUE, as that's the proper way to enable its
|
||||
UTF-8 support. Changes to main() and configure.ac. (DLR)
|
||||
- Fix punctuation relating to "i.e." in various comments and
|
||||
documentation. (Benno Schulenberg and DLR)
|
||||
- Make bad_mbchar a static const char* const in chars.c, as its
|
||||
value doesn't change. (DLR)
|
||||
- Add various clarifications to translated strings. Changes to
|
||||
do_insertfile_void(), shortcut_init(), toggle_init(),
|
||||
help_init(), print_view_warning(), usage(), and do_mark().
|
||||
(Benno Schulenberg, minor tweaks by DLR)
|
||||
- Properly preserve the cursor position when going from the
|
||||
"Read File" or "Save File As" prompt to the file browser to
|
||||
the "Go To Directory" prompt, and then canceling back to the
|
||||
"Read File" or "Save File As" prompt. Changes to
|
||||
get_prompt_string() and do_prompt(). (DLR)
|
||||
- Rename the parameter old_pww to pww_save in
|
||||
need_statusbar_horizontal_update(), need_horizontal_update(),
|
||||
need_vertical_update(), and edit_redraw(); and rename the
|
||||
variable old_pww to pww_save in do_search() and do_research();
|
||||
for consistency. (DLR)
|
||||
- browser.c:
|
||||
do_browser()
|
||||
- Refactor the mouse support, modeling it after do_mouse() for
|
||||
consistency. (DLR)
|
||||
- Remove unneeded call to blank_edit(). (DLR)
|
||||
- After entering "..", select the directory we were in before
|
||||
instead of the first filename in the list, as Pico does. (DLR)
|
||||
- Simplify screen update handling and exiting. (DLR)
|
||||
- Fix potential segfault when going to a directory that doesn't
|
||||
begin with '/'. (DLR)
|
||||
do_browse_from()
|
||||
- During the operating directory check, if path isn't NULL,
|
||||
don't bother freeing it before mallocstrcpy()ing operating_dir
|
||||
into it, as the latter operation will free it. (DLR)
|
||||
- Don't bother freeing path if it's NULL. (DLR)
|
||||
browser_init()
|
||||
- Fix off-by-one error when calculating longest that kept the
|
||||
rightmost column of the screen from being used. (DLR)
|
||||
- Calculate width here instead of in browser_refresh(), as it's
|
||||
more consistent. (DLR)
|
||||
- If filelist is initialized, free it here instead of in several
|
||||
places in do_browser(). (DLR)
|
||||
browser_refresh()
|
||||
- Simplify. (DLR)
|
||||
- Fix problems where translated versions of "(dir)" could be
|
||||
truncated, and where file sizes could be too long. (DLR)
|
||||
- For the ".." entry, display "(parent dir)" instead of "(dir)",
|
||||
as Pico does. (DLR)
|
||||
- If a filename is too long, truncate it and display an ellipsis
|
||||
before it, as titlebar() does. (DLR)
|
||||
- Add translator comments explaining the maximum intended
|
||||
lengths of "(dir)" and "(parent dir)". (DLR)
|
||||
- Fix problem where width wouldn't be properly initialized if
|
||||
the file list took up one line or less. (DLR)
|
||||
- Don't display overly long filenames with ellipses if the
|
||||
number of columns is extremely small. (DLR)
|
||||
browser_select_filename()
|
||||
- New function, used to select a specific filename in the list.
|
||||
(DLR)
|
||||
findnextfile()
|
||||
- Simplify the uses of tail(). (DLR)
|
||||
striponedir()
|
||||
- Since all the strings passed to this are dynamically
|
||||
allocated, use null_at() to strip the directory from the
|
||||
string. Also, return the stripped path instead of modifying
|
||||
path. (DLR)
|
||||
- chars.c:
|
||||
mbstrncasecmp(), mbstrcasestr(), mbrevstrcasestr()
|
||||
- Don't allocate space for multibyte characters until we've
|
||||
asserted that the parameters we're using aren't NULL. (DLR)
|
||||
- files.c:
|
||||
do_insertfile()
|
||||
- If we execute a command in a new buffer, move back to the
|
||||
beginning of the first line of the buffer afterwards, for
|
||||
consistency. (DLR)
|
||||
- If we don't insert a file into a new buffer, properly update
|
||||
the x-coordinate to account for the number of characters
|
||||
inserted on the current line. (DLR)
|
||||
get_full_path()
|
||||
- Don't return NULL when the current directory doesn't exist, as
|
||||
we can still recover from that. (DLR, found by Mike Frysinger)
|
||||
- Add various cleanups. (DLR)
|
||||
- global.c:
|
||||
sc_init_one(), shortcut_init()
|
||||
- Don't include blank_after when DISABLE_HELP is defined, as
|
||||
it's never used then. (DLR)
|
||||
shortcut_init()
|
||||
- Remove the ^X shortcut for CutTillEnd at the search prompt, as
|
||||
official Pico doesn't include it, and it can be confused with
|
||||
Exit. (DLR, suggested by Benno Schulenberg)
|
||||
- Make the help shortcut for the "Go to Directory" prompt call
|
||||
do_browser_help() instead of do_help_void(), as this prompt is
|
||||
only accessible inside the file browser. (DLR, found by Benno
|
||||
Schulenberg)
|
||||
toggle_init()
|
||||
- Don't include desc or blank_after when DISABLE_HELP is
|
||||
defined, as neither are ever used then. (DLR)
|
||||
- Make sure that a blank line is not displayed after the Meta-Q
|
||||
toggle when mouse support is disabled and we're in restricted
|
||||
mode, and that it is displayed all other times. (DLR)
|
||||
toggle_init_one()
|
||||
- Don't include desc or blank_after when DISABLE_HELP is
|
||||
defined, as neither are ever used then. (DLR)
|
||||
- help.c:
|
||||
do_help()
|
||||
- Simplify screen update handling and exiting. (DLR)
|
||||
- Don't allow moving down a page when the last line of the help
|
||||
text is onscreen. (DLR)
|
||||
help_init()
|
||||
- Adjust the first two chunks of the main help text so that
|
||||
they're no more than 509 characters again. (DLR)
|
||||
- move.c:
|
||||
do_scroll_up(), do_scroll_down()
|
||||
- Fix problems where, after scrolling, the previous and current
|
||||
lines would not be updated properly if the current line was
|
||||
not the first or last line of the edit window. (DLR, found by
|
||||
Mike Frysinger)
|
||||
- nano.c:
|
||||
handle_sigwinch()
|
||||
- Just in case we're in the statusbar prompt, reset the
|
||||
statusbar cursor position when resizing the window. (DLR)
|
||||
- nano.h:
|
||||
- Remove the manual disabling of color support if regex.h isn't
|
||||
found, as configure.ac now handles that. (DLR)
|
||||
- rcfile.c:
|
||||
parse_rcfile()
|
||||
- Add missing ENABLE_COLOR #ifdef around the second check for a
|
||||
syntax with no color commands, to fix compilation with rcfile
|
||||
support and without color support. (Daniel Richard G.)
|
||||
- search.c:
|
||||
replace_regexp()
|
||||
- Remove unnecessary casting of c to int. (DLR)
|
||||
- text.c:
|
||||
execute_command()
|
||||
- Remove the marking of the file as modified, as do_insertfile()
|
||||
now handles that. (DLR)
|
||||
- utils.c:
|
||||
digits()
|
||||
- Tweak to remove the assumption that n is always positive,
|
||||
although it always is in this particular case. (DLR)
|
||||
- winio.c:
|
||||
parse_kbinput()
|
||||
- Properly handle combined meta and escape sequences, so that
|
||||
e.g. Meta-/ will work properly when the / is on the numeric
|
||||
keypad and NumLock is off. Also, properly handle combined
|
||||
control character and escape sequences, so that e.g. Esc Esc /
|
||||
will work properly when the / is on the numeric keypad and
|
||||
NumLock is off. (DLR)
|
||||
- Translate extended keypad keys to their ASCII equivalents even
|
||||
when we hit Escape once or twice before typing them, for
|
||||
consistency. (DLR)
|
||||
- If they're defined, translate KEY_SUP into NANO_PREVLINE_KEY
|
||||
and KEY_SDOWN into NANO_NEXTLINE_KEY, since they are sometimes
|
||||
generated by Shift-Up and Shift-Down. (DLR)
|
||||
parse_escape_seq_kbinput()
|
||||
- Handle unknown and unignored escape sequences once here
|
||||
instead of twice in parse_kbinput(). (DLR)
|
||||
- Don't ignore escape sequences anymore. Instead, return the
|
||||
corresponding key so that parse_kbinput() can translate it.
|
||||
(DLR)
|
||||
display_string()
|
||||
- Properly handle buf[start_index]'s being a null terminator.
|
||||
(DLR)
|
||||
edit_draw()
|
||||
- Simplify the setting of paintlen. (DLR)
|
||||
titlebar()
|
||||
- Don't display overly long filenames with ellipses if the
|
||||
number of columns is extremely small. (DLR)
|
||||
- Don't display any blank space for the state if we're in the
|
||||
file browser, as Pico doesn't. (DLR)
|
||||
- configure.ac:
|
||||
- If regex.h isn't found, display an error message if we try to
|
||||
enable color support. (DLR)
|
||||
- Fix the spacing of the error message displayed when slcurses.h
|
||||
isn't found. (DLR)
|
||||
- If we use the --disable-wrapping option, ignore the
|
||||
--disable-wrapping-as-root option. (DLR)
|
||||
- Add minor cosmetic tweaks. (DLR)
|
||||
- doc/Makefile.am:
|
||||
- Don't include nanorc.sample in EXTRA_DIST, as it's only useful
|
||||
when we're building from source, as opposed to building a
|
||||
distribution. (DLR)
|
||||
- Tweak to remove usage of the += operator again. (DLR)
|
||||
- doc/man/Makefile.am:
|
||||
- Tweak to remove usage of the += operator again. (DLR)
|
||||
- doc/man/fr/nano.1, doc/man/fr/nanorc.5, doc/man/fr/rnano.1:
|
||||
- Updated manpage translations by Jean-Philippe Guérard.
|
||||
- doc/faq.html:
|
||||
- Update section 5.3 again to not state "the latest development
|
||||
version" before 1.3.12, as it's no longer accurate. (DLR)
|
||||
- Add some minor spacing fixes. (DLR)
|
||||
- doc/nano.texi:
|
||||
- Add missing description of the -O/--morespace command line
|
||||
option. (DLR)
|
||||
- doc/syntax/c.nanorc:
|
||||
- Since .i and .ii are preprocessed C and C++ output, colorize
|
||||
them here. (Mike Frysinger)
|
||||
- Remove redundancy from the file extension regexes. (DLR)
|
||||
- doc/syntax/ruby.nanorc:
|
||||
- Add missing blank line after the first comment, for
|
||||
consistency. (DLR)
|
||||
- Improve highlighting of constants. (John M. Gabriele, minor
|
||||
tweaks by DLR)
|
||||
|
||||
GNU nano 1.3.12 - 2006.06.26
|
||||
- General:
|
||||
- Miscellaneous comment fixes. (DLR)
|
||||
@@ -3160,7 +3412,7 @@ GNU nano 1.3.3 - 2004.06.28
|
||||
do_justify(); new functions do_justify_void() and
|
||||
do_full_justify(). (DLR)
|
||||
- Modify the justification algorithm to work the same way as in
|
||||
the current version of Pico, i.e, add a space at the end of
|
||||
the current version of Pico, i.e. add a space at the end of
|
||||
each line of the justified paragraph except for the last one,
|
||||
and if there was a space at the end of the last one, remove
|
||||
it. Changes to justify_format() and do_justify(). Note that
|
||||
@@ -3588,7 +3840,7 @@ GNU nano 1.3.2 - 2004.03.31
|
||||
- Change instances in the code that refresh the entire edit
|
||||
window when color support is enabled (in order to properly
|
||||
handle multi-line color regexes) to only do so when
|
||||
it's necessary, i.e, when COLOR_SYNTAX is set. (DLR)
|
||||
it's necessary, i.e. when COLOR_SYNTAX is set. (DLR)
|
||||
- Minor cosmetic tweaks to the code involving direction keys.
|
||||
NANO_UP_KEY and NANO_DOWN_KEY are now NANO_PREVLINE_KEY and
|
||||
NANO_NEXTLINE_KEY, and the help messages for them have been
|
||||
@@ -3600,7 +3852,7 @@ GNU nano 1.3.2 - 2004.03.31
|
||||
the statusbar input routines to handle them and NANO_HELP_FKEY
|
||||
properly. (DLR)
|
||||
- Block SIGWINCH after setting up its handler, and only unblock
|
||||
and handle it when we're in a stable state, i.e, when we're
|
||||
and handle it when we're in a stable state, i.e. when we're
|
||||
waiting for input from the user. New function
|
||||
allow_pending_sigwinch(); changes to signal_init(),
|
||||
get_kbinput(), and get_verbatim_kbinput(). (DLR)
|
||||
@@ -3810,7 +4062,7 @@ GNU nano 1.3.2 - 2004.03.31
|
||||
- Don't use "kbinput = wgetch(win)" as a switch value. (DLR)
|
||||
get_escape_seq_kbinput()
|
||||
- Add support for the escape sequences for F1-F14 whenever
|
||||
possible (i.e, whenever a conflict doesn't occur), some
|
||||
possible (i.e. whenever a conflict doesn't occur), some
|
||||
additional comments, and a few cosmetic cleanups. (DLR)
|
||||
- Use switch statements instead of strncmp() to read in the long
|
||||
xterm sequences for Ctrl-[arrow key] and Shift-[arrow key].
|
||||
@@ -3839,7 +4091,7 @@ GNU nano 1.3.2 - 2004.03.31
|
||||
do_credits()
|
||||
- Use nanosleep() instead of usleep(). The latter is only
|
||||
standard under BSD, whereas the former is POSIX compliant.
|
||||
Accordingly, only include time.h if we use this function, i.e,
|
||||
Accordingly, only include time.h if we use this function, i.e.
|
||||
if NANO_EXTRA is defined. (DLR)
|
||||
- Add explanatory comment. (DLR)
|
||||
- configure.ac:
|
||||
|
||||
30
NEWS
30
NEWS
@@ -1,3 +1,23 @@
|
||||
2006.08.29 - GNU nano 1.9.99pre1 passes through the flames. This
|
||||
release fixes various bugs in the last version: the
|
||||
mouse support properly ignores everything except clicks
|
||||
of the left mouse button; the statusbar is now blanked
|
||||
properly when it should be; indenting and unindenting
|
||||
operate on the current line when the mark is off; nano
|
||||
should build on Tru64, NetBSD, and other systems that
|
||||
use termcap instead of terminfo in their curses
|
||||
libraries; the built-in file browser now properly
|
||||
navigates file lists that take up only one row; the
|
||||
cursor position is now completely restored after
|
||||
inserting a file into the current buffer, and after
|
||||
inserting the output of a command into a new buffer; the
|
||||
^X shortcut at the search prompt has been removed, as
|
||||
official Pico doesn't include it and it's too easily
|
||||
confused with Exit; the screen is updated properly after
|
||||
scrolling a line without moving the cursor; the keyboard
|
||||
input routines behave more consistently; and so on.
|
||||
Have fun with it.
|
||||
|
||||
2006.06.26 - GNU nano 1.3.12 escapes the darkness. This release
|
||||
contains the last new features that nano will have
|
||||
before 2.0: copying text into the cutbuffer without
|
||||
@@ -229,7 +249,7 @@
|
||||
broken regex detection, search history recall, and
|
||||
keypad handling with -K. Debugging strings are no
|
||||
longer translated and comments denote where translations
|
||||
should be as short as possible (i.e, the statusbar).
|
||||
should be as short as possible (i.e. the statusbar).
|
||||
There are new examples for syntax highlighting, and
|
||||
documentation updates and fixes. The 1.3.0 CVS tree
|
||||
will be opening soon for all your nano desires, so stay
|
||||
@@ -362,7 +382,7 @@
|
||||
mode (^O,M-P), a new "syntax" command in the .nanorc to
|
||||
allow multiple syntax highlighting types, and a new -Y,
|
||||
--syntax flag to set a specific one if there's no
|
||||
filename regex to match it against (i.e, w/mutt). The
|
||||
filename regex to match it against (i.e. w/mutt). The
|
||||
^space and M-space keys will now show up in the help
|
||||
menu, which itself has been tweaked a bit, and many more
|
||||
configure options should now cooperate (like the odd
|
||||
@@ -542,7 +562,7 @@
|
||||
resizing the editor in any mode other than normal edit
|
||||
mode. Other fixes include some more tab completion
|
||||
segfaults, and an silly segfault that occurred when
|
||||
successfully writing a file on the 2nd try (i.e, after
|
||||
successfully writing a file on the 2nd try (i.e. after
|
||||
an initial write error). Slowly but surely, on toward
|
||||
1.0 we travel.
|
||||
|
||||
@@ -730,7 +750,7 @@
|
||||
|
||||
05/14/2000 - Nano 0.9.7 (the Mother's Day release) continues in the long
|
||||
line of display fixes, and also fixes the broken symlink
|
||||
behavior (i.e, symlinks weren't being followed by
|
||||
behavior (i.e. symlinks weren't being followed by
|
||||
default). Hopefully all major bugs can be worked out
|
||||
soon and we can have a 1.0 release before the end of the
|
||||
year, but who knows.
|
||||
@@ -783,7 +803,7 @@
|
||||
04/14/2000 - 0.9.1 has some more Pico compatibility built-in. The
|
||||
option to switch to/from Search and Search/Replace (^T)
|
||||
is now available, and nano now displays the more
|
||||
Pico-like shortcut list when invoked as 'pico' (i.e, if
|
||||
Pico-like shortcut list when invoked as 'pico' (i.e. if
|
||||
'pico' is a symlink to nano). There is an important
|
||||
change to the handling of symbolic links as well. Now,
|
||||
nano does the "correct" thing and automatically writes
|
||||
|
||||
@@ -80,7 +80,7 @@ Then, once it's done compiling, run
|
||||
|
||||
$ make install
|
||||
|
||||
which should copy various files (i.e, the nano executable, the info and
|
||||
which should copy various files (i.e. the nano executable, the info and
|
||||
man pages, and syntax highlighting pattern files) to their appropriate
|
||||
directories.
|
||||
|
||||
|
||||
18
TODO
18
TODO
@@ -2,21 +2,25 @@ TODO file (? means the feature may be implemented, but not definitely)
|
||||
------------------------------------------------------------------------
|
||||
|
||||
For the next version:
|
||||
- Undo/Redo keys?
|
||||
- Undo/Redo keys (M-U and M-E)?
|
||||
- Rebindable keys?
|
||||
- FriBidi support?
|
||||
- Port to DJGPP?
|
||||
- Make matching bracket searches sophisticated enough to skip over
|
||||
brackets inside comments?
|
||||
- Allow indentation of marked text by spaces as well as tabs?
|
||||
- Allow indentation to add just enough columns to reach the nearest
|
||||
multiple of tabsize, rather than always adding tabsize columns?
|
||||
- Allow piping marked text to an external command and replacing it with
|
||||
the command's output (as the internal spell checker already does with
|
||||
the "spell" command)?
|
||||
- Rewrite the nano FAQ in SGML.
|
||||
- Allow conversion between different character sets. Maybe use glib's
|
||||
iconv() if the system's iconv() is inadequate, since we already use
|
||||
glib's vsnprintf() if the system lacks vsnprintf()?
|
||||
- Properly preserve the cursor position when going from the "Read File"
|
||||
or "Save File As" prompt to the file browser to the "Go To Directory"
|
||||
prompt, and then canceling back to the "Read File" or "Save File As"
|
||||
prompt.
|
||||
- Handle window resizes better. After we resize, we should stay
|
||||
wherever we were before we resized, as Pico does.
|
||||
- Fix problems with color syntaxes' highlighting lines too aggressively.
|
||||
- Allow color syntaxes to apply to more than just color, so that we can
|
||||
e.g. specify a different alternate spell checker depending on which
|
||||
file type we have open.
|
||||
@@ -27,8 +31,8 @@ For the next version:
|
||||
set via Ctrl-^) at various lines and/or columns in the buffer, and
|
||||
allow movement between them with a single keystroke.
|
||||
- Add the ability to move to different lines of the screen with a single
|
||||
keystroke, e.g. M-` to go to the top line, M-& to go to the center
|
||||
line, and M-' to go to the last line.
|
||||
keystroke, e.g. M-` (M-~) to go to the top line, M-& (M-7) to go to
|
||||
the center line, and M-' (M-") to go to the last line.
|
||||
|
||||
Old requests:
|
||||
|
||||
|
||||
4
UPGRADE
4
UPGRADE
@@ -6,7 +6,7 @@ Visible changes since 1.2
|
||||
* Editor Features
|
||||
- Support for UTF-8.
|
||||
- Moving to a specified line and column of a file, instead of just a
|
||||
line (+LINE[,COLUMN]).
|
||||
line (+LINE,COLUMN).
|
||||
- Smart home key (-A).
|
||||
- Creation of unique backup files in a specified directory (-C <dir>).
|
||||
- Insertion of spaces instead of a tab when Tab is pressed (-E).
|
||||
@@ -28,7 +28,7 @@ Visible changes since 1.2
|
||||
- Meta-W now repeats the last search. Wrapping is now toggled via
|
||||
Meta-L.
|
||||
- Replacing and spell checking only selected text.
|
||||
- Indenting all marked lines with one keystroke.
|
||||
- Indenting lines with one keystroke.
|
||||
- Copying text into the cutbuffer without cutting it.
|
||||
- Scrolling the text up and down single lines without moving the
|
||||
cursor.
|
||||
|
||||
61
configure.ac
61
configure.ac
@@ -19,7 +19,7 @@
|
||||
#
|
||||
# $Id$
|
||||
|
||||
AC_INIT([GNU nano], [1.3.12], [nano-devel@gnu.org], [nano])
|
||||
AC_INIT([GNU nano], [1.9.99pre1], [nano-devel@gnu.org], [nano])
|
||||
AC_CONFIG_SRCDIR([src/nano.c])
|
||||
AC_CANONICAL_TARGET([])
|
||||
AM_INIT_AUTOMAKE
|
||||
@@ -39,7 +39,7 @@ dnl Internationalization macros.
|
||||
|
||||
AM_GNU_GETTEXT_VERSION(0.11.5)
|
||||
AM_GNU_GETTEXT([external], [need-ngettext])
|
||||
AM_CONDITIONAL(USE_NLS, test "x$USE_NLS" = "xyes")
|
||||
AM_CONDITIONAL(USE_NLS, test x$USE_NLS = xyes)
|
||||
|
||||
dnl Data location.
|
||||
|
||||
@@ -56,8 +56,7 @@ dnl Checks for options.
|
||||
AC_ARG_ENABLE(debug,
|
||||
[ --enable-debug Enable debugging (disabled by default)],
|
||||
[if test x$enableval = xyes; then
|
||||
AC_DEFINE(DEBUG, 1, [Define this to enable nano debug messages and assert warnings.])
|
||||
debug_support=yes
|
||||
AC_DEFINE(DEBUG, 1, [Define this to enable nano debug messages and assert warnings.]) debug_support=yes
|
||||
fi])
|
||||
|
||||
if test x$debug_support != xyes; then
|
||||
@@ -135,14 +134,22 @@ fi])
|
||||
AC_ARG_ENABLE(wrapping-as-root,
|
||||
[ --disable-wrapping-as-root Disable wrapping of text as root by default],
|
||||
[if test x$enableval != xyes; then
|
||||
AC_DEFINE(DISABLE_ROOTWRAP, 1, [Define this to disable wrapping as root by default.])
|
||||
AC_DEFINE(DISABLE_ROOTWRAPPING, 1, [Define this to disable wrapping as root by default.])
|
||||
fi])
|
||||
|
||||
AC_ARG_ENABLE(color,
|
||||
[ --enable-color Enable color and syntax highlighting],
|
||||
[if test x$enableval = xyes; then
|
||||
AC_DEFINE(ENABLE_NANORC, 1, [Define this to use the .nanorc file.]) nanorc_support=yes
|
||||
AC_DEFINE(ENABLE_COLOR, 1, [Define this to have syntax highlighting, requires regex.h and ENABLE_NANORC too!]) color_support=yes
|
||||
if test x$ac_cv_header_regex_h = xyes; then
|
||||
AC_DEFINE(ENABLE_NANORC, 1, [Define this to use the .nanorc file.]) nanorc_support=yes
|
||||
AC_DEFINE(ENABLE_COLOR, 1, [Define this to have syntax highlighting, requires regex.h and ENABLE_NANORC too!]) color_support=yes
|
||||
else
|
||||
AC_MSG_ERROR([
|
||||
*** The header file regex.h was not found. If you wish to use color
|
||||
*** support this header file is required. Please either install C
|
||||
*** libraries that include the regex.h file or do not call the configure
|
||||
*** script with --enable-color.])
|
||||
fi
|
||||
fi])
|
||||
|
||||
AC_ARG_ENABLE(multibuffer,
|
||||
@@ -203,12 +210,11 @@ AC_ARG_WITH(slang,
|
||||
#include <slcurses.h>
|
||||
int main(void)
|
||||
{
|
||||
SLutf8_enable(TRUE);
|
||||
SLutf8_enable(1);
|
||||
return 0;
|
||||
}],
|
||||
[AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(USE_SLANG, 1, [Define to use the slang wrappers for curses instead of native curses.])
|
||||
slang_support=yes
|
||||
AC_DEFINE(USE_SLANG, 1, [Define to use the slang wrappers for curses instead of native curses.]) slang_support=yes
|
||||
CURSES_LIB_WIDE=yes
|
||||
if test x$with_slang != xyes; then
|
||||
CURSES_LIB="-L${with_slang}/lib -lslang"
|
||||
@@ -230,12 +236,11 @@ int main(void)
|
||||
#include <slcurses.h>
|
||||
int main(void)
|
||||
{
|
||||
SLutf8_enable(TRUE);
|
||||
SLutf8_enable(1);
|
||||
return 0;
|
||||
}],
|
||||
[AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(USE_SLANG, 1, [Define to use the slang wrappers for curses instead of native curses.])
|
||||
slang_support=yes
|
||||
AC_DEFINE(USE_SLANG, 1, [Define to use the slang wrappers for curses instead of native curses.]) slang_support=yes
|
||||
CURSES_LIB_WIDE=yes
|
||||
if test x$with_slang != xyes; then
|
||||
CURSES_LIB="-L${with_slang}/lib -lslang $tcap"
|
||||
@@ -252,12 +257,11 @@ int main(void)
|
||||
#include <slcurses.h>
|
||||
int main(void)
|
||||
{
|
||||
SLutf8_enable(TRUE);
|
||||
SLutf8_enable(1);
|
||||
return 0;
|
||||
}],
|
||||
[AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(USE_SLANG, 1, [Define to use the slang wrappers for curses instead of native curses.])
|
||||
slang_support=yes
|
||||
AC_DEFINE(USE_SLANG, 1, [Define to use the slang wrappers for curses instead of native curses.]) slang_support=yes
|
||||
CURSES_LIB_WIDE=yes
|
||||
if test x$with_slang != xyes; then
|
||||
CURSES_LIB="-L${with_slang}/lib -lslang $tcap -lm"
|
||||
@@ -270,11 +274,10 @@ int main(void)
|
||||
AC_MSG_WARN([*** Can not use slang when cross-compiling]))],
|
||||
AC_MSG_WARN([*** Can not use slang when cross-compiling])),
|
||||
AC_MSG_ERROR([
|
||||
*** The header file slcurses.h was not found. If you wish to use
|
||||
*** slang support this header file is required. Please either
|
||||
*** The header file slcurses.h was not found. If you wish to use
|
||||
*** slang support this header file is required. Please either
|
||||
*** install a version of slang that includes the slcurses.h file or
|
||||
*** do not call the configure script with --with-slang
|
||||
]))
|
||||
*** do not call the configure script with --with-slang.]))
|
||||
fi
|
||||
|
||||
if eval "test x$CURSES_LIB_NAME = x"; then
|
||||
@@ -295,8 +298,7 @@ int main(void)
|
||||
return 0;
|
||||
}],
|
||||
[AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(USE_SLANG, 1, [Define to use the slang wrappers for curses instead of native curses.])
|
||||
slang_support=yes
|
||||
AC_DEFINE(USE_SLANG, 1, [Define to use the slang wrappers for curses instead of native curses.]) slang_support=yes
|
||||
if test x$with_slang != xyes; then
|
||||
CURSES_LIB="-L${with_slang}/lib -lslang"
|
||||
else
|
||||
@@ -321,8 +323,7 @@ int main(void)
|
||||
return 0;
|
||||
}],
|
||||
[AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(USE_SLANG, 1, [Define to use the slang wrappers for curses instead of native curses.])
|
||||
slang_support=yes
|
||||
AC_DEFINE(USE_SLANG, 1, [Define to use the slang wrappers for curses instead of native curses.]) slang_support=yes
|
||||
if test x$with_slang != xyes; then
|
||||
CURSES_LIB="-L${with_slang}/lib -lslang $tcap"
|
||||
else
|
||||
@@ -342,8 +343,7 @@ int main(void)
|
||||
return 0;
|
||||
}],
|
||||
[AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(USE_SLANG, 1, [Define to use the slang wrappers for curses instead of native curses.])
|
||||
slang_support=yes
|
||||
AC_DEFINE(USE_SLANG, 1, [Define to use the slang wrappers for curses instead of native curses.]) slang_support=yes
|
||||
if test x$with_slang != xyes; then
|
||||
CURSES_LIB="-L${with_slang}/lib -lslang $tcap -lm"
|
||||
else
|
||||
@@ -355,11 +355,10 @@ int main(void)
|
||||
AC_MSG_WARN([*** Can not use slang when cross-compiling]))],
|
||||
AC_MSG_WARN([*** Can not use slang when cross-compiling])),
|
||||
AC_MSG_ERROR([
|
||||
*** The header file slcurses.h was not found. If you wish to use
|
||||
*** slang support this header file is required. Please either
|
||||
*** The header file slcurses.h was not found. If you wish to use
|
||||
*** slang support this header file is required. Please either
|
||||
*** install a version of slang that includes the slcurses.h file or
|
||||
*** do not call the configure script with --with-slang
|
||||
]))
|
||||
*** do not call the configure script with --with-slang.]))
|
||||
fi
|
||||
|
||||
if test "${_libs+set}" = "set"; then
|
||||
@@ -372,7 +371,7 @@ int main(void)
|
||||
;;
|
||||
esac], [AC_MSG_RESULT(no)])
|
||||
|
||||
AM_CONDITIONAL(USE_COLOR, test "x$color_support" = "xyes")
|
||||
AM_CONDITIONAL(USE_COLOR, test x$color_support = xyes)
|
||||
|
||||
dnl Checks for functions.
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
SUBDIRS = man texinfo
|
||||
|
||||
if USE_COLOR
|
||||
SUBDIRS += syntax
|
||||
SUBDIRS = man syntax texinfo
|
||||
else
|
||||
SUBDIRS = man texinfo
|
||||
endif
|
||||
|
||||
EXTRA_DIST = faq.html nanorc.sample
|
||||
EXTRA_DIST = faq.html
|
||||
|
||||
17
doc/faq.html
17
doc/faq.html
@@ -84,7 +84,7 @@
|
||||
<h2><a name="1.5"></a>1.5. Why the name change from TIP?</h2>
|
||||
<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>
|
||||
<h2><a name="1.6"></a>1.6. What is the current version of nano?</h2>
|
||||
<blockquote><p>The current version of nano *should* be 1.3.12. Of course you should always check the nano homepage to see what the latest and greatest version is.</p></blockquote>
|
||||
<blockquote><p>The current version of nano *should* be 1.9.99pre1. Of course you should always check the nano homepage to see what the latest and greatest version is.</p></blockquote>
|
||||
<h2><a name="1.7"></a>1.7. I want to read the man page without having to download the program!</h2>
|
||||
<blockquote><p>Jeez, demanding, aren't we? Okay, look <a href="http://www.nano-editor.org/dist/v1.3/nano.1.html">here</a>.</p></blockquote>
|
||||
<hr width="100%">
|
||||
@@ -162,7 +162,7 @@
|
||||
Turn off wrapping of text by default when the
|
||||
user is root</pre></blockquote>
|
||||
<h2><a name="3.7"></a>3.7. Tell me more about this multibuffer stuff!</h2>
|
||||
<blockquote><p>To use multiple file buffers, you must be using nano 1.1.0 or newer, and you must have configured nano with <b>--enable-multibuffer</b> (use nano -V to check). Then when you want to enable inserting a file into its own buffer instead of into the current file, just hit <b>Meta-F</b>, then insert the file as normal with <b>^R</b>. If you always want files to be loaded into their own buffers, use the <b>--multibuffer</b> or <b>-F</b> flag when you invoke nano.</p>
|
||||
<blockquote><p>To use multiple file buffers, you must be using nano 1.1.0 or newer, and you must have configured nano with <b>--enable-multibuffer</b> (use nano -V to check). Then when you want to enable inserting a file into its own buffer instead of into the current file, just hit <b>Meta-F</b>, then insert the file as normal with <b>^R</b>. If you always want files to be loaded into their own buffers, use the <b>--multibuffer</b> or <b>-F</b> flag when you invoke nano.</p>
|
||||
<p>You can move between the buffers you have open with the <b>Meta-<</b> and <b>Meta-></b> keys, or more easily with <b>Meta-,</b> and <b>Meta-.</b> (clear as mud, right? =-). When you have more than one file buffer open, the ^X shortcut will say "Close", instead of the normal "Exit" when only one buffer is open.</p></blockquote>
|
||||
<h2><a name="3.8"></a>3.8. Tell me more about this verbatim input stuff!</h2>
|
||||
<blockquote><p>To use verbatim input, you must be using nano 1.3.1 or newer. When you want to insert a literal character into the file you're editing, such as a control character that nano usually treats as a command, first press <b>Meta-V</b>. (If you're not at a prompt, you'll get the message "Verbatim Input".) Then press the key(s) that generate the character you want.</p>
|
||||
@@ -172,7 +172,7 @@
|
||||
<hr width="100%">
|
||||
<h1><a name="4"></a>4. Running</h1>
|
||||
<h2><a name="4.1"></a>4.1. How do I open a file with a name beginning with '+' from the command line?</h2>
|
||||
<blockquote><p>If a command line option that begins with '+' is followed by another option, the former is always treated as a starting line number and the latter is always treated as a filename. If a command line option that begins with '+' isn't followed by another option, it's always treated as a filename. Examples:</p>
|
||||
<blockquote><p>If a command line option that begins with '+' is followed by another option, the former is always treated as a starting line number and the latter is always treated as a filename. If a command line option that begins with '+' isn't followed by another option, it's always treated as a filename. Examples:</p>
|
||||
<p>To open '+filename.txt' starting on line 1: <b>nano +filename.txt</b><br>
|
||||
To open '+filename.txt' starting on line 10: <b>nano +10 +filename.txt</b><br>
|
||||
To open '+filename.txt' starting on line 1 and 'filename.txt' starting on line 10 (if nano has been compiled with multibuffer support): <b>nano +1 +filename.txt +20 filename.txt</b></p></blockquote>
|
||||
@@ -181,7 +181,7 @@
|
||||
<p>Bourne shell users (bash and sh): <b>export TERM=vt100</b><br>
|
||||
C Shell users (tcsh and csh): <b>setenv TERM vt100</b></p></blockquote>
|
||||
<h2><a name="4.3"></a>4.3. Ack! My numeric keypad's keys don't work properly when NumLock is off! What can I do?</h2>
|
||||
<blockquote><p>You can use the <b>-K</b> or <b>--rebindkeypad</b> options on the command line, or add the line <b>set rebindkeypad</b> to your .nanorc. However, nano's mouse support won't work properly if you do any of these things.</p></blockquote>
|
||||
<blockquote><p>You can use the <b>-K</b> or <b>--rebindkeypad</b> options on the command line, or add the line <b>set rebindkeypad</b> to your .nanorc. However, nano's mouse support won't work properly if you do any of these things.</p></blockquote>
|
||||
<h2><a name="4.4"></a>4.4. Ack! When I hold down a Meta key combination for a while, the character of the held key gets inserted now and then. What gives?</h2>
|
||||
<blockquote><p>This is a bug in the terminal, not in nano. When a key is repeating faster than nano can process it, the keyboard buffer becomes full and starts dropping incoming keystrokes. Unfortunately, it doesn't just drop whole keystrokes; it can also drop parts of multibyte key combinations, resulting in nano's receiving a wrong key.</p></blockquote>
|
||||
<h2><a name="4.5"></a>4.5. How do I type the F13-F16 keys shown in the help browser? My keyboard only has F1-F12!</h2>
|
||||
@@ -197,7 +197,7 @@
|
||||
<h2><a name="4.10a"></a>4.10a. [version 1.1.12 and earlier] When I type in a search string, the string I last searched for is already in front of my cursor! What happened?!</h2>
|
||||
<blockquote><p>In nano version 0.9.20, the default is to have a completely consistent user interface across all user input functions. This means that regardless of whether you're being asked for a filename to insert or write, or a string to search for, the previous value is already inserted before the cursor. If you prefer the old behavior, use the Pico emulation mode (-p or --pico) or just hit Meta-P while in nano (see the ^G help text for more details).</p></blockquote>
|
||||
<h2><a name="4.10b"></a>4.10b. [version 1.1.99pre1 and later] Hey, the search string behavior has reverted, it's now like Pico, what happened to the consistency?</h2>
|
||||
<blockquote><p>It was decided that consistency was nice, but people are used to Pico's inconsistent behavior. Also, in version 1.1.99pre1, search and replace history was introduced. If you wish to edit your previous search/replace entry (or any previous entry), you can do so by hitting the up arrow to cycle through your history. This method allows the best of both worlds: You don't need to erase the previous string if you want to enter a new one, but you can with one keystroke recall previous entries for editing. Therefore there is now no "Pico mode", nano is and has always been a Pico <b>clone</b>, and clones by default should be compatible.</p></blockquote>
|
||||
<blockquote><p>It was decided that consistency was nice, but people are used to Pico's inconsistent behavior. Also, in version 1.1.99pre1, search and replace history was introduced. If you wish to edit your previous search/replace entry (or any previous entry), you can do so by hitting the up arrow to cycle through your history. This method allows the best of both worlds: You don't need to erase the previous string if you want to enter a new one, but you can with one keystroke recall previous entries for editing. Therefore there is now no "Pico mode", nano is and has always been a Pico <b>clone</b>, and clones by default should be compatible.</p></blockquote>
|
||||
<h2><a name="4.11"></a>4.11. How do I make nano my default editor (in Pine, mutt, etc.)?</h2>
|
||||
<blockquote><p>You need to make nano your $EDITOR. If you want this to be saved, you should put a line like this in your <b>.bashrc</b> if you use bash (or <b>.zshrc</b> if you believe in zsh):</p>
|
||||
<p><b>export EDITOR=/usr/local/bin/nano</b></p>
|
||||
@@ -224,7 +224,7 @@
|
||||
<h2><a name="5.2"></a>5.2. I don't like the translation for <x> in my language. How can I fix it?</h2>
|
||||
<blockquote><p>The best way would probably be to e-mail the person listed in the <code>Last-Translator:</code> field in the <b><your_language>.po</b> file with your suggested corrections and they can make the changes reach the nano-devel list.</p></blockquote>
|
||||
<h2><a name="5.3"></a>5.3. What is the status of Unicode support?</h2>
|
||||
<blockquote><p>With the latest development version (1.3.12+), Unicode should be usable. With your terminal, locale (LC_ALL and similar environment variables), and encoding configured to properly support UTF-8, you should be able to enter and save Unicode text.</p></blockquote>
|
||||
<blockquote><p>In version 1.3.12 or later, Unicode should be usable. With your terminal, locale (LC_ALL and similar environment variables), and encoding configured to properly support UTF-8, you should be able to enter and save Unicode text.</p></blockquote>
|
||||
<hr width="100%">
|
||||
<h1><a name="6"></a>6. Advocacy and Licensing</h1>
|
||||
<h2><a name="6.1"></a>6.1. Why should I use nano instead of Pico?</h2>
|
||||
@@ -256,7 +256,8 @@
|
||||
<blockquote><p>Re-read Section <a href="#7.4">7.4</a> and you should know the answer.</p></blockquote>
|
||||
<h2><a name="8"></a>8. ChangeLog</h2>
|
||||
<blockquote>
|
||||
<p>2006/06/12 - Update section 5.3, due to the display fix for two-column Unicode characters. (DLR)<br>
|
||||
<p>2006/07/25 - Update section 5.3 again to not state "the latest development version" before 1.3.12, as it's no longer accurate. Also add some minor spacing fixes. (DLR)<br>
|
||||
2006/06/12 - Update section 5.3, due to the display fix for two-column Unicode characters. (DLR)<br>
|
||||
2006/06/05 - Add a new section 4.8, and move all section 4 entries after it down one number, to explain how to deal with glibc 2.2.3's crashes involving extended regular expressions. (DLR)<br>
|
||||
2006/06/04 - Add minor punctuation, wording, and typo fixes. (DLR)<br>
|
||||
2006/05/27 - Update section 3.8 to mention the new "Unicode Input" prompt, and how Unicode input only works when Unicode support is enabled. (DLR)<br>
|
||||
@@ -280,7 +281,7 @@
|
||||
2004/11/05 - Fixed inaccuracy: Pico compatibility mode was made the default in nano 1.1.99pre1, not 1.2.2. Also added question about how to type F13-F16 on terminals lacking keys past F12 (suggested by Chris), question about how to select text for the clipboard in X terminals with nano's mouse support turned on (answer found by Joseph Birthisel), and misc. fixes and link updates. (DLR)<br>
|
||||
2004/04/07 - Removed NumLock glitch question, as it's no longer needed. (DLR)<br>
|
||||
2004/01/30 - Fixed inaccuracy: multibuffer mode was first in nano 1.1.0, not 1.1.12. (DLR)<br>
|
||||
2003/12/31 - Added question about the new verbatim input function, and a few minor fixes. Removed reference to "set pico" (DLR).<br>
|
||||
2003/12/31 - Added question about the new verbatim input function, and a few minor fixes. Removed reference to "set pico" (DLR).<br>
|
||||
2003/07/02 - Added question about nano's not showing color when it's compiled with color support (DLR; suggested by Jordi).<br>
|
||||
2003/02/23 - Updated RPM links for nano 1.2.x (DLR).<br>
|
||||
2003/01/16 - Split section 4.5 into 4.5a and 4.5b for search string behavior. Added --enable-all docs.<br>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
SUBDIRS =
|
||||
|
||||
if USE_NLS
|
||||
SUBDIRS += fr
|
||||
SUBDIRS = fr
|
||||
else
|
||||
SUBDIRS =
|
||||
endif
|
||||
|
||||
man_MANS = nano.1 nanorc.5 rnano.1
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
.\" 2006 by Chris Allegretta <chrisa@asty.org>
|
||||
.\"
|
||||
.\" Adaptation française (c) 2003-2006 par
|
||||
.\" Jean-Philippe Guérard <jean-philippe.guerard@corbeaunoir.org>.
|
||||
.\" Jean-Philippe Guérard <jean-philippe.guerard@tigreraye.org>.
|
||||
.\"
|
||||
.\" This is free documentation, see the latest version of the GNU
|
||||
.\" General Public License for copying conditions. There is NO
|
||||
@@ -15,7 +15,7 @@
|
||||
.\" AUCUNE garantie.
|
||||
.\"
|
||||
.\" $Id$
|
||||
.TH NANO 1 "version 1.3.12" "17\ juin\ 2006"
|
||||
.TH NANO 1 "version 1.9.99pre1" "28\ août\ 2006"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\" Merci de modifier ces dates à chaque mise à jour de cette page.
|
||||
.\"
|
||||
@@ -25,7 +25,7 @@ nano \- NAno un NOuvel
|
||||
|
||||
.SH SYNOPSIS
|
||||
.B nano
|
||||
.I [OPTIONS]\ [[\+LIGNE[,COLONNE]]\ FICHIER]...
|
||||
.I [OPTIONS]\ [[\+LIGNE,COLONNE]\ FICHIER]...
|
||||
.br
|
||||
|
||||
.SH DESCRIPTION
|
||||
@@ -44,9 +44,10 @@ num
|
||||
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B \+\fILIGNE\fP[,\fICOLONNE\fP]
|
||||
.B \+\fILIGNE\fP,\fICOLONNE\fP
|
||||
Démarre avec le curseur positionné à la colonne \fICOLONNE\fP de
|
||||
la ligne \fILIGNE\fR au lieu de démarrer à la colonne\ 1, ligne\ 1.
|
||||
la ligne \fILIGNE\fR (l'un des deux, au moins, devant être spécifié) au
|
||||
lieu de démarrer à la colonne\ 1, ligne\ 1.
|
||||
.TP
|
||||
.B \-?
|
||||
Identique à \fB-h (\-\-help)\fP.
|
||||
@@ -256,7 +257,7 @@ Pour vous abonner, envoyez un courrier
|
||||
|
||||
N'hésitez pas également à envoyez vos commentaires, suggestions et
|
||||
corrections relatives à l'adaptation française de cette page de manuel
|
||||
ou du logiciel à \fBjean-philippe.guerard@corbeaunoir.org\fR.
|
||||
ou du logiciel à \fBjean-philippe.guerard@tigreraye.org\fR.
|
||||
|
||||
.SH "SITE INTERNET"
|
||||
http://www.nano-editor.org/
|
||||
@@ -271,15 +272,14 @@ http://www.nano-editor.org/
|
||||
.SH AUTEUR
|
||||
Chris Allegretta <chrisa@asty.org> et d'autres (voir les fichiers
|
||||
\fIAUTHORS\fR et \fITHANKS\fR pour plus d'information). Cette page de
|
||||
manuel a été initialement rédigée par Jordi Mallach
|
||||
<jordi@sindominio.net> pour le système GNU Debian (mais elle peut être
|
||||
utilisée par d'autres).
|
||||
manuel a été initialement rédigée par Jordi Mallach <jordi@gnu.org> pour
|
||||
le système Debian (mais elle peut être utilisée par d'autres).
|
||||
|
||||
.SH TRADUCTION
|
||||
Cette adaptation française a été réalisé par Jean-Philippe\ Guérard
|
||||
<jean-philippe.guerard@corbeaunoir.org> le 17\ juin\ 2006 à partir
|
||||
de la version du 8\ juin\ 2006 de la page de manuel de nano 1.3.12.
|
||||
Cette page a été relue par Gérard Delafond.
|
||||
<jean-philippe.guerard@tigreraye.org> le 28\ août\ 2006 à partir
|
||||
de la version du 12\ juillet\ 2006 de la page de manuel de nano
|
||||
1.9.99pre1. Cette page a été relue par Gérard Delafond.
|
||||
|
||||
Un maximum de soin a été apporté lors de l'élaboration de cette
|
||||
traduction\ ; néanmoins, quelques imperfections peuvent subsister. Si
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
.\" nanorc.5 is Copyright (C) 2003, 2004, 2005, 2006 by the Free
|
||||
.\" Software Foundation, Inc.
|
||||
.\"
|
||||
.\" (c) 2003-2006 Jean-Philippe Guérard <jean-philippe.guerard@corbeaunoir.org>
|
||||
.\" (c) 2003-2006 Jean-Philippe Guérard <jean-philippe.guerard@tigreraye.org>
|
||||
.\" pour l'adaptation française.
|
||||
.\"
|
||||
.\" This is free documentation, see the latest version of the GNU
|
||||
@@ -15,7 +15,7 @@
|
||||
.\" AUCUNE garantie.
|
||||
.\"
|
||||
\" $Id$
|
||||
.TH NANORC 5 "version 1.3.12" "17\ juin\ 2006"
|
||||
.TH NANORC 5 "version 1.9.99pre1" "28\ août\ 2006"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\" Merci de modifier ces dates à chaque mise à jour de cette page.
|
||||
|
||||
@@ -321,13 +321,14 @@ votre syst
|
||||
.SH AUTEUR
|
||||
Chris Allegretta <chrisa@asty.org> et d'autres (voir les fichiers
|
||||
\fIAUTHORS\fP et \fITHANKS\fP pour plus d'information). Cette page de
|
||||
manuel a été rédigée par Jordi Mallach <jordi@gnu.org>.
|
||||
manuel a été initialement rédigée par Jordi Mallach <jordi@gnu.org> pour
|
||||
le système Debian (mais elle peut être utilisée par d'autres).
|
||||
|
||||
.SH TRADUCTION
|
||||
Cette adaptation française a été réalisé par Jean-Philippe\ Guérard
|
||||
<jean-philippe.guerard@corbeaunoir.org> le 17\ juin\ 2006 à partir de
|
||||
la version du 24\ mai\ 2006 de la page de manuel de nanorc (pour la
|
||||
version 1.3.12 de nano). Cette page a été relue par Gérard
|
||||
<jean-philippe.guerard@tigreraye.org> le 28\ août\ 2006 à partir de
|
||||
la version du 30\ juillet\ 2006 de la page de manuel de nanorc (pour la
|
||||
version 1.9.99pre1 de nano). Cette page a été relue par Gérard
|
||||
Delafond.
|
||||
|
||||
Un maximum de soin a été apporté lors de l'élaboration de cette
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
.\" Hey, EMACS: -*- nroff -*-
|
||||
.\" rnano.1 is Copyright 2005, 2006 by Thijs Kinkhorst
|
||||
.\" <thijs@kinkhorst.com>; skeleton based on nano-tiny.1 by Jordi
|
||||
.\" Mallach <jordi@debian.org>.
|
||||
.\" Mallach <jordi@gnu.org>.
|
||||
.\"
|
||||
.\" Adaptation française (c) 2006 par
|
||||
.\" Jean-Philippe Guérard <jean-philippe.guerard@corbeaunoir.org>.
|
||||
.\" Jean-Philippe Guérard <jean-philippe.guerard@tigreraye.org>.
|
||||
.\"
|
||||
.\" This is free documentation, see the latest version of the GNU
|
||||
.\" General Public License for copying conditions. There is NO
|
||||
@@ -16,7 +16,7 @@
|
||||
.\" AUCUNE garantie.
|
||||
.\"
|
||||
.\" $Id$
|
||||
.TH RNANO 1 "version 1.3.12" "17\ juin\ 20O6"
|
||||
.TH RNANO 1 "version 1.9.99pre1" "28\ août\ 20O6"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\" Merci de modifier ces dates à chaque mise à jour de cette page.
|
||||
.\"
|
||||
@@ -26,7 +26,7 @@ am
|
||||
|
||||
.SH SYNOPSIS
|
||||
.B rnano
|
||||
.I [OPTIONS]\ [[\+LIGNE[,COLONNE]]\ FICHIER]...
|
||||
.I [OPTIONS]\ [[\+LIGNE,COLONNE]\ FICHIER]...
|
||||
.br
|
||||
|
||||
.SH DESCRIPTION
|
||||
@@ -64,9 +64,10 @@ l'utilisation de copies de s
|
||||
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B \+\fILIGNE\fP[,\fICOLONNE\fP]
|
||||
.B \+\fILIGNE\fP,\fICOLONNE\fP
|
||||
Démarre avec le curseur positionné à la colonne \fICOLONNE\fP de
|
||||
la ligne \fILIGNE\fR au lieu de démarrer à la colonne\ 1, ligne\ 1.
|
||||
la ligne \fILIGNE\fR (l'un des deux, au moins, devant être spécifié) au
|
||||
lieu de démarrer à la colonne\ 1, ligne\ 1.
|
||||
.TP
|
||||
.B \-?
|
||||
Identique à \fB-h (\-\-help)\fP.
|
||||
@@ -92,7 +93,7 @@ Pour vous abonner, envoyez un courrier
|
||||
|
||||
N'hésitez pas également à envoyez vos commentaires, suggestions et
|
||||
corrections relatives à l'adaptation française de cette page de manuel
|
||||
ou du logiciel à \fBjean-philippe.guerard@corbeaunoir.org\fR.
|
||||
ou du logiciel à \fBjean-philippe.guerard@tigreraye.org\fR.
|
||||
|
||||
.SH "SITE INTERNET"
|
||||
http://www.nano-editor.org/
|
||||
@@ -105,9 +106,9 @@ elle peut
|
||||
|
||||
.SH TRADUCTION
|
||||
Cette adaptation française a été réalisé par Jean-Philippe\ Guérard
|
||||
<jean-philippe.guerard@corbeaunoir.org> le 17\ juin\ 2006 à partir
|
||||
de la version du 1er\ mai\ 2006 de la page de manuel de rnano
|
||||
(pour la version 1.3.12 de nano).
|
||||
<jean-philippe.guerard@tigreraye.org> le 28\ août\ 2006 à partir
|
||||
de la version du 12\ juillet\ 2006 de la page de manuel de rnano
|
||||
(pour la version 1.9.99pre1 de nano).
|
||||
|
||||
Un maximum de soin a été apporté lors de l'élaboration de cette
|
||||
traduction\ ; néanmoins, quelques imperfections peuvent subsister. Si
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
.\" warranty.
|
||||
.\"
|
||||
.\" $Id$
|
||||
.TH NANO 1 "version 1.3.12" "June 7, 2006"
|
||||
.TH NANO 1 "version 1.9.99pre1" "July 12, 2006"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\"
|
||||
|
||||
@@ -16,7 +16,7 @@ nano \- Nano's ANOther editor, an enhanced free Pico clone
|
||||
|
||||
.SH SYNOPSIS
|
||||
.B nano
|
||||
.I [OPTIONS]\ [[\+LINE[,COLUMN]]\ FILE]...
|
||||
.I [OPTIONS]\ [[\+LINE,COLUMN]\ FILE]...
|
||||
.br
|
||||
|
||||
.SH DESCRIPTION
|
||||
@@ -33,9 +33,10 @@ replace" and "go to line number".
|
||||
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B \+\fILINE\fP[,\fICOLUMN\fP]
|
||||
.B \+\fILINE\fP,\fICOLUMN\fP
|
||||
Places cursor at line number \fILINE\fP and column number \fICOLUMN\fP
|
||||
on startup, instead of the default of line 1, column 1.
|
||||
(at least one of which must be specified) on startup, instead of the
|
||||
default of line 1, column 1.
|
||||
.TP
|
||||
.B \-?
|
||||
Same as \fB-h (\-\-help)\fP.
|
||||
@@ -229,5 +230,5 @@ http://www.nano-editor.org/
|
||||
.SH AUTHOR
|
||||
Chris Allegretta <chrisa@asty.org>, et al (see \fIAUTHORS\fP and
|
||||
\fITHANKS\fP for details). This manual page was originally written by
|
||||
Jordi Mallach <jordi@sindominio.net>, for the Debian GNU system (but may
|
||||
be used by others).
|
||||
Jordi Mallach <jordi@gnu.org>, for the Debian system (but may be used by
|
||||
others).
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
.\" warranty.
|
||||
.\"
|
||||
.\" $Id$
|
||||
.TH NANORC 5 "version 1.3.12" "May 24, 2006"
|
||||
.TH NANORC 5 "version 1.9.99pre1" "July 30, 2006"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\"
|
||||
.SH NAME
|
||||
@@ -92,7 +92,7 @@ come before the latter set, and both must be in the same order. The
|
||||
default value is "\fI(<[{)>]}\fP".
|
||||
.TP
|
||||
.B set/unset morespace
|
||||
Allow use of the blank line below the titlebar as extra editing space.
|
||||
Use the blank line below the titlebar as extra editing space.
|
||||
.TP
|
||||
.B set/unset mouse
|
||||
Enable mouse support, if available for your system. When enabled, mouse
|
||||
@@ -194,7 +194,7 @@ spaces. They must be single-column characters.
|
||||
.TP
|
||||
.B set/unset wordbounds
|
||||
Detect word boundaries more accurately by treating punctuation
|
||||
characters as part of a word.
|
||||
characters as parts of words.
|
||||
.TP
|
||||
.B syntax "\fIstr\fP" ["\fIfileregex\fP" ... ]
|
||||
Defines a syntax named \fIstr\fP which can be activated via the
|
||||
@@ -254,5 +254,6 @@ Per-user configuration file
|
||||
system)
|
||||
.SH AUTHOR
|
||||
Chris Allegretta <chrisa@asty.org>, et al (see \fIAUTHORS\fP and
|
||||
\fITHANKS\fP for details). This manual page was written by Jordi
|
||||
Mallach <jordi@gnu.org>.
|
||||
\fITHANKS\fP for details). This manual page was originally written by
|
||||
Jordi Mallach <jordi@gnu.org>, for the Debian system (but may be used by
|
||||
others).
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
.\" Hey, EMACS: -*- nroff -*-
|
||||
.\" rnano.1 is Copyright 2005, 2006 by Thijs Kinkhorst
|
||||
.\" <thijs@kinkhorst.com>; skeleton based on nano-tiny.1 by Jordi
|
||||
.\" Mallach <jordi@debian.org>.
|
||||
.\" Mallach <jordi@gnu.org>.
|
||||
.\"
|
||||
.\" This is free documentation, see the latest version of the GNU
|
||||
.\" General Public License for copying conditions. There is NO
|
||||
.\" warranty.
|
||||
.\"
|
||||
.\" $Id$
|
||||
.TH RNANO 1 "version 1.3.12" "May 1, 2006"
|
||||
.TH RNANO 1 "version 1.9.99pre1" "July 12, 2006"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\"
|
||||
.SH NAME
|
||||
@@ -17,7 +17,7 @@ Pico clone
|
||||
|
||||
.SH SYNOPSIS
|
||||
.B rnano
|
||||
.I [OPTIONS]\ [[\+LINE[,COLUMN]]\ FILE]...
|
||||
.I [OPTIONS]\ [[\+LINE,COLUMN]\ FILE]...
|
||||
.br
|
||||
|
||||
.SH DESCRIPTION
|
||||
@@ -51,9 +51,10 @@ use backup files or spell checking.
|
||||
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B \+\fILINE\fP[,\fICOLUMN\fP]
|
||||
.B \+\fILINE\fP,\fICOLUMN\fP
|
||||
Places cursor at line number \fILINE\fP and column number \fICOLUMN\fP
|
||||
on startup, instead of the default of line 1, column 1.
|
||||
(at least one of which must be specified) on startup, instead of the
|
||||
default of line 1, column 1.
|
||||
.TP
|
||||
.B \-?
|
||||
Same as \fB-h (\-\-help)\fP.
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
## Save automatically on exit, don't prompt.
|
||||
# set tempfile
|
||||
|
||||
## Disallow file modification; why would you want this in an rcfile? ;)
|
||||
## Disallow file modification. Why would you want this in an rcfile? ;)
|
||||
# set view
|
||||
|
||||
## The two single-column characters used to display the first characters
|
||||
@@ -167,7 +167,7 @@
|
||||
# set whitespace " "
|
||||
|
||||
## Detect word boundaries more accurately by treating punctuation
|
||||
## characters as part of a word.
|
||||
## characters as parts of words.
|
||||
# set wordbounds
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
## Here is an example for C/C++.
|
||||
##
|
||||
syntax "c" "\.(c|C|cc|cpp|cxx|h|H|hh|hpp|hxx)$"
|
||||
syntax "c" "\.(c(c|pp|xx)?|C)$" "\.(h(h|pp|xx)?|H)$" "\.ii?$"
|
||||
color brightred "\<[A-Z_][0-9A-Z_]+\>"
|
||||
color green "\<(float|double|bool|char|int|short|long|sizeof|enum|void|static|const|struct|union|typedef|extern|signed|unsigned|inline)\>"
|
||||
color green "\<(u_?)?int(8|16|32|64|ptr)_t\>"
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
## Here is an example for Ruby.
|
||||
##
|
||||
syntax "ruby" "\.rb$"
|
||||
## Asciibetical list of reserved words
|
||||
color yellow "\<(BEGIN|END|alias|and|begin|break|case|class|def|defined\?|do|else|elsif|end|ensure|false|for|if|in|module|next|nil|not|or|redo|rescue|retry|return|self|super|then|true|undef|unless|until|when|while|yield)\>"
|
||||
## Constants
|
||||
color brightblue "(\$|@|@@)?[A-Z]+[0-9A-Z_a-z]*"
|
||||
color brightblue "(\$|@|@@)?\<[A-Z]+[0-9A-Z_a-z]*"
|
||||
## Ruby "symbols"
|
||||
icolor magenta "([ ]|^):[0-9A-Z_]+\>"
|
||||
## Some unique things we want to stand out
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
@c Run 'makeinfo' rather than 'texinfo-format-buffer'.
|
||||
@smallbook
|
||||
@set EDITION 0.1
|
||||
@set VERSION 1.3.12
|
||||
@set UPDATED 20 Jun 2006
|
||||
@set VERSION 1.9.99pre1
|
||||
@set UPDATED 30 Jul 2006
|
||||
|
||||
@dircategory Editors
|
||||
@direntry
|
||||
@@ -23,7 +23,7 @@
|
||||
@titlepage
|
||||
@title GNU @code{nano}
|
||||
@subtitle a small and friendly text editor.
|
||||
@subtitle version 1.3.12
|
||||
@subtitle version 1.9.99pre1
|
||||
|
||||
@author Chris Allegretta
|
||||
@page
|
||||
@@ -94,6 +94,8 @@ adding it with a comma. So the complete synopsis is:
|
||||
@quotation
|
||||
@code{nano [OPTION]@dots{} [[+LINE] FILE]@dots{}}
|
||||
|
||||
@code{nano [OPTION]@dots{} [[+,COLUMN] FILE]@dots{}}
|
||||
|
||||
@code{nano [OPTION]@dots{} [[+LINE,COLUMN] FILE]@dots{}}
|
||||
@end quotation
|
||||
|
||||
@@ -105,9 +107,9 @@ Email bug reports to @email{nano@@nano-editor.org}.
|
||||
@code{nano} takes the following options from the command line:
|
||||
|
||||
@table @code
|
||||
@item +LINE[,COLUMN]
|
||||
Start at line number LINE and column number COLUMN instead of the
|
||||
default of line 1, column 1.
|
||||
@item +LINE,COLUMN
|
||||
Start at line number LINE and column number COLUMN (at least one of
|
||||
which must be specified) instead of the default of line 1, column 1.
|
||||
|
||||
@item -?
|
||||
Same as @code{-h, --help}.
|
||||
@@ -155,6 +157,9 @@ Don't add newlines to the ends of files.
|
||||
@item -N, --noconvert
|
||||
Don't convert files from DOS/Mac format.
|
||||
|
||||
@item -O, --morespace
|
||||
Use the blank line below the titlebar as extra editing space.
|
||||
|
||||
@item -Q <str>, --quotestr=<str>
|
||||
Set the quoting string for justifying. The default value is
|
||||
|
||||
@@ -189,7 +194,7 @@ Show the current version number and exit.
|
||||
|
||||
@item -W, --wordbounds
|
||||
Detect word boundaries more accurately by treating punctuation
|
||||
characters as part of a word.
|
||||
characters as parts of words.
|
||||
|
||||
@item -Y <str>, --syntax=<str>
|
||||
Specify a specific syntax highlighting from the nanorc to use, if
|
||||
@@ -520,7 +525,7 @@ default value is
|
||||
@end quotation
|
||||
|
||||
@item set/unset morespace
|
||||
Allow use of the blank line below the titlebar as extra editing space.
|
||||
Use the blank line below the titlebar as extra editing space.
|
||||
|
||||
@item set/unset mouse
|
||||
Enable mouse support, so that mouse clicks can be used to place the
|
||||
|
||||
20
po/ChangeLog
20
po/ChangeLog
@@ -1,3 +1,23 @@
|
||||
2006-08-28 Jordi Mallach <jordi@gnu.org>
|
||||
|
||||
* fr.po: Updated French translation by Jean-Philippe Guérard.
|
||||
|
||||
2006-08-25 Jordi Mallach <jordi@gnu.org>
|
||||
|
||||
* bg.po: Updated Bulgarian translation by Anton Zinoviev.
|
||||
* ca.po: Updated Catalan translation.
|
||||
* ga.po: Updated Irish translation by Kevin Patrick Scannell.
|
||||
* it.po: Updated Italian translation by Marco Colombo.
|
||||
* nl.po: Updated Dutch translation by Benno Schulenberg.
|
||||
* sv.po: Updated Swedish translation by Daniel Nylander.
|
||||
|
||||
2006-08-15 David Lawrence Ramsey <pooka109@cox.net>
|
||||
|
||||
* hu.po: Removed unneeded duplicate plural forms, as gettext
|
||||
0.15 generates errors upon encountering them.
|
||||
* id.po: Removed unneeded duplicate plural forms, as gettext
|
||||
0.15 generates errors upon encountering them.
|
||||
|
||||
2006-06-20 Jordi Mallach <jordi@gnu.org>
|
||||
|
||||
* ca.po: Updated Catalan translation.
|
||||
|
||||
6
po/hu.po
6
po/hu.po
@@ -108,28 +108,24 @@ msgstr "Új puffer"
|
||||
msgid "Read %lu line (Converted from DOS and Mac format)"
|
||||
msgid_plural "Read %lu lines (Converted from DOS and Mac format)"
|
||||
msgstr[0] "%lu sor beolvasva (DOS és Mac formátumról átalakítva)"
|
||||
msgstr[1] "%lu sor beolvasva (DOS és Mac formátumról átalakítva)"
|
||||
|
||||
#: src/files.c:564
|
||||
#, c-format
|
||||
msgid "Read %lu line (Converted from Mac format)"
|
||||
msgid_plural "Read %lu lines (Converted from Mac format)"
|
||||
msgstr[0] "%lu sor beolvasva (Mac formátumról átalakítva)"
|
||||
msgstr[1] "%lu sor beolvasva (Mac formátumról átalakítva)"
|
||||
|
||||
#: src/files.c:569
|
||||
#, c-format
|
||||
msgid "Read %lu line (Converted from DOS format)"
|
||||
msgid_plural "Read %lu lines (Converted from DOS format)"
|
||||
msgstr[0] "%lu sor beolvasva (DOS formátumról átalakítva)"
|
||||
msgstr[1] "%lu sor beolvasva (DOS formátumról átalakítva)"
|
||||
|
||||
#: src/files.c:574
|
||||
#, c-format
|
||||
msgid "Read %lu line"
|
||||
msgid_plural "Read %lu lines"
|
||||
msgstr[0] "%lu sor beolvasva"
|
||||
msgstr[1] "%lu sor beolvasva"
|
||||
|
||||
#: src/files.c:594
|
||||
msgid "New File"
|
||||
@@ -209,7 +205,6 @@ msgstr "Hiba az ideiglenes fájl írásakor: %s"
|
||||
msgid "Wrote %lu line"
|
||||
msgid_plural "Wrote %lu lines"
|
||||
msgstr[0] "%lu sor kiírva"
|
||||
msgstr[1] "%lu sor kiírva"
|
||||
|
||||
#: src/files.c:1751
|
||||
msgid " [DOS Format]"
|
||||
@@ -1609,7 +1604,6 @@ msgstr "Csere ezzel"
|
||||
msgid "Replaced %lu occurrence"
|
||||
msgid_plural "Replaced %lu occurrences"
|
||||
msgstr[0] "%lu előfordulás cserélve"
|
||||
msgstr[1] "%lu előfordulás cserélve"
|
||||
|
||||
#: src/search.c:989
|
||||
msgid "Enter line number, column number"
|
||||
|
||||
4
po/id.po
4
po/id.po
@@ -21,21 +21,18 @@ msgstr ""
|
||||
msgid "Read %d line (Converted from Mac format)"
|
||||
msgid_plural "Read %d lines (Converted from Mac format)"
|
||||
msgstr[0] "Baca %d baris (Dikonversi dari format Mac)"
|
||||
msgstr[1] "Baca %d baris (Dikonversi dari format Mac)"
|
||||
|
||||
#: files.c:321
|
||||
#, c-format
|
||||
msgid "Read %d line (Converted from DOS format)"
|
||||
msgid_plural "Read %d lines (Converted from DOS format)"
|
||||
msgstr[0] "Membaca %d baris (Konversi dari format DOS)"
|
||||
msgstr[1] "Membaca %d baris (Konversi dari format DOS)"
|
||||
|
||||
#: files.c:326
|
||||
#, c-format
|
||||
msgid "Read %d line"
|
||||
msgid_plural "Read %d lines"
|
||||
msgstr[0] "Membaca %d baris"
|
||||
msgstr[1] "Membaca %d baris"
|
||||
|
||||
#: files.c:343 search.c:58
|
||||
#, c-format
|
||||
@@ -170,7 +167,6 @@ msgstr "Tidak dapat menset permisi %o pada %s: %s"
|
||||
msgid "Wrote %d line"
|
||||
msgid_plural "Wrote %d lines"
|
||||
msgstr[0] "Menulis %d baris"
|
||||
msgstr[1] "Menulis %d baris"
|
||||
|
||||
#: files.c:1730
|
||||
msgid " [Mac Format]"
|
||||
|
||||
489
src/browser.c
489
src/browser.c
@@ -31,11 +31,11 @@
|
||||
#ifndef DISABLE_BROWSER
|
||||
|
||||
static char **filelist = NULL;
|
||||
/* The list of files to display in the browser. */
|
||||
/* The list of files to display in the file browser. */
|
||||
static size_t filelist_len = 0;
|
||||
/* The number of files in the list. */
|
||||
static int width = 0;
|
||||
/* The number of columns to display the list in. */
|
||||
/* The number of files that we can display per line. */
|
||||
static int longest = 0;
|
||||
/* The number of columns in the longest filename in the list. */
|
||||
static size_t selected = 0;
|
||||
@@ -44,16 +44,22 @@ static size_t selected = 0;
|
||||
static bool search_last_file = FALSE;
|
||||
/* Have we gone past the last file while searching? */
|
||||
|
||||
/* Our browser function. path is the tilde-expanded path to start
|
||||
* browsing from. */
|
||||
/* Our main file browser function. path is the tilde-expanded path to
|
||||
* start browsing from. */
|
||||
char *do_browser(char *path, DIR *dir)
|
||||
{
|
||||
int kbinput;
|
||||
bool meta_key, func_key;
|
||||
bool old_const_update = ISSET(CONST_UPDATE);
|
||||
char *ans = mallocstrcpy(NULL, "");
|
||||
/* The last answer the user typed on the statusbar. */
|
||||
char *retval = NULL;
|
||||
int kbinput;
|
||||
bool meta_key, func_key, old_const_update = ISSET(CONST_UPDATE);
|
||||
bool abort = FALSE;
|
||||
/* Whether we should abort the file browser. */
|
||||
char *prev_dir = NULL;
|
||||
/* The directory we were in, if any, before backing up via
|
||||
* browsing to "..". */
|
||||
char *ans = NULL;
|
||||
/* The last answer the user typed on the statusbar. */
|
||||
size_t old_selected;
|
||||
/* The selected file we had before the current selected file. */
|
||||
|
||||
curs_set(0);
|
||||
blank_statusbar();
|
||||
@@ -65,86 +71,99 @@ char *do_browser(char *path, DIR *dir)
|
||||
|
||||
UNSET(CONST_UPDATE);
|
||||
|
||||
change_browser_directory:
|
||||
/* We go here after the user selects a new directory. */
|
||||
ans = mallocstrcpy(NULL, "");
|
||||
|
||||
change_browser_directory:
|
||||
/* We go here after we select a new directory. */
|
||||
|
||||
/* Start with no key pressed. */
|
||||
kbinput = ERR;
|
||||
meta_key = FALSE;
|
||||
func_key = FALSE;
|
||||
width = 0;
|
||||
selected = 0;
|
||||
|
||||
path = mallocstrassn(path, get_full_path(path));
|
||||
|
||||
/* Assume that path exists and ends with a slash. */
|
||||
assert(path != NULL && path[strlen(path) - 1] == '/');
|
||||
|
||||
/* Get the list of files. */
|
||||
/* Get the file list, and set longest and width in the process. */
|
||||
browser_init(path, dir);
|
||||
|
||||
assert(filelist != NULL);
|
||||
|
||||
/* Sort the list. */
|
||||
/* Sort the file list. */
|
||||
qsort(filelist, filelist_len, sizeof(char *), diralphasort);
|
||||
|
||||
/* If prev_dir isn't NULL, select the directory saved in it, and
|
||||
* then blow it away. */
|
||||
if (prev_dir != NULL) {
|
||||
browser_select_filename(prev_dir);
|
||||
|
||||
free(prev_dir);
|
||||
prev_dir = NULL;
|
||||
/* Otherwise, select the first file or directory in the list. */
|
||||
} else
|
||||
selected = 0;
|
||||
|
||||
old_selected = (size_t)-1;
|
||||
|
||||
titlebar(path);
|
||||
|
||||
do {
|
||||
bool abort = FALSE;
|
||||
while (!abort) {
|
||||
struct stat st;
|
||||
int i;
|
||||
size_t fileline;
|
||||
size_t fileline = selected / width;
|
||||
/* The line number the selected file is on. */
|
||||
char *new_path;
|
||||
/* Used by the "Go To Directory" prompt. */
|
||||
#ifndef DISABLE_MOUSE
|
||||
MEVENT mevent;
|
||||
#endif
|
||||
/* The path we switch to at the "Go to Directory"
|
||||
* prompt. */
|
||||
|
||||
/* Compute the line number we're on now, so that we don't divide
|
||||
* by zero. */
|
||||
fileline = selected;
|
||||
if (width != 0)
|
||||
fileline /= width;
|
||||
/* Display the file list if we don't have a key, or if the
|
||||
* selected file has changed, and set width in the process. */
|
||||
if (kbinput == ERR || old_selected != selected)
|
||||
browser_refresh();
|
||||
|
||||
old_selected = selected;
|
||||
|
||||
kbinput = get_kbinput(edit, &meta_key, &func_key);
|
||||
parse_browser_input(&kbinput, &meta_key, &func_key);
|
||||
|
||||
switch (kbinput) {
|
||||
#ifndef DISABLE_MOUSE
|
||||
case KEY_MOUSE:
|
||||
if (getmouse(&mevent) == ERR)
|
||||
break;
|
||||
|
||||
/* If we clicked in the edit window, we probably clicked
|
||||
* on a file. */
|
||||
if (wenclose(edit, mevent.y, mevent.x)) {
|
||||
size_t old_selected = selected;
|
||||
|
||||
/* Subtract out the size of topwin. */
|
||||
mevent.y -= 2 - no_more_space();
|
||||
|
||||
/* longest is the width of each column. There are
|
||||
* two spaces between each column. */
|
||||
selected = (fileline / editwinrows) * (editwinrows *
|
||||
width) + (mevent.y * width) + (mevent.x /
|
||||
(longest + 2));
|
||||
|
||||
/* If they clicked beyond the end of a row, select
|
||||
* the end of that row. */
|
||||
if (mevent.x > width * (longest + 2))
|
||||
selected--;
|
||||
|
||||
/* If we're off the screen, reset to the last item.
|
||||
* If we clicked the same place as last time, select
|
||||
* this name! */
|
||||
if (selected > filelist_len - 1)
|
||||
selected = filelist_len - 1;
|
||||
else if (old_selected == selected)
|
||||
/* Put back the "Select" key, so that the file
|
||||
* is selected. */
|
||||
unget_kbinput(NANO_ENTER_KEY, FALSE, FALSE);
|
||||
} else {
|
||||
/* We must have clicked a shortcut. Put back the
|
||||
* equivalent shortcut key. */
|
||||
{
|
||||
int mouse_x, mouse_y;
|
||||
get_mouseinput(&mouse_x, &mouse_y, TRUE);
|
||||
|
||||
if (!get_mouseinput(&mouse_x, &mouse_y, TRUE)) {
|
||||
/* We can click in the edit window to select a
|
||||
* filename. */
|
||||
if (wenclose(edit, mouse_y, mouse_x)) {
|
||||
/* Subtract out the size of topwin. */
|
||||
mouse_y -= 2 - no_more_space();
|
||||
|
||||
/* longest is the width of each column.
|
||||
* There are two spaces between each
|
||||
* column. */
|
||||
selected = (fileline / editwinrows) *
|
||||
(editwinrows * width) + (mouse_y *
|
||||
width) + (mouse_x / (longest + 2));
|
||||
|
||||
/* If they clicked beyond the end of a row,
|
||||
* select the filename at the end of that
|
||||
* row. */
|
||||
if (mouse_x > width * (longest + 2))
|
||||
selected--;
|
||||
|
||||
/* If we're off the screen, select the last
|
||||
* filename. */
|
||||
if (selected > filelist_len - 1)
|
||||
selected = filelist_len - 1;
|
||||
|
||||
/* If we selected the same filename as last
|
||||
* time, put back the Enter key so that it's
|
||||
* read in. */
|
||||
if (old_selected == selected)
|
||||
unget_kbinput(NANO_ENTER_KEY, FALSE,
|
||||
FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif /* !DISABLE_MOUSE */
|
||||
@@ -181,7 +200,7 @@ char *do_browser(char *path, DIR *dir)
|
||||
case NANO_NEXTPAGE_KEY:
|
||||
selected += (editwinrows - fileline % editwinrows) *
|
||||
width;
|
||||
if (selected >= filelist_len)
|
||||
if (selected > filelist_len - 1)
|
||||
selected = filelist_len - 1;
|
||||
break;
|
||||
case NANO_FIRSTFILE_ALTKEY:
|
||||
@@ -252,7 +271,7 @@ char *do_browser(char *path, DIR *dir)
|
||||
|
||||
dir = opendir(new_path);
|
||||
if (dir == NULL) {
|
||||
/* We can't open this dir for some reason.
|
||||
/* We can't open this directory for some reason.
|
||||
* Complain. */
|
||||
statusbar(_("Error reading %s: %s"), answer,
|
||||
strerror(errno));
|
||||
@@ -264,7 +283,6 @@ char *do_browser(char *path, DIR *dir)
|
||||
/* Start over again with the new path value. */
|
||||
free(path);
|
||||
path = new_path;
|
||||
free_chararray(filelist, filelist_len);
|
||||
goto change_browser_directory;
|
||||
case NANO_PREVLINE_KEY:
|
||||
if (selected >= width)
|
||||
@@ -283,7 +301,7 @@ char *do_browser(char *path, DIR *dir)
|
||||
selected++;
|
||||
break;
|
||||
case NANO_ENTER_KEY:
|
||||
/* You can't move up from "/". */
|
||||
/* We can't move up from "/". */
|
||||
if (strcmp(filelist[selected], "/..") == 0) {
|
||||
statusbar(_("Can't move up a directory"));
|
||||
beep();
|
||||
@@ -291,7 +309,7 @@ char *do_browser(char *path, DIR *dir)
|
||||
}
|
||||
|
||||
#ifndef DISABLE_OPERATINGDIR
|
||||
/* Note: the selected file can be outside the operating
|
||||
/* Note: The selected file can be outside the operating
|
||||
* directory if it's ".." or if it's a symlink to a
|
||||
* directory outside the operating directory. */
|
||||
if (check_operating_dir(filelist[selected], FALSE)) {
|
||||
@@ -312,11 +330,18 @@ char *do_browser(char *path, DIR *dir)
|
||||
break;
|
||||
}
|
||||
|
||||
/* If we've successfully opened a file, we're done, so
|
||||
* get out. */
|
||||
if (!S_ISDIR(st.st_mode)) {
|
||||
retval = mallocstrcpy(retval, filelist[selected]);
|
||||
retval = mallocstrcpy(NULL, filelist[selected]);
|
||||
abort = TRUE;
|
||||
break;
|
||||
}
|
||||
/* If we've successfully opened a directory, and it's
|
||||
* "..", save the current directory in prev_dir, so that
|
||||
* we can select it later. */
|
||||
} else if (strcmp(tail(filelist[selected]), "..") == 0)
|
||||
prev_dir = mallocstrcpy(NULL,
|
||||
striponedir(filelist[selected]));
|
||||
|
||||
dir = opendir(filelist[selected]);
|
||||
if (dir == NULL) {
|
||||
@@ -331,34 +356,26 @@ char *do_browser(char *path, DIR *dir)
|
||||
path = mallocstrcpy(path, filelist[selected]);
|
||||
|
||||
/* Start over again with the new path value. */
|
||||
free_chararray(filelist, filelist_len);
|
||||
goto change_browser_directory;
|
||||
/* Abort the browser. */
|
||||
/* Abort the file browser. */
|
||||
case NANO_EXIT_KEY:
|
||||
abort = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (abort)
|
||||
break;
|
||||
|
||||
browser_refresh();
|
||||
|
||||
kbinput = get_kbinput(edit, &meta_key, &func_key);
|
||||
parse_browser_input(&kbinput, &meta_key, &func_key);
|
||||
} while (kbinput != NANO_EXIT_KEY);
|
||||
|
||||
blank_edit();
|
||||
titlebar(NULL);
|
||||
edit_refresh();
|
||||
curs_set(1);
|
||||
if (old_const_update)
|
||||
SET(CONST_UPDATE);
|
||||
|
||||
/* Clean up. */
|
||||
free(path);
|
||||
free(ans);
|
||||
|
||||
free_chararray(filelist, filelist_len);
|
||||
filelist = NULL;
|
||||
filelist_len = 0;
|
||||
|
||||
return retval;
|
||||
}
|
||||
@@ -384,7 +401,8 @@ char *do_browse_from(const char *inpath)
|
||||
* at all. If so, we'll just pass the current directory to
|
||||
* do_browser(). */
|
||||
if (stat(path, &st) == -1 || !S_ISDIR(st.st_mode)) {
|
||||
striponedir(path);
|
||||
path = mallocstrassn(path, striponedir(path));
|
||||
|
||||
if (stat(path, &st) == -1 || !S_ISDIR(st.st_mode)) {
|
||||
free(path);
|
||||
|
||||
@@ -399,19 +417,18 @@ char *do_browse_from(const char *inpath)
|
||||
#ifndef DISABLE_OPERATINGDIR
|
||||
/* If the resulting path isn't in the operating directory, use
|
||||
* the operating directory instead. */
|
||||
if (check_operating_dir(path, FALSE)) {
|
||||
if (path != NULL)
|
||||
free(path);
|
||||
path = mallocstrcpy(NULL, operating_dir);
|
||||
}
|
||||
if (check_operating_dir(path, FALSE))
|
||||
path = mallocstrcpy(path, operating_dir);
|
||||
#endif
|
||||
|
||||
if (path != NULL)
|
||||
dir = opendir(path);
|
||||
|
||||
/* If we can't open the path, get out. */
|
||||
if (dir == NULL) {
|
||||
if (path != NULL)
|
||||
free(path);
|
||||
beep();
|
||||
free(path);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -419,16 +436,28 @@ char *do_browse_from(const char *inpath)
|
||||
}
|
||||
|
||||
/* Set filelist to the list of files contained in the directory path,
|
||||
* set filelist_len to the number of files in that list, and set longest
|
||||
* to the width in columns of the longest filename in that list, up to
|
||||
* COLS - 1 (but at least 7). Assume path exists and is a directory. */
|
||||
* set filelist_len 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
|
||||
* per line. longest needs to be at least 15 columns in order to
|
||||
* display ".. (parent dir)", as Pico does. Assume path exists and is a
|
||||
* directory. */
|
||||
void browser_init(const char *path, DIR *dir)
|
||||
{
|
||||
const struct dirent *nextdir;
|
||||
size_t i = 0, path_len;
|
||||
size_t i = 0, path_len = strlen(path);
|
||||
int col = 0;
|
||||
/* The maximum number of columns that the filenames will take
|
||||
* up. */
|
||||
int line = 0;
|
||||
/* The maximum number of lines that the filenames will take
|
||||
* up. */
|
||||
int filesperline = 0;
|
||||
/* The number of files that we can display per line. */
|
||||
|
||||
assert(dir != NULL);
|
||||
assert(path != NULL && path[strlen(path) - 1] == '/' && dir != NULL);
|
||||
|
||||
/* Set longest to zero, just before we initialize it. */
|
||||
longest = 0;
|
||||
|
||||
while ((nextdir = readdir(dir)) != NULL) {
|
||||
@@ -437,20 +466,26 @@ void browser_init(const char *path, DIR *dir)
|
||||
/* Don't show the "." entry. */
|
||||
if (strcmp(nextdir->d_name, ".") == 0)
|
||||
continue;
|
||||
i++;
|
||||
|
||||
d_len = strlenpt(nextdir->d_name);
|
||||
if (d_len > longest)
|
||||
longest = (d_len > COLS - 1) ? COLS - 1 : d_len;
|
||||
longest = (d_len > COLS) ? COLS : d_len;
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
filelist_len = i;
|
||||
rewinddir(dir);
|
||||
|
||||
/* Put 10 columns' worth of blank space between columns of filenames
|
||||
* in the list whenever possible, as Pico does. */
|
||||
longest += 10;
|
||||
|
||||
filelist = (char **)nmalloc(filelist_len * sizeof(char *));
|
||||
if (filelist != NULL)
|
||||
free_chararray(filelist, filelist_len);
|
||||
|
||||
path_len = strlen(path);
|
||||
filelist_len = i;
|
||||
|
||||
filelist = (char **)nmalloc(filelist_len * sizeof(char *));
|
||||
|
||||
i = 0;
|
||||
|
||||
@@ -461,6 +496,7 @@ void browser_init(const char *path, DIR *dir)
|
||||
|
||||
filelist[i] = charalloc(path_len + strlen(nextdir->d_name) + 1);
|
||||
sprintf(filelist[i], "%s%s", path, nextdir->d_name);
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
@@ -468,12 +504,44 @@ void browser_init(const char *path, DIR *dir)
|
||||
* first time we scanned and the second. i is the actual length of
|
||||
* filelist, so record it. */
|
||||
filelist_len = i;
|
||||
|
||||
closedir(dir);
|
||||
|
||||
if (longest > COLS - 1)
|
||||
longest = COLS - 1;
|
||||
if (longest < 7)
|
||||
longest = 7;
|
||||
/* Make sure longest is between 15 and COLS. */
|
||||
if (longest < 15)
|
||||
longest = 15;
|
||||
if (longest > COLS)
|
||||
longest = COLS;
|
||||
|
||||
/* Set width to zero, just before we initialize it. */
|
||||
width = 0;
|
||||
|
||||
for (i = 0; i < filelist_len && line < editwinrows; i++) {
|
||||
/* Calculate the number of columns one filename will take up. */
|
||||
col += longest;
|
||||
filesperline++;
|
||||
|
||||
/* Add some space between the columns. */
|
||||
col += 2;
|
||||
|
||||
/* If the next entry isn't going to fit on the current line,
|
||||
* move to the next line. */
|
||||
if (col > COLS - longest) {
|
||||
line++;
|
||||
col = 0;
|
||||
|
||||
/* If width isn't initialized yet, and we've taken up more
|
||||
* than one line, it means that width is equal to
|
||||
* filesperline. */
|
||||
if (width == 0)
|
||||
width = filesperline;
|
||||
}
|
||||
}
|
||||
|
||||
/* If width isn't initialized yet, and we've taken up only one line,
|
||||
* it means that width is equal to (COLS % longest). */
|
||||
if (width == 0)
|
||||
width = COLS % longest;
|
||||
}
|
||||
|
||||
/* Determine the shortcut key corresponding to the values of kbinput
|
||||
@@ -486,7 +554,7 @@ void parse_browser_input(int *kbinput, bool *meta_key, bool *func_key)
|
||||
get_shortcut(browser_list, kbinput, meta_key, func_key);
|
||||
|
||||
/* Pico compatibility. */
|
||||
if (*meta_key == FALSE) {
|
||||
if (!*meta_key) {
|
||||
switch (*kbinput) {
|
||||
case ' ':
|
||||
*kbinput = NANO_NEXTPAGE_KEY;
|
||||
@@ -519,69 +587,136 @@ void parse_browser_input(int *kbinput, bool *meta_key, bool *func_key)
|
||||
}
|
||||
}
|
||||
|
||||
/* Calculate the number of columns needed to display the list of files
|
||||
* in the array filelist, if necessary, and then display the list of
|
||||
* files. */
|
||||
/* Set width to the number of files that we can display per line, if
|
||||
* necessary, and display the list of files. */
|
||||
void browser_refresh(void)
|
||||
{
|
||||
struct stat st;
|
||||
size_t i = 0;
|
||||
int col = 0, line = 0, filecols = 0;
|
||||
size_t foo_len = mb_cur_max() * 7;
|
||||
char *foo = charalloc(foo_len + 1);
|
||||
static int uimax_digits = -1;
|
||||
size_t i;
|
||||
int col = 0;
|
||||
/* The maximum number of columns that the filenames will take
|
||||
* up. */
|
||||
int line = 0;
|
||||
/* The maximum number of lines that the filenames will take
|
||||
* up. */
|
||||
char *foo;
|
||||
/* The file information that we'll display. */
|
||||
|
||||
if (width != 0)
|
||||
i = width * editwinrows * ((selected / width) / editwinrows);
|
||||
if (uimax_digits == -1)
|
||||
uimax_digits = digits(UINT_MAX);
|
||||
|
||||
blank_edit();
|
||||
|
||||
wmove(edit, 0, 0);
|
||||
|
||||
for (; i < filelist_len && line <= editwinrows - 1; i++) {
|
||||
char *disp = display_string(tail(filelist[i]), 0, longest,
|
||||
FALSE);
|
||||
i = width * editwinrows * ((selected / width) / editwinrows);
|
||||
|
||||
/* Highlight the currently selected file or directory. */
|
||||
for (; i < filelist_len && line < editwinrows; i++) {
|
||||
struct stat st;
|
||||
const char *filetail = tail(filelist[i]);
|
||||
/* The filename we display, minus the path. */
|
||||
size_t filetaillen = strlenpt(filetail);
|
||||
/* The length of the filename in columns. */
|
||||
size_t foolen;
|
||||
/* The length of the file information in columns. */
|
||||
int foomaxlen = 7;
|
||||
/* The maximum length of the file information in
|
||||
* columns: 7 for "--", "(dir)", or the file size, and
|
||||
* 12 for "(parent dir)". */
|
||||
bool dots = (COLS >= 15 && filetaillen >= longest -
|
||||
foomaxlen - 1);
|
||||
/* Do we put an ellipsis before the filename? Don't set
|
||||
* this to TRUE if we have fewer than 15 columns (i.e. 1
|
||||
* column for padding, plus 7 columns for a filename
|
||||
* other than ".."). */
|
||||
char *disp = display_string(filetail, dots ? filetaillen -
|
||||
longest + foomaxlen + 4 : 0, longest, FALSE);
|
||||
/* If we put an ellipsis before the filename, reserve 1
|
||||
* column for padding, plus 7 columns for "--", "(dir)",
|
||||
* or the file size, plus 3 columns for the ellipsis. */
|
||||
|
||||
/* Start highlighting the currently selected file or
|
||||
* directory. */
|
||||
if (i == selected)
|
||||
wattron(edit, reverse_attr);
|
||||
|
||||
blank_line(edit, line, col, longest);
|
||||
mvwaddstr(edit, line, col, disp);
|
||||
|
||||
/* If dots is TRUE, we will display something like
|
||||
* "...ename". */
|
||||
if (dots)
|
||||
mvwaddstr(edit, line, col, "...");
|
||||
mvwaddstr(edit, line, dots ? col + 3 : col, disp);
|
||||
|
||||
free(disp);
|
||||
|
||||
col += longest;
|
||||
filecols++;
|
||||
|
||||
/* Show file info also. We don't want to report file sizes for
|
||||
* links, so we use lstat(). Also, stat() and lstat() return an
|
||||
* error if, for example, the file is deleted while the file
|
||||
* browser is open. In that case, we report "--" as the file
|
||||
* info. */
|
||||
/* Show information about the file. We don't want to report
|
||||
* file sizes for links, so we use lstat(). */
|
||||
if (lstat(filelist[i], &st) == -1 || S_ISLNK(st.st_mode)) {
|
||||
/* Aha! It's a symlink! Now, is it a dir? If so, mark it
|
||||
* as such. */
|
||||
if (stat(filelist[i], &st) == 0 && S_ISDIR(st.st_mode)) {
|
||||
strncpy(foo, _("(dir)"), foo_len);
|
||||
foo[foo_len] = '\0';
|
||||
} else
|
||||
strcpy(foo, "--");
|
||||
/* If the file doesn't exist (i.e. it's been deleted while
|
||||
* the file browser is open), or it's a symlink that doesn't
|
||||
* point to a directory, display "--". */
|
||||
if (stat(filelist[i], &st) == -1 || !S_ISDIR(st.st_mode))
|
||||
foo = mallocstrcpy(NULL, "--");
|
||||
/* If the file is a symlink that points to a directory,
|
||||
* display it as a directory. */
|
||||
else
|
||||
/* TRANSLATORS: Try to keep this at most 7
|
||||
* characters. */
|
||||
foo = mallocstrcpy(NULL, _("(dir)"));
|
||||
} else if (S_ISDIR(st.st_mode)) {
|
||||
strncpy(foo, _("(dir)"), foo_len);
|
||||
foo[foo_len] = '\0';
|
||||
} else if (st.st_size < (1 << 10)) /* less than 1 k. */
|
||||
sprintf(foo, "%4u B", (unsigned int)st.st_size);
|
||||
else if (st.st_size < (1 << 20)) /* less than 1 meg. */
|
||||
sprintf(foo, "%4u KB", (unsigned int)(st.st_size >> 10));
|
||||
else if (st.st_size < (1 << 30)) /* less than 1 gig. */
|
||||
sprintf(foo, "%4u MB", (unsigned int)(st.st_size >> 20));
|
||||
else
|
||||
sprintf(foo, "%4u GB", (unsigned int)(st.st_size >> 30));
|
||||
/* If the file is a directory, display it as such. */
|
||||
if (strcmp(filetail, "..") == 0) {
|
||||
/* TRANSLATORS: Try to keep this at most 12
|
||||
* characters. */
|
||||
foo = mallocstrcpy(NULL, _("(parent dir)"));
|
||||
foomaxlen = 12;
|
||||
} else
|
||||
foo = mallocstrcpy(NULL, _("(dir)"));
|
||||
} else {
|
||||
unsigned long result = st.st_size;
|
||||
char modifier;
|
||||
|
||||
mvwaddnstr(edit, line, col - strlen(foo), foo, foo_len);
|
||||
foo = charalloc(uimax_digits + 4);
|
||||
|
||||
/* Bytes. */
|
||||
if (st.st_size < (1 << 10))
|
||||
modifier = ' ';
|
||||
/* Kilobytes. */
|
||||
else if (st.st_size < (1 << 20)) {
|
||||
result >>= 10;
|
||||
modifier = 'K';
|
||||
/* Megabytes. */
|
||||
} else if (st.st_size < (1 << 30)) {
|
||||
result >>= 20;
|
||||
modifier = 'M';
|
||||
/* Gigabytes. */
|
||||
} else {
|
||||
result >>= 30;
|
||||
modifier = 'G';
|
||||
}
|
||||
|
||||
sprintf(foo, "%4lu %cB", result, modifier);
|
||||
}
|
||||
|
||||
/* Make sure foo takes up no more than foomaxlen columns. */
|
||||
foolen = strlenpt(foo);
|
||||
if (foolen > foomaxlen) {
|
||||
null_at(&foo, actual_x(foo, foomaxlen));
|
||||
foolen = foomaxlen;
|
||||
}
|
||||
|
||||
mvwaddstr(edit, line, col - foolen, foo);
|
||||
|
||||
/* Finish highlighting the currently selected file or
|
||||
* directory. */
|
||||
if (i == selected)
|
||||
wattroff(edit, reverse_attr);
|
||||
|
||||
free(foo);
|
||||
|
||||
/* Add some space between the columns. */
|
||||
col += 2;
|
||||
|
||||
@@ -590,21 +725,36 @@ void browser_refresh(void)
|
||||
if (col > COLS - longest) {
|
||||
line++;
|
||||
col = 0;
|
||||
|
||||
/* Set the number of columns to display the list in, if
|
||||
* necessary, so that we don't divide by zero. */
|
||||
if (width == 0)
|
||||
width = filecols;
|
||||
}
|
||||
|
||||
wmove(edit, line, col);
|
||||
}
|
||||
|
||||
free(foo);
|
||||
|
||||
wnoutrefresh(edit);
|
||||
}
|
||||
|
||||
/* Look for needle. If we find it, set selected to its location. Note
|
||||
* that needle must be an exact match for a file in the list. The
|
||||
* return value specifies whether we found anything. */
|
||||
bool browser_select_filename(const char *needle)
|
||||
{
|
||||
size_t currselected;
|
||||
bool found = FALSE;
|
||||
|
||||
for (currselected = 0; currselected < filelist_len;
|
||||
currselected++) {
|
||||
if (strcmp(filelist[currselected], needle) == 0) {
|
||||
found = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found)
|
||||
selected = currselected;
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
/* Set up the system variables for a filename search. Return -1 if the
|
||||
* search should be canceled (due to Cancel, a blank search string, or a
|
||||
* failed regcomp()), return 0 on success, and return 1 on rerun calling
|
||||
@@ -725,17 +875,18 @@ bool findnextfile(bool no_sameline, size_t begin, const char *needle)
|
||||
size_t currselected = selected;
|
||||
/* The location in the current file list of the match we
|
||||
* find. */
|
||||
const char *rev_start = tail(filelist[currselected]), *found = NULL;
|
||||
const char *filetail = tail(filelist[currselected]);
|
||||
/* The filename we display, minus the path. */
|
||||
const char *rev_start = filetail, *found = NULL;
|
||||
|
||||
#ifndef NANO_TINY
|
||||
if (ISSET(BACKWARDS_SEARCH))
|
||||
rev_start += strlen(tail(filelist[currselected]));
|
||||
rev_start += strlen(rev_start);
|
||||
#endif
|
||||
|
||||
/* Look for needle in the current filename we're searching. */
|
||||
while (TRUE) {
|
||||
found = strstrwrapper(tail(filelist[currselected]), needle,
|
||||
rev_start);
|
||||
found = strstrwrapper(filetail, needle, rev_start);
|
||||
|
||||
/* We've found a potential match. If we're not allowed to find
|
||||
* a match on the same filename we started on and this potential
|
||||
@@ -775,10 +926,12 @@ bool findnextfile(bool no_sameline, size_t begin, const char *needle)
|
||||
if (currselected == begin)
|
||||
search_last_file = TRUE;
|
||||
|
||||
rev_start = tail(filelist[currselected]);
|
||||
filetail = tail(filelist[currselected]);
|
||||
|
||||
rev_start = filetail;
|
||||
#ifndef NANO_TINY
|
||||
if (ISSET(BACKWARDS_SEARCH))
|
||||
rev_start += strlen(tail(filelist[currselected]));
|
||||
rev_start += strlen(rev_start);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -893,27 +1046,35 @@ void do_fileresearch(void)
|
||||
filesearch_abort();
|
||||
}
|
||||
|
||||
/* Select the first file in the list. */
|
||||
void do_first_file(void)
|
||||
{
|
||||
selected = 0;
|
||||
}
|
||||
|
||||
/* Select the last file in the list. */
|
||||
void do_last_file(void)
|
||||
{
|
||||
selected = filelist_len - 1;
|
||||
}
|
||||
|
||||
/* Strip one directory from the end of path. */
|
||||
void striponedir(char *path)
|
||||
/* Strip one directory from the end of path, and return the stripped
|
||||
* path. The returned string is dynamically allocated, and should be
|
||||
* freed. */
|
||||
char *striponedir(const char *path)
|
||||
{
|
||||
char *tmp;
|
||||
char *retval, *tmp;
|
||||
|
||||
assert(path != NULL);
|
||||
|
||||
tmp = strrchr(path, '/');
|
||||
retval = mallocstrcpy(NULL, path);
|
||||
|
||||
tmp = strrchr(retval, '/');
|
||||
|
||||
if (tmp != NULL)
|
||||
*tmp = '\0';
|
||||
null_at(&retval, tmp - retval);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
#endif /* !DISABLE_BROWSER */
|
||||
|
||||
20
src/chars.c
20
src/chars.c
@@ -41,7 +41,7 @@ static const wchar_t bad_wchar = 0xFFFD;
|
||||
* Unicode FFFD (Replacement Character), unless we're
|
||||
* determining if it's a control character or searching for a
|
||||
* match to it. */
|
||||
static const char *bad_mbchar = "\xEF\xBF\xBD";
|
||||
static const char *const bad_mbchar = "\xEF\xBF\xBD";
|
||||
static const int bad_mbchar_len = 3;
|
||||
|
||||
/* Enable UTF-8 support. */
|
||||
@@ -527,12 +527,14 @@ int mbstrncasecmp(const char *s1, const char *s2, size_t n)
|
||||
{
|
||||
#ifdef ENABLE_UTF8
|
||||
if (use_utf8) {
|
||||
char *s1_mb = charalloc(MB_CUR_MAX);
|
||||
char *s2_mb = charalloc(MB_CUR_MAX);
|
||||
char *s1_mb, *s2_mb;
|
||||
wchar_t ws1, ws2;
|
||||
|
||||
assert(s1 != NULL && s2 != NULL);
|
||||
|
||||
s1_mb = charalloc(MB_CUR_MAX);
|
||||
s2_mb = charalloc(MB_CUR_MAX);
|
||||
|
||||
while (n > 0 && *s1 != '\0' && *s2 != '\0') {
|
||||
bool bad_s1_mb = FALSE, bad_s2_mb = FALSE;
|
||||
int s1_mb_len, s2_mb_len;
|
||||
@@ -620,13 +622,15 @@ const char *mbstrcasestr(const char *haystack, const char *needle)
|
||||
{
|
||||
#ifdef ENABLE_UTF8
|
||||
if (use_utf8) {
|
||||
char *r_mb = charalloc(MB_CUR_MAX);
|
||||
char *q_mb = charalloc(MB_CUR_MAX);
|
||||
char *r_mb, *q_mb;
|
||||
wchar_t wr, wq;
|
||||
bool found_needle = FALSE;
|
||||
|
||||
assert(haystack != NULL && needle != NULL);
|
||||
|
||||
r_mb = charalloc(MB_CUR_MAX);
|
||||
q_mb = charalloc(MB_CUR_MAX);
|
||||
|
||||
while (*haystack != '\0') {
|
||||
const char *r = haystack, *q = needle;
|
||||
int r_mb_len, q_mb_len;
|
||||
@@ -726,13 +730,15 @@ const char *mbrevstrcasestr(const char *haystack, const char *needle,
|
||||
{
|
||||
#ifdef ENABLE_UTF8
|
||||
if (use_utf8) {
|
||||
char *r_mb = charalloc(MB_CUR_MAX);
|
||||
char *q_mb = charalloc(MB_CUR_MAX);
|
||||
char *r_mb, *q_mb;
|
||||
wchar_t wr, wq;
|
||||
bool begin_line = FALSE, found_needle = FALSE;
|
||||
|
||||
assert(haystack != NULL && needle != NULL && rev_start != NULL);
|
||||
|
||||
r_mb = charalloc(MB_CUR_MAX);
|
||||
q_mb = charalloc(MB_CUR_MAX);
|
||||
|
||||
while (!begin_line) {
|
||||
const char *r = rev_start, *q = needle;
|
||||
int r_mb_len, q_mb_len;
|
||||
|
||||
@@ -138,9 +138,8 @@ void color_update(void)
|
||||
exttype *e;
|
||||
|
||||
/* If this is the default syntax, it has no associated
|
||||
* extensions. (We've checked for this and for duplicate
|
||||
* syntax names elsewhere.) Skip over it here, but keep
|
||||
* track of its color regexes. */
|
||||
* extensions, which we've checked for elsewhere. Skip over
|
||||
* it here, but keep track of its color regexes. */
|
||||
if (strcmp(tmpsyntax->desc, "default") == 0) {
|
||||
defcolor = tmpsyntax->color;
|
||||
continue;
|
||||
|
||||
@@ -90,7 +90,7 @@ void cut_to_eol(void)
|
||||
else if (openfile->current != openfile->filebot) {
|
||||
/* If we're at the end of the line, and it isn't the last line
|
||||
* of the file, move all the text from the current position up
|
||||
* to the beginning of the next line, i.e, the newline at the
|
||||
* to the beginning of the next line, i.e. the newline at the
|
||||
* end, into the cutbuffer. */
|
||||
move_to_filestruct(&cutbuffer, &cutbottom, openfile->current,
|
||||
openfile->current_x, openfile->current->next, 0);
|
||||
|
||||
206
src/files.c
206
src/files.c
@@ -309,13 +309,13 @@ filestruct *read_line(char *buf, filestruct *prevnode, bool
|
||||
fileptr->data[buf_len - 1] = '\0';
|
||||
#endif
|
||||
|
||||
if (*first_line_ins == TRUE) {
|
||||
if (*first_line_ins) {
|
||||
/* Special case: We're inserting with the cursor on the first
|
||||
* line. */
|
||||
fileptr->prev = NULL;
|
||||
fileptr->next = openfile->fileage;
|
||||
fileptr->lineno = 1;
|
||||
if (*first_line_ins == TRUE) {
|
||||
if (*first_line_ins) {
|
||||
*first_line_ins = FALSE;
|
||||
/* If we're inserting into the first line of the file, then
|
||||
* we want to make sure that our edit buffer stays on the
|
||||
@@ -540,7 +540,7 @@ void read_file(FILE *f, const char *filename)
|
||||
openfile->filebot);
|
||||
|
||||
/* If the NO_NEWLINES flag isn't set, and text has been added to
|
||||
* the magicline (i.e, a file that doesn't end in a newline has been
|
||||
* the magicline (i.e. a file that doesn't end in a newline has been
|
||||
* inserted at the end of the current buffer), add a new magicline,
|
||||
* and move the current line down to it. */
|
||||
if (!ISSET(NO_NEWLINES) && openfile->filebot->data[0] != '\0') {
|
||||
@@ -584,8 +584,8 @@ void read_file(FILE *f, const char *filename)
|
||||
* reading with a 0 return value. *f is set to the opened file. */
|
||||
int open_file(const char *filename, bool newfie, FILE **f)
|
||||
{
|
||||
int fd;
|
||||
struct stat fileinfo;
|
||||
int fd;
|
||||
|
||||
assert(filename != NULL && f != NULL);
|
||||
|
||||
@@ -683,6 +683,7 @@ void do_insertfile(
|
||||
char *ans = mallocstrcpy(NULL, "");
|
||||
/* The last answer the user typed on the statusbar. */
|
||||
filestruct *edittop_save = openfile->edittop;
|
||||
size_t current_x_save = openfile->current_x;
|
||||
ssize_t current_y_save = openfile->current_y;
|
||||
bool at_edittop = FALSE;
|
||||
/* Whether we're at the top of the edit window. */
|
||||
@@ -811,8 +812,18 @@ void do_insertfile(
|
||||
|
||||
/* Save the command's output in the current buffer. */
|
||||
execute_command(answer);
|
||||
} else {
|
||||
|
||||
#ifdef ENABLE_MULTIBUFFER
|
||||
if (ISSET(MULTIBUFFER)) {
|
||||
/* Move back to the beginning of the first line of
|
||||
* the buffer. */
|
||||
openfile->current = openfile->fileage;
|
||||
openfile->current_x = 0;
|
||||
openfile->placewewant = 0;
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
#endif /* !NANO_TINY */
|
||||
/* Make sure the path to the file specified in answer is
|
||||
* tilde-expanded. */
|
||||
answer = mallocstrassn(answer,
|
||||
@@ -835,20 +846,26 @@ void do_insertfile(
|
||||
{
|
||||
filestruct *top_save = openfile->fileage;
|
||||
|
||||
/* If we didn't insert into a new buffer, and we were at
|
||||
* the top of the edit window before, set the saved
|
||||
* value of edittop to the new top of the edit window,
|
||||
* and update the current y-coordinate to account for
|
||||
* the number of lines inserted. */
|
||||
/* If we were at the top of the edit window before, set
|
||||
* the saved value of edittop to the new top of the edit
|
||||
* window. */
|
||||
if (at_edittop)
|
||||
edittop_save = openfile->fileage;
|
||||
|
||||
/* Update the current x-coordinate to account for the
|
||||
* number of characters inserted on the current line. */
|
||||
openfile->current_x = strlen(openfile->filebot->data);
|
||||
if (openfile->fileage == openfile->filebot)
|
||||
openfile->current_x += current_x_save;
|
||||
|
||||
/* Update the current y-coordinate to account for the
|
||||
* number of lines inserted. */
|
||||
openfile->current_y += current_y_save;
|
||||
|
||||
/* If we didn't insert into a new buffer, unpartition
|
||||
* the filestruct so that it contains all the text
|
||||
* again. Note that we've replaced the non-text
|
||||
* originally in the partition with the text in the
|
||||
* inserted file/executed command output. */
|
||||
/* Unpartition the filestruct so that it contains all
|
||||
* the text again. Note that we've replaced the
|
||||
* non-text originally in the partition with the text in
|
||||
* the inserted file/executed command output. */
|
||||
unpartition_filestruct(&filepart);
|
||||
|
||||
/* Renumber starting with the beginning line of the old
|
||||
@@ -882,7 +899,7 @@ void do_insertfile_void(void)
|
||||
{
|
||||
#ifdef ENABLE_MULTIBUFFER
|
||||
if (ISSET(VIEW_MODE) && !ISSET(MULTIBUFFER))
|
||||
statusbar(_("Key illegal in non-multibuffer mode"));
|
||||
statusbar(_("Key invalid in non-multibuffer mode"));
|
||||
else
|
||||
#endif
|
||||
do_insertfile(
|
||||
@@ -902,21 +919,29 @@ void do_insertfile_void(void)
|
||||
* able to go there. */
|
||||
char *get_full_path(const char *origpath)
|
||||
{
|
||||
char *d_here, *d_there = NULL;
|
||||
struct stat fileinfo;
|
||||
char *d_here, *d_there, *d_there_file = NULL;
|
||||
const char *last_slash;
|
||||
bool path_only;
|
||||
|
||||
if (origpath == NULL)
|
||||
return NULL;
|
||||
|
||||
/* Get the current directory. */
|
||||
/* Get the current directory. If it doesn't exist, back up and try
|
||||
* again until we get a directory that does, and use that as the
|
||||
* current directory. */
|
||||
d_here = charalloc(PATH_MAX + 1);
|
||||
d_here = getcwd(d_here, PATH_MAX + 1);
|
||||
|
||||
if (d_here != NULL) {
|
||||
const char *last_slash;
|
||||
char *d_there_file = NULL;
|
||||
bool path_only;
|
||||
struct stat fileinfo;
|
||||
while (d_here == NULL) {
|
||||
if (chdir("..") == -1)
|
||||
break;
|
||||
|
||||
d_here = getcwd(d_here, PATH_MAX + 1);
|
||||
}
|
||||
|
||||
/* If we succeeded, canonicalize it in d_here. */
|
||||
if (d_here != NULL) {
|
||||
align(&d_here);
|
||||
|
||||
/* If the current directory isn't "/", tack a slash onto the end
|
||||
@@ -925,89 +950,91 @@ char *get_full_path(const char *origpath)
|
||||
d_here = charealloc(d_here, strlen(d_here) + 2);
|
||||
strcat(d_here, "/");
|
||||
}
|
||||
/* Otherwise, set d_here to "". */
|
||||
} else
|
||||
d_here = mallocstrcpy(NULL, "");
|
||||
|
||||
d_there = real_dir_from_tilde(origpath);
|
||||
d_there = real_dir_from_tilde(origpath);
|
||||
|
||||
assert(d_there != NULL);
|
||||
assert(d_there != NULL);
|
||||
|
||||
/* Stat d_there. If stat() fails, assume that d_there refers to
|
||||
* a new file that hasn't been saved to disk yet. Set path_only
|
||||
* to TRUE if d_there refers to a directory, and FALSE if
|
||||
* d_there refers to a file. */
|
||||
path_only = !stat(d_there, &fileinfo) &&
|
||||
S_ISDIR(fileinfo.st_mode);
|
||||
/* If stat()ing d_there fails, assume that d_there refers to a new
|
||||
* file that hasn't been saved to disk yet. Set path_only to TRUE
|
||||
* if d_there refers to a directory, and FALSE otherwise. */
|
||||
path_only = stat(d_there, &fileinfo) == 0 &&
|
||||
S_ISDIR(fileinfo.st_mode);
|
||||
|
||||
/* If path_only is TRUE, make sure d_there ends in a slash. */
|
||||
if (path_only) {
|
||||
size_t d_there_len = strlen(d_there);
|
||||
/* If path_only is TRUE, make sure d_there ends in a slash. */
|
||||
if (path_only) {
|
||||
size_t d_there_len = strlen(d_there);
|
||||
|
||||
if (d_there[d_there_len - 1] != '/') {
|
||||
d_there = charealloc(d_there, d_there_len + 2);
|
||||
strcat(d_there, "/");
|
||||
}
|
||||
if (d_there[d_there_len - 1] != '/') {
|
||||
d_there = charealloc(d_there, d_there_len + 2);
|
||||
strcat(d_there, "/");
|
||||
}
|
||||
}
|
||||
|
||||
/* Search for the last slash in d_there. */
|
||||
last_slash = strrchr(d_there, '/');
|
||||
/* Search for the last slash in d_there. */
|
||||
last_slash = strrchr(d_there, '/');
|
||||
|
||||
/* If we didn't find one, then make sure the answer is in the
|
||||
* format "d_here/d_there". */
|
||||
if (last_slash == NULL) {
|
||||
assert(!path_only);
|
||||
/* If we didn't find one, then make sure the answer is in the format
|
||||
* "d_here/d_there". */
|
||||
if (last_slash == NULL) {
|
||||
assert(!path_only);
|
||||
|
||||
d_there_file = d_there;
|
||||
d_there = d_here;
|
||||
d_there_file = d_there;
|
||||
d_there = d_here;
|
||||
} else {
|
||||
/* If path_only is FALSE, then save the filename portion of the
|
||||
* answer (everything after the last slash) in d_there_file. */
|
||||
if (!path_only)
|
||||
d_there_file = mallocstrcpy(NULL, last_slash + 1);
|
||||
|
||||
/* And remove the filename portion of the answer from
|
||||
* d_there. */
|
||||
null_at(&d_there, last_slash - d_there + 1);
|
||||
|
||||
/* Go to the path specified in d_there. */
|
||||
if (chdir(d_there) == -1) {
|
||||
free(d_there);
|
||||
d_there = NULL;
|
||||
} else {
|
||||
/* If path_only is FALSE, then save the filename portion of
|
||||
* the answer, everything after the last slash, in
|
||||
* d_there_file. */
|
||||
if (!path_only)
|
||||
d_there_file = mallocstrcpy(NULL, last_slash + 1);
|
||||
free(d_there);
|
||||
|
||||
/* And remove the filename portion of the answer from
|
||||
* d_there. */
|
||||
null_at(&d_there, last_slash - d_there + 1);
|
||||
/* Get the full path. */
|
||||
d_there = charalloc(PATH_MAX + 1);
|
||||
d_there = getcwd(d_there, PATH_MAX + 1);
|
||||
|
||||
/* Go to the path specified in d_there. */
|
||||
if (chdir(d_there) == -1) {
|
||||
free(d_there);
|
||||
d_there = NULL;
|
||||
} else {
|
||||
/* Get the full path and save it in d_there. */
|
||||
free(d_there);
|
||||
/* If we succeeded, canonicalize it in d_there. */
|
||||
if (d_there != NULL) {
|
||||
align(&d_there);
|
||||
|
||||
d_there = charalloc(PATH_MAX + 1);
|
||||
d_there = getcwd(d_there, PATH_MAX + 1);
|
||||
/* If the current directory isn't "/", tack a slash onto
|
||||
* the end of it. */
|
||||
if (strcmp(d_there, "/") != 0) {
|
||||
d_there = charealloc(d_there, strlen(d_there) + 2);
|
||||
strcat(d_there, "/");
|
||||
}
|
||||
} else
|
||||
/* Otherwise, set path_only to TRUE, so that we clean up
|
||||
* correctly, free all allocated memory, and return
|
||||
* NULL. */
|
||||
path_only = TRUE;
|
||||
|
||||
if (d_there != NULL) {
|
||||
align(&d_there);
|
||||
|
||||
if (strcmp(d_there, "/") != 0) {
|
||||
/* Make sure d_there ends in a slash. */
|
||||
d_there = charealloc(d_there,
|
||||
strlen(d_there) + 2);
|
||||
strcat(d_there, "/");
|
||||
}
|
||||
} else
|
||||
/* If we couldn't get the full path, set path_only
|
||||
* to TRUE so that we clean up correctly, free all
|
||||
* allocated memory, and return NULL. */
|
||||
path_only = TRUE;
|
||||
|
||||
/* Finally, go back to the path specified in d_here,
|
||||
* where we were before. */
|
||||
chdir(d_here);
|
||||
}
|
||||
/* Finally, go back to the path specified in d_here,
|
||||
* where we were before. We don't check for a chdir()
|
||||
* error, since we can do nothing then. */
|
||||
chdir(d_here);
|
||||
|
||||
/* Free d_here, since we're done using it. */
|
||||
free(d_here);
|
||||
}
|
||||
|
||||
/* At this point, if path_only is FALSE and d_there exists,
|
||||
/* At this point, if path_only is FALSE and d_there isn't NULL,
|
||||
* d_there contains the path portion of the answer and
|
||||
* d_there_file contains the filename portion of the answer. If
|
||||
* this is the case, tack d_there_file onto the end of
|
||||
* d_there, so that d_there contains the complete answer. */
|
||||
* this is the case, tack the latter onto the end of the former.
|
||||
* d_there will then contain the complete answer. */
|
||||
if (!path_only && d_there != NULL) {
|
||||
d_there = charealloc(d_there, strlen(d_there) +
|
||||
strlen(d_there_file) + 1);
|
||||
@@ -2231,8 +2258,7 @@ char *input_tab(char *buf, bool allow_files, size_t *place, bool
|
||||
assert(common_len > *place);
|
||||
}
|
||||
|
||||
if (num_matches > 1 && (common_len != *place ||
|
||||
*lastwastab == FALSE))
|
||||
if (num_matches > 1 && (common_len != *place || !*lastwastab))
|
||||
beep();
|
||||
|
||||
/* If there is more of a match to display on the statusbar, show
|
||||
@@ -2248,7 +2274,7 @@ char *input_tab(char *buf, bool allow_files, size_t *place, bool
|
||||
*place + 1);
|
||||
strncpy(buf, mzero, common_len);
|
||||
*place = common_len;
|
||||
} else if (*lastwastab == FALSE || num_matches < 2)
|
||||
} else if (!*lastwastab || num_matches < 2)
|
||||
*lastwastab = TRUE;
|
||||
else {
|
||||
int longest_name = 0, columns, editline = 0;
|
||||
@@ -2273,7 +2299,7 @@ char *input_tab(char *buf, bool allow_files, size_t *place, bool
|
||||
|
||||
assert(longest_name <= COLS - 1);
|
||||
|
||||
/* Each column will be (longest_name + 2) columns wide, i.e,
|
||||
/* Each column will be (longest_name + 2) columns wide, i.e.
|
||||
* two spaces between columns, except that there will be
|
||||
* only one space after the last column. */
|
||||
columns = (COLS + 1) / (longest_name + 2);
|
||||
@@ -2319,7 +2345,7 @@ char *input_tab(char *buf, bool allow_files, size_t *place, bool
|
||||
|
||||
/* Only refresh the edit window if we don't have a list of filename
|
||||
* matches on it. */
|
||||
if (*list == FALSE)
|
||||
if (!*list)
|
||||
refresh_func();
|
||||
|
||||
/* Enable el cursor. */
|
||||
|
||||
469
src/global.c
469
src/global.c
File diff suppressed because it is too large
Load Diff
117
src/help.c
117
src/help.c
@@ -32,25 +32,28 @@
|
||||
static char *help_text = NULL;
|
||||
/* The text displayed in the help window. */
|
||||
|
||||
/* Our dynamic, shortcut list-compliant help function. refresh_func is
|
||||
* the function we will call to refresh the edit window.*/
|
||||
/* Our main help browser function. refresh_func is the function we will
|
||||
* call to refresh the edit window. */
|
||||
void do_help(void (*refresh_func)(void))
|
||||
{
|
||||
int kbinput = ERR;
|
||||
bool meta_key, func_key, old_no_help = ISSET(NO_HELP);
|
||||
bool abort = FALSE;
|
||||
/* Whether we should abort the help browser. */
|
||||
size_t line = 0;
|
||||
/* The line number in help_text of the first displayed help
|
||||
* line. This variable is zero-based. */
|
||||
size_t last_line = 0;
|
||||
/* The line number in help_text of the last help line. This
|
||||
* variable is zero-based. */
|
||||
int kbinput = ERR;
|
||||
bool meta_key, func_key;
|
||||
bool old_no_help = ISSET(NO_HELP);
|
||||
#ifndef DISABLE_MOUSE
|
||||
const shortcut *oldshortcut = currshortcut;
|
||||
/* We will set currshortcut to allow clicking on the help
|
||||
* screen's shortcut list. */
|
||||
/* The current shortcut list. */
|
||||
#endif
|
||||
const char *ptr;
|
||||
/* The current line of help text. */
|
||||
size_t old_line = (size_t)-1;
|
||||
/* The line we were on before the current line. */
|
||||
|
||||
curs_set(0);
|
||||
blank_edit();
|
||||
@@ -76,6 +79,7 @@ void do_help(void (*refresh_func)(void))
|
||||
}
|
||||
|
||||
bottombars(help_list);
|
||||
wnoutrefresh(bottomwin);
|
||||
|
||||
/* Get the last line of the help text. */
|
||||
ptr = help_text;
|
||||
@@ -88,23 +92,52 @@ void do_help(void (*refresh_func)(void))
|
||||
if (last_line > 0)
|
||||
last_line--;
|
||||
|
||||
do {
|
||||
while (!abort) {
|
||||
size_t i;
|
||||
/* Generic loop variable. */
|
||||
size_t old_line = line;
|
||||
/* We redisplay the help only if it moved. */
|
||||
|
||||
ptr = help_text;
|
||||
/* Display the help text if we don't have a key, or if the help
|
||||
* text has moved. */
|
||||
if (kbinput == ERR || line != old_line) {
|
||||
blank_edit();
|
||||
|
||||
ptr = help_text;
|
||||
|
||||
/* Calculate where in the text we should be, based on the
|
||||
* page. */
|
||||
for (i = 0; i < line; i++) {
|
||||
ptr += help_line_len(ptr);
|
||||
if (*ptr == '\n')
|
||||
ptr++;
|
||||
}
|
||||
|
||||
for (i = 0; i < editwinrows && *ptr != '\0'; i++) {
|
||||
size_t j = help_line_len(ptr);
|
||||
|
||||
mvwaddnstr(edit, i, 0, ptr, j);
|
||||
ptr += j;
|
||||
if (*ptr == '\n')
|
||||
ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
wnoutrefresh(edit);
|
||||
|
||||
old_line = line;
|
||||
|
||||
kbinput = get_kbinput(edit, &meta_key, &func_key);
|
||||
parse_help_input(&kbinput, &meta_key, &func_key);
|
||||
|
||||
switch (kbinput) {
|
||||
#ifndef DISABLE_MOUSE
|
||||
case KEY_MOUSE:
|
||||
{
|
||||
int mouse_x, mouse_y;
|
||||
|
||||
get_mouseinput(&mouse_x, &mouse_y, TRUE);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
/* Redraw the screen. */
|
||||
case NANO_REFRESH_KEY:
|
||||
total_redraw();
|
||||
break;
|
||||
@@ -115,7 +148,7 @@ void do_help(void (*refresh_func)(void))
|
||||
line = 0;
|
||||
break;
|
||||
case NANO_NEXTPAGE_KEY:
|
||||
if (line + (editwinrows - 2) <= last_line)
|
||||
if (line + (editwinrows - 1) < last_line)
|
||||
line += editwinrows - 2;
|
||||
break;
|
||||
case NANO_PREVLINE_KEY:
|
||||
@@ -123,7 +156,7 @@ void do_help(void (*refresh_func)(void))
|
||||
line--;
|
||||
break;
|
||||
case NANO_NEXTLINE_KEY:
|
||||
if (line + editwinrows <= last_line)
|
||||
if (line + (editwinrows - 1) < last_line)
|
||||
line++;
|
||||
break;
|
||||
case NANO_FIRSTLINE_ALTKEY:
|
||||
@@ -136,35 +169,12 @@ void do_help(void (*refresh_func)(void))
|
||||
line = last_line - (editwinrows - 1);
|
||||
}
|
||||
break;
|
||||
/* Abort the help browser. */
|
||||
case NANO_EXIT_KEY:
|
||||
abort = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
if ((kbinput != ERR && line == old_line) || kbinput ==
|
||||
NANO_REFRESH_KEY)
|
||||
goto skip_redisplay;
|
||||
|
||||
blank_edit();
|
||||
|
||||
/* Calculate where in the text we should be, based on the
|
||||
* page. */
|
||||
for (i = 0; i < line; i++) {
|
||||
ptr += help_line_len(ptr);
|
||||
if (*ptr == '\n')
|
||||
ptr++;
|
||||
}
|
||||
|
||||
for (i = 0; i < editwinrows && *ptr != '\0'; i++) {
|
||||
size_t j = help_line_len(ptr);
|
||||
|
||||
mvwaddnstr(edit, i, 0, ptr, j);
|
||||
ptr += j;
|
||||
if (*ptr == '\n')
|
||||
ptr++;
|
||||
}
|
||||
|
||||
skip_redisplay:
|
||||
kbinput = get_kbinput(edit, &meta_key, &func_key);
|
||||
parse_help_input(&kbinput, &meta_key, &func_key);
|
||||
} while (kbinput != NANO_EXIT_KEY);
|
||||
}
|
||||
|
||||
#ifndef DISABLE_MOUSE
|
||||
currshortcut = oldshortcut;
|
||||
@@ -345,7 +355,7 @@ void help_init(void)
|
||||
#endif /* !NANO_TINY */
|
||||
else {
|
||||
/* Default to the main help list. */
|
||||
htx[0] = N_(" nano help text\n\n "
|
||||
htx[0] = N_("Main nano help text\n\n "
|
||||
"The nano editor is designed to emulate the "
|
||||
"functionality and ease-of-use of the UW Pico text "
|
||||
"editor. There are four main sections of the editor. "
|
||||
@@ -354,15 +364,16 @@ void help_init(void)
|
||||
"has been modified. Next is the main editor window "
|
||||
"showing the file being edited. The status line is "
|
||||
"the third line from the bottom and shows important "
|
||||
"messages. The bottom two lines show the most "
|
||||
"commonly used shortcuts in the editor.\n\n");
|
||||
htx[1] = N_(" The notation for shortcuts is as follows: "
|
||||
"Control-key sequences are notated with a caret (^) "
|
||||
"symbol and can be entered either by using the Control "
|
||||
"(Ctrl) key or pressing the Escape (Esc) key twice. "
|
||||
"Escape-key sequences are notated with the Meta (M) "
|
||||
"symbol and can be entered using either the Esc, Alt, "
|
||||
"or Meta key depending on your keyboard setup. ");
|
||||
"messages. ");
|
||||
htx[1] = N_("The bottom two lines show the most commonly used "
|
||||
"shortcuts in the editor.\n\n The notation for "
|
||||
"shortcuts is as follows: Control-key sequences are "
|
||||
"notated with a caret (^) symbol and can be entered "
|
||||
"either by using the Control (Ctrl) key or pressing "
|
||||
"the Escape (Esc) key twice. Escape-key sequences are "
|
||||
"notated with the Meta (M-) symbol and can be entered "
|
||||
"using either the Esc, Alt, or Meta key depending on "
|
||||
"your keyboard setup. ");
|
||||
htx[2] = N_("Also, pressing Esc twice and then typing a "
|
||||
"three-digit decimal number from 000 to 255 will enter "
|
||||
"the character with the corresponding value. The "
|
||||
@@ -564,7 +575,7 @@ void parse_help_input(int *kbinput, bool *meta_key, bool *func_key)
|
||||
{
|
||||
get_shortcut(help_list, kbinput, meta_key, func_key);
|
||||
|
||||
if (*meta_key == FALSE) {
|
||||
if (!*meta_key) {
|
||||
switch (*kbinput) {
|
||||
/* For consistency with the file browser. */
|
||||
case ' ':
|
||||
|
||||
147
src/move.c
147
src/move.c
@@ -85,7 +85,7 @@ void do_page_up(void)
|
||||
openfile->placewewant);
|
||||
|
||||
/* Scroll the edit window up a page. */
|
||||
edit_scroll(UP, editwinrows - 2);
|
||||
edit_scroll(UP_DIR, editwinrows - 2);
|
||||
}
|
||||
|
||||
/* Move down one page. */
|
||||
@@ -121,7 +121,7 @@ void do_page_down(void)
|
||||
openfile->placewewant);
|
||||
|
||||
/* Scroll the edit window down a page. */
|
||||
edit_scroll(DOWN, editwinrows - 2);
|
||||
edit_scroll(DOWN_DIR, editwinrows - 2);
|
||||
}
|
||||
|
||||
#ifndef DISABLE_JUSTIFY
|
||||
@@ -471,11 +471,23 @@ void do_end(void)
|
||||
update_line(openfile->current, openfile->current_x);
|
||||
}
|
||||
|
||||
/* Move up one line. */
|
||||
void do_up(void)
|
||||
/* If scroll_only is FALSE, move up one line. If scroll_only is TRUE,
|
||||
* scroll up one line without scrolling the cursor. */
|
||||
void do_up(
|
||||
#ifndef NANO_TINY
|
||||
bool scroll_only
|
||||
#else
|
||||
void
|
||||
#endif
|
||||
)
|
||||
{
|
||||
/* If we're at the top of the file, get out. */
|
||||
if (openfile->current == openfile->fileage)
|
||||
/* If we're at the top of the file, or if scroll_only is TRUE and
|
||||
* the top of the file is onscreen, get out. */
|
||||
if (openfile->current == openfile->fileage
|
||||
#ifndef NANO_TINY
|
||||
|| (scroll_only && openfile->edittop == openfile->fileage)
|
||||
#endif
|
||||
)
|
||||
return;
|
||||
|
||||
assert(openfile->current_y == openfile->current->lineno - openfile->edittop->lineno);
|
||||
@@ -485,47 +497,60 @@ void do_up(void)
|
||||
openfile->current_x = actual_x(openfile->current->data,
|
||||
openfile->placewewant);
|
||||
|
||||
/* If we're on the first line of the edit window, scroll the edit
|
||||
* window up one line if we're in smooth scrolling mode, or up half
|
||||
* a page if we're not. */
|
||||
if (openfile->current_y == 0)
|
||||
edit_scroll(UP,
|
||||
/* If scroll_only is FALSE and if we're on the first line of the
|
||||
* edit window, scroll the edit window up one line if we're in
|
||||
* smooth scrolling mode, or up half a page if we're not. If
|
||||
* scroll_only is TRUE, scroll the edit window up one line
|
||||
* unconditionally. */
|
||||
if (openfile->current_y == 0
|
||||
#ifndef NANO_TINY
|
||||
ISSET(SMOOTH_SCROLL) ? 1 :
|
||||
|| scroll_only
|
||||
#endif
|
||||
)
|
||||
edit_scroll(UP_DIR,
|
||||
#ifndef NANO_TINY
|
||||
(ISSET(SMOOTH_SCROLL) || scroll_only) ? 1 :
|
||||
#endif
|
||||
editwinrows / 2);
|
||||
/* Update the line we were on before and the line we're on now. The
|
||||
* former needs to be redrawn if we're not on the first page, and
|
||||
* the latter needs to be drawn unconditionally. */
|
||||
else {
|
||||
|
||||
/* If we're below the first line of the edit window, update the
|
||||
* line we were on before and the line we're on now. The former
|
||||
* needs to be redrawn if we're not on the first page, and the
|
||||
* latter needs to be drawn unconditionally. */
|
||||
if (openfile->current_y > 0) {
|
||||
if (need_vertical_update(0))
|
||||
update_line(openfile->current->next, 0);
|
||||
update_line(openfile->current, openfile->current_x);
|
||||
}
|
||||
}
|
||||
|
||||
/* Move up one line. */
|
||||
void do_up_void(void)
|
||||
{
|
||||
do_up(
|
||||
#ifndef NANO_TINY
|
||||
FALSE
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
#ifndef NANO_TINY
|
||||
/* Scroll up one line without scrolling the cursor. */
|
||||
void do_scroll_up(void)
|
||||
{
|
||||
/* If the top of the file is onscreen, get out. */
|
||||
if (openfile->edittop == openfile->fileage)
|
||||
return;
|
||||
|
||||
assert(openfile->current_y == openfile->current->lineno - openfile->edittop->lineno);
|
||||
|
||||
/* Move the current line of the edit window up. */
|
||||
openfile->current = openfile->current->prev;
|
||||
openfile->current_x = actual_x(openfile->current->data,
|
||||
openfile->placewewant);
|
||||
|
||||
/* Scroll the edit window up one line. */
|
||||
edit_scroll(UP, 1);
|
||||
do_up(TRUE);
|
||||
}
|
||||
#endif /* !NANO_TINY */
|
||||
#endif
|
||||
|
||||
/* Move down one line. */
|
||||
void do_down(void)
|
||||
/* If scroll_only is FALSE, move down one line. If scroll_only is TRUE,
|
||||
* scroll down one line without scrolling the cursor. */
|
||||
void do_down(
|
||||
#ifndef NANO_TINY
|
||||
bool scroll_only
|
||||
#else
|
||||
void
|
||||
#endif
|
||||
)
|
||||
{
|
||||
/* If we're at the bottom of the file, get out. */
|
||||
if (openfile->current == openfile->filebot)
|
||||
@@ -538,44 +563,50 @@ void do_down(void)
|
||||
openfile->current_x = actual_x(openfile->current->data,
|
||||
openfile->placewewant);
|
||||
|
||||
/* If we're on the last line of the edit window, scroll the edit
|
||||
* window down one line if we're in smooth scrolling mode, or down
|
||||
* half a page if we're not. */
|
||||
if (openfile->current_y == editwinrows - 1)
|
||||
edit_scroll(DOWN,
|
||||
/* If scroll_only is FALSE and if we're on the first line of the
|
||||
* edit window, scroll the edit window down one line if we're in
|
||||
* smooth scrolling mode, or down half a page if we're not. If
|
||||
* scroll_only is TRUE, scroll the edit window down one line
|
||||
* unconditionally. */
|
||||
if (openfile->current_y == editwinrows - 1
|
||||
#ifndef NANO_TINY
|
||||
ISSET(SMOOTH_SCROLL) ? 1 :
|
||||
|| scroll_only
|
||||
#endif
|
||||
)
|
||||
edit_scroll(DOWN_DIR,
|
||||
#ifndef NANO_TINY
|
||||
(ISSET(SMOOTH_SCROLL) || scroll_only) ? 1 :
|
||||
#endif
|
||||
editwinrows / 2);
|
||||
/* Update the line we were on before and the line we're on now. The
|
||||
* former needs to be redrawn if we're not on the first page, and
|
||||
* the latter needs to be drawn unconditionally. */
|
||||
else {
|
||||
|
||||
/* If we're above the last line of the edit window, update the line
|
||||
* we were on before and the line we're on now. The former needs to
|
||||
* be redrawn if we're not on the first page, and the latter needs
|
||||
* to be drawn unconditionally. */
|
||||
if (openfile->current_y < editwinrows - 1) {
|
||||
if (need_vertical_update(0))
|
||||
update_line(openfile->current->prev, 0);
|
||||
update_line(openfile->current, openfile->current_x);
|
||||
}
|
||||
}
|
||||
|
||||
/* Move down one line. */
|
||||
void do_down_void(void)
|
||||
{
|
||||
do_down(
|
||||
#ifndef NANO_TINY
|
||||
FALSE
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
#ifndef NANO_TINY
|
||||
/* Scroll down one line without scrolling the cursor. */
|
||||
void do_scroll_down(void)
|
||||
{
|
||||
/* If we're at the bottom of the file, get out. */
|
||||
if (openfile->current == openfile->filebot)
|
||||
return;
|
||||
|
||||
assert(openfile->current_y == openfile->current->lineno - openfile->edittop->lineno);
|
||||
|
||||
/* Move the current line of the edit window down. */
|
||||
openfile->current = openfile->current->next;
|
||||
openfile->current_x = actual_x(openfile->current->data,
|
||||
openfile->placewewant);
|
||||
|
||||
/* Scroll the edit window down one line. */
|
||||
edit_scroll(DOWN, 1);
|
||||
do_down(TRUE);
|
||||
}
|
||||
#endif /* !NANO_TINY */
|
||||
#endif
|
||||
|
||||
/* Move left one character. */
|
||||
void do_left(void)
|
||||
@@ -586,7 +617,7 @@ void do_left(void)
|
||||
openfile->current_x = move_mbleft(openfile->current->data,
|
||||
openfile->current_x);
|
||||
else if (openfile->current != openfile->fileage) {
|
||||
do_up();
|
||||
do_up_void();
|
||||
openfile->current_x = strlen(openfile->current->data);
|
||||
}
|
||||
|
||||
@@ -607,7 +638,7 @@ void do_right(void)
|
||||
openfile->current_x = move_mbright(openfile->current->data,
|
||||
openfile->current_x);
|
||||
else if (openfile->current != openfile->filebot) {
|
||||
do_down();
|
||||
do_down_void();
|
||||
openfile->current_x = 0;
|
||||
}
|
||||
|
||||
|
||||
65
src/nano.c
65
src/nano.c
@@ -29,15 +29,16 @@
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <errno.h>
|
||||
#include <ctype.h>
|
||||
#include <locale.h>
|
||||
#include <termios.h>
|
||||
|
||||
#ifdef HAVE_GETOPT_H
|
||||
#include <getopt.h>
|
||||
#endif
|
||||
#ifndef NANO_TINY
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_NANORC
|
||||
static bool no_rcfiles = FALSE;
|
||||
@@ -519,19 +520,19 @@ void free_openfilestruct(openfilestruct *src)
|
||||
/* Display a warning about a key disabled in view mode. */
|
||||
void print_view_warning(void)
|
||||
{
|
||||
statusbar(_("Key illegal in VIEW mode"));
|
||||
statusbar(_("Key invalid in view mode"));
|
||||
}
|
||||
|
||||
/* What we do when we're all set to exit. */
|
||||
void finish(void)
|
||||
{
|
||||
/* Blank the statusbar (and shortcut list, if applicable), and move
|
||||
* the cursor to the last line of the screen. */
|
||||
if (!ISSET(NO_HELP))
|
||||
blank_bottombars();
|
||||
else
|
||||
blank_statusbar();
|
||||
|
||||
wrefresh(bottomwin);
|
||||
|
||||
endwin();
|
||||
|
||||
/* Restore the old terminal settings. */
|
||||
@@ -674,7 +675,7 @@ void disable_mouse_support(void)
|
||||
/* Enable mouse support. */
|
||||
void enable_mouse_support(void)
|
||||
{
|
||||
mousemask(BUTTON1_RELEASED, NULL);
|
||||
mousemask(ALL_MOUSE_EVENTS, NULL);
|
||||
mouseinterval(50);
|
||||
}
|
||||
|
||||
@@ -724,7 +725,7 @@ void print_opt_full(const char *shortflag
|
||||
/* Explain how to properly use nano and its command line options. */
|
||||
void usage(void)
|
||||
{
|
||||
printf(_("Usage: nano [OPTIONS] [[+LINE[,COLUMN]] FILE]...\n\n"));
|
||||
printf(_("Usage: nano [OPTIONS] [[+LINE,COLUMN] FILE]...\n\n"));
|
||||
printf(
|
||||
#ifdef HAVE_GETOPT_LONG
|
||||
_("Option\t\tGNU long option\t\tMeaning\n")
|
||||
@@ -733,7 +734,7 @@ void usage(void)
|
||||
#endif
|
||||
);
|
||||
print_opt("-h, -?", "--help", N_("Show this message"));
|
||||
print_opt(_("+LINE[,COLUMN]"), "",
|
||||
print_opt(_("+LINE,COLUMN"), "",
|
||||
N_("Start at line LINE, column COLUMN"));
|
||||
#ifndef NANO_TINY
|
||||
print_opt("-A", "--smarthome", N_("Enable smart home key"));
|
||||
@@ -766,7 +767,7 @@ void usage(void)
|
||||
print_opt("-N", "--noconvert",
|
||||
N_("Don't convert files from DOS/Mac format"));
|
||||
#endif
|
||||
print_opt("-O", "--morespace", N_("Use more space for editing"));
|
||||
print_opt("-O", "--morespace", N_("Use one more line for editing"));
|
||||
#ifndef DISABLE_JUSTIFY
|
||||
print_opt(_("-Q <str>"), _("--quotestr=<str>"),
|
||||
N_("Quoting string"));
|
||||
@@ -776,7 +777,7 @@ void usage(void)
|
||||
print_opt("-S", "--smooth", N_("Smooth scrolling"));
|
||||
#endif
|
||||
print_opt(_("-T <#cols>"), _("--tabsize=<#cols>"),
|
||||
N_("Set width of a tab in cols to #cols"));
|
||||
N_("Set width of a tab to #cols columns"));
|
||||
#ifndef NANO_TINY
|
||||
print_opt("-U", "--quickblank", N_("Do quick statusbar blanking"));
|
||||
#endif
|
||||
@@ -788,7 +789,7 @@ void usage(void)
|
||||
#endif
|
||||
#ifdef ENABLE_COLOR
|
||||
print_opt(_("-Y <str>"), _("--syntax=<str>"),
|
||||
N_("Syntax definition to use"));
|
||||
N_("Syntax definition to use for coloring"));
|
||||
#endif
|
||||
print_opt("-c", "--const", N_("Constantly show cursor position"));
|
||||
print_opt("-d", "--rebinddelete",
|
||||
@@ -811,7 +812,7 @@ void usage(void)
|
||||
N_("Preserve XON (^Q) and XOFF (^S) keys"));
|
||||
#ifndef DISABLE_WRAPJUSTIFY
|
||||
print_opt(_("-r <#cols>"), _("--fill=<#cols>"),
|
||||
N_("Set fill cols to (wrap lines at) #cols"));
|
||||
N_("Set wrapping point at column #cols"));
|
||||
#endif
|
||||
#ifndef DISABLE_SPELLER
|
||||
print_opt(_("-s <prog>"), _("--speller=<prog>"),
|
||||
@@ -819,7 +820,7 @@ void usage(void)
|
||||
#endif
|
||||
print_opt("-t", "--tempfile",
|
||||
N_("Auto save on exit, don't prompt"));
|
||||
print_opt("-v", "--view", N_("View (read only) mode"));
|
||||
print_opt("-v", "--view", N_("View mode (read-only)"));
|
||||
#ifndef DISABLE_WRAPPING
|
||||
print_opt("-w", "--nowrap", N_("Don't wrap long lines"));
|
||||
#endif
|
||||
@@ -871,7 +872,7 @@ void version(void)
|
||||
#ifdef DISABLE_WRAPPING
|
||||
printf(" --disable-wrapping");
|
||||
#endif
|
||||
#if defined(DISABLE_ROOTWRAP) && !defined(DISABLE_WRAPPING)
|
||||
#ifdef DISABLE_ROOTWRAPPING
|
||||
printf(" --disable-wrapping-as-root");
|
||||
#endif
|
||||
#ifdef ENABLE_COLOR
|
||||
@@ -1011,7 +1012,8 @@ RETSIGTYPE do_suspend(int signal)
|
||||
disable_mouse_support();
|
||||
#endif
|
||||
|
||||
/* Blank the screen, and move the cursor to the last line of it. */
|
||||
/* Blank the screen, and move the cursor to the last line of the
|
||||
* screen. */
|
||||
erase();
|
||||
move(LINES - 1, 0);
|
||||
refresh();
|
||||
@@ -1056,6 +1058,7 @@ RETSIGTYPE do_continue(int signal)
|
||||
|
||||
/* Redraw the contents of the windows that need it. */
|
||||
blank_statusbar();
|
||||
wnoutrefresh(bottomwin);
|
||||
total_refresh();
|
||||
#endif
|
||||
}
|
||||
@@ -1085,6 +1088,10 @@ RETSIGTYPE handle_sigwinch(int signal)
|
||||
COLS = win.ws_col;
|
||||
LINES = win.ws_row;
|
||||
|
||||
/* Just in case we're in the statusbar prompt, reset the statusbar
|
||||
* cursor position. */
|
||||
do_prompt_abort();
|
||||
|
||||
/* If we've partitioned the filestruct, unpartition it now. */
|
||||
if (filepart != NULL)
|
||||
unpartition_filestruct(&filepart);
|
||||
@@ -1116,6 +1123,7 @@ RETSIGTYPE handle_sigwinch(int signal)
|
||||
|
||||
/* Redraw the contents of the windows that need it. */
|
||||
blank_statusbar();
|
||||
wnoutrefresh(bottomwin);
|
||||
currshortcut = main_list;
|
||||
total_refresh();
|
||||
|
||||
@@ -1322,7 +1330,7 @@ int do_input(bool *meta_key, bool *func_key, bool *s_or_t, bool
|
||||
if (allow_funcs) {
|
||||
/* If we got a mouse click and it was on a shortcut, read in the
|
||||
* shortcut character. */
|
||||
if (*func_key == TRUE && input == KEY_MOUSE) {
|
||||
if (*func_key && input == KEY_MOUSE) {
|
||||
if (do_mouse())
|
||||
input = get_kbinput(edit, meta_key, func_key);
|
||||
else {
|
||||
@@ -1360,9 +1368,8 @@ int do_input(bool *meta_key, bool *func_key, bool *s_or_t, bool
|
||||
|
||||
/* If we got a non-high-bit control key, a meta key sequence, or a
|
||||
* function key, and it's not a shortcut or toggle, throw it out. */
|
||||
if (*s_or_t == FALSE) {
|
||||
if (is_ascii_cntrl_char(input) || *meta_key == TRUE ||
|
||||
*func_key == TRUE) {
|
||||
if (!*s_or_t) {
|
||||
if (is_ascii_cntrl_char(input) || *meta_key || *func_key) {
|
||||
statusbar(_("Unknown Command"));
|
||||
beep();
|
||||
*meta_key = FALSE;
|
||||
@@ -1376,7 +1383,7 @@ int do_input(bool *meta_key, bool *func_key, bool *s_or_t, bool
|
||||
* it's a normal text character. Display the warning if we're
|
||||
* in view mode, or add the character to the input buffer if
|
||||
* we're not. */
|
||||
if (input != ERR && *s_or_t == FALSE) {
|
||||
if (input != ERR && !*s_or_t) {
|
||||
if (ISSET(VIEW_MODE))
|
||||
print_view_warning();
|
||||
else {
|
||||
@@ -1392,13 +1399,13 @@ int do_input(bool *meta_key, bool *func_key, bool *s_or_t, bool
|
||||
* output all the characters in the input buffer if it isn't
|
||||
* empty. Note that it should be empty if we're in view
|
||||
* mode. */
|
||||
if (*s_or_t == TRUE || get_key_buffer_len() == 0) {
|
||||
if (*s_or_t || get_key_buffer_len() == 0) {
|
||||
#ifndef DISABLE_WRAPPING
|
||||
/* If we got a shortcut or toggle, and it's not the shortcut
|
||||
* for verbatim input, turn off prepending of wrapped
|
||||
* text. */
|
||||
if (*s_or_t == TRUE && (!have_shortcut || s == NULL ||
|
||||
s->func != do_verbatim_input))
|
||||
if (*s_or_t && (!have_shortcut || s == NULL || s->func !=
|
||||
do_verbatim_input))
|
||||
wrap_reset();
|
||||
#endif
|
||||
|
||||
@@ -1726,7 +1733,7 @@ int main(int argc, char **argv)
|
||||
if (locale != NULL && (strcasestr(locale, "UTF8") != NULL ||
|
||||
strcasestr(locale, "UTF-8") != NULL)) {
|
||||
#ifdef USE_SLANG
|
||||
SLutf8_enable(TRUE);
|
||||
SLutf8_enable(1);
|
||||
#endif
|
||||
utf8_init();
|
||||
}
|
||||
@@ -1740,9 +1747,9 @@ int main(int argc, char **argv)
|
||||
textdomain(PACKAGE);
|
||||
#endif
|
||||
|
||||
#if !defined(ENABLE_NANORC) && defined(DISABLE_ROOTWRAP) && !defined(DISABLE_WRAPPING)
|
||||
/* If we don't have rcfile support, we're root, and
|
||||
* --disable-wrapping-as-root is used, turn wrapping off. */
|
||||
#if !defined(ENABLE_NANORC) && defined(DISABLE_ROOTWRAPPING)
|
||||
/* If we don't have rcfile support, --disable-wrapping-as-root is
|
||||
* used, and we're root, turn wrapping off. */
|
||||
if (geteuid() == NANO_ROOT_UID)
|
||||
SET(NO_WRAP);
|
||||
#endif
|
||||
@@ -2005,7 +2012,9 @@ int main(int argc, char **argv)
|
||||
tabsize = tabsize_cpy;
|
||||
flags |= flags_cpy;
|
||||
}
|
||||
#if defined(DISABLE_ROOTWRAP) && !defined(DISABLE_WRAPPING)
|
||||
#ifdef DISABLE_ROOTWRAPPING
|
||||
/* If we don't have any rcfiles, --disable-wrapping-as-root is used,
|
||||
* and we're root, turn wrapping off. */
|
||||
else if (geteuid() == NANO_ROOT_UID)
|
||||
SET(NO_WRAP);
|
||||
#endif
|
||||
|
||||
26
src/nano.h
26
src/nano.h
@@ -29,7 +29,7 @@
|
||||
#endif
|
||||
|
||||
#ifdef __TANDEM
|
||||
/* Tandem NonStop Kernel. */
|
||||
/* Tandem NonStop Kernel support. */
|
||||
#include <floss.h>
|
||||
#define NANO_ROOT_UID 65535
|
||||
#else
|
||||
@@ -138,14 +138,8 @@
|
||||
#define getline ngetline
|
||||
#endif
|
||||
|
||||
/* If we don't have regex support, turn the color support off, as it
|
||||
* depends on the use of regexes. */
|
||||
#ifndef HAVE_REGEX_H
|
||||
#undef ENABLE_COLOR
|
||||
#endif
|
||||
|
||||
/* If we aren't using ncurses, turn the mouse support off, as it's
|
||||
* ncurses-specific. */
|
||||
/* If we aren't using ncurses with mouse support, turn the mouse support
|
||||
* off, as it's useless then. */
|
||||
#ifndef NCURSES_MOUSE_VERSION
|
||||
#define DISABLE_MOUSE 1
|
||||
#endif
|
||||
@@ -164,7 +158,7 @@ typedef enum {
|
||||
} append_type;
|
||||
|
||||
typedef enum {
|
||||
UP, DOWN
|
||||
UP_DIR, DOWN_DIR
|
||||
} scroll_dir;
|
||||
|
||||
typedef enum {
|
||||
@@ -297,11 +291,12 @@ typedef struct shortcut {
|
||||
#ifndef DISABLE_HELP
|
||||
const char *help;
|
||||
/* The help file entry text for this function. */
|
||||
#endif
|
||||
bool blank_after;
|
||||
/* Whether there should be a blank line after the help entry
|
||||
* text for this function. */
|
||||
/* Key values that aren't used should be set to NANO_NO_KEY. */
|
||||
#endif
|
||||
/* Note: Key values that aren't used should be set to
|
||||
* NANO_NO_KEY. */
|
||||
int ctrlval;
|
||||
/* The special sentinel key or control key we want bound, if
|
||||
* any. */
|
||||
@@ -326,9 +321,11 @@ typedef struct toggle {
|
||||
const char *desc;
|
||||
/* The description of the toggle, e.g. "Cut to end"; we'll
|
||||
* append Enabled or Disabled to it. */
|
||||
#ifndef DISABLE_HELP
|
||||
bool blank_after;
|
||||
/* Whether there should be a blank line after the description of
|
||||
* the toggle. */
|
||||
#endif
|
||||
long flag;
|
||||
/* Which flag actually gets toggled. */
|
||||
struct toggle *next;
|
||||
@@ -547,8 +544,8 @@ typedef struct rcoption {
|
||||
#define NANO_DELETE_KEY NANO_CONTROL_D
|
||||
#define NANO_BACKSPACE_KEY NANO_CONTROL_H
|
||||
#define NANO_TAB_KEY NANO_CONTROL_I
|
||||
#define NANO_INDENTMARKED_KEY NANO_ALT_RCURLYBRACKET
|
||||
#define NANO_UNINDENTMARKED_KEY NANO_ALT_LCURLYBRACKET
|
||||
#define NANO_INDENT_KEY NANO_ALT_RCURLYBRACKET
|
||||
#define NANO_UNINDENT_KEY NANO_ALT_LCURLYBRACKET
|
||||
#define NANO_SUSPEND_KEY NANO_CONTROL_Z
|
||||
#define NANO_ENTER_KEY NANO_CONTROL_M
|
||||
#define NANO_TOFILES_KEY NANO_CONTROL_T
|
||||
@@ -566,7 +563,6 @@ typedef struct rcoption {
|
||||
#define NANO_SCROLLDOWN_KEY NANO_ALT_PLUS
|
||||
#define NANO_SCROLLUP_ALTKEY NANO_ALT_UNDERSCORE
|
||||
#define NANO_SCROLLDOWN_ALTKEY NANO_ALT_EQUALS
|
||||
#define NANO_CUTTILLEND_KEY NANO_CONTROL_X
|
||||
#define NANO_CUTTILLEND_ALTKEY NANO_ALT_T
|
||||
#define NANO_PARABEGIN_KEY NANO_CONTROL_W
|
||||
#define NANO_PARABEGIN_ALTKEY NANO_ALT_LPARENTHESIS
|
||||
|
||||
98
src/prompt.c
98
src/prompt.c
@@ -33,6 +33,10 @@ static size_t statusbar_x = (size_t)-1;
|
||||
/* The cursor position in answer. */
|
||||
static size_t statusbar_pww = (size_t)-1;
|
||||
/* The place we want in answer. */
|
||||
static size_t old_statusbar_x = (size_t)-1;
|
||||
/* The old cursor position in answer, if any. */
|
||||
static size_t old_pww = (size_t)-1;
|
||||
/* The old place we want in answer, if any. */
|
||||
static bool reset_statusbar_x = FALSE;
|
||||
/* Should we reset the cursor position at the statusbar
|
||||
* prompt? */
|
||||
@@ -71,7 +75,7 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
|
||||
if (allow_funcs) {
|
||||
/* If we got a mouse click and it was on a shortcut, read in the
|
||||
* shortcut character. */
|
||||
if (*func_key == TRUE && input == KEY_MOUSE) {
|
||||
if (*func_key && input == KEY_MOUSE) {
|
||||
if (do_statusbar_mouse())
|
||||
input = get_kbinput(bottomwin, meta_key, func_key);
|
||||
else {
|
||||
@@ -97,7 +101,7 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
|
||||
#ifndef NANO_TINY
|
||||
input == NANO_NEXTWORD_KEY ||
|
||||
#endif
|
||||
(*meta_key == TRUE && (
|
||||
(*meta_key && (
|
||||
#ifndef NANO_TINY
|
||||
input == NANO_PREVWORD_KEY || input == NANO_BRACKET_KEY ||
|
||||
#endif
|
||||
@@ -108,9 +112,8 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
|
||||
|
||||
/* If we got a non-high-bit control key, a meta key sequence, or a
|
||||
* function key, and it's not a shortcut or toggle, throw it out. */
|
||||
if (*s_or_t == FALSE) {
|
||||
if (is_ascii_cntrl_char(input) || *meta_key == TRUE ||
|
||||
*func_key == TRUE) {
|
||||
if (!*s_or_t) {
|
||||
if (is_ascii_cntrl_char(input) || *meta_key || *func_key) {
|
||||
beep();
|
||||
*meta_key = FALSE;
|
||||
*func_key = FALSE;
|
||||
@@ -123,7 +126,7 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
|
||||
* it's a normal text character. Display the warning if we're
|
||||
* in view mode, or add the character to the input buffer if
|
||||
* we're not. */
|
||||
if (input != ERR && *s_or_t == FALSE) {
|
||||
if (input != ERR && !*s_or_t) {
|
||||
/* If we're using restricted mode, the filename isn't blank,
|
||||
* and we're at the "Write File" prompt, disable text
|
||||
* input. */
|
||||
@@ -139,7 +142,7 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
|
||||
/* If we got a shortcut, or if there aren't any other characters
|
||||
* waiting after the one we read in, we need to display all the
|
||||
* characters in the input buffer if it isn't empty. */
|
||||
if (*s_or_t == TRUE || get_key_buffer_len() == 0) {
|
||||
if (*s_or_t || get_key_buffer_len() == 0) {
|
||||
if (kbinput != NULL) {
|
||||
/* Display all the characters in the input buffer at
|
||||
* once, filtering out control characters. */
|
||||
@@ -192,7 +195,7 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
|
||||
do_statusbar_next_word(FALSE);
|
||||
break;
|
||||
case NANO_PREVWORD_KEY:
|
||||
if (*meta_key == TRUE)
|
||||
if (*meta_key)
|
||||
do_statusbar_prev_word(FALSE);
|
||||
break;
|
||||
#endif
|
||||
@@ -204,12 +207,12 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
|
||||
break;
|
||||
#ifndef NANO_TINY
|
||||
case NANO_BRACKET_KEY:
|
||||
if (*meta_key == TRUE)
|
||||
if (*meta_key)
|
||||
do_statusbar_find_bracket();
|
||||
break;
|
||||
#endif
|
||||
case NANO_VERBATIM_KEY:
|
||||
if (*meta_key == TRUE) {
|
||||
if (*meta_key) {
|
||||
/* If we're using restricted mode, the filename
|
||||
* isn't blank, and we're at the "Write File"
|
||||
* prompt, disable verbatim input. */
|
||||
@@ -840,7 +843,7 @@ void do_statusbar_find_bracket(void)
|
||||
}
|
||||
#endif /* !NANO_TINY */
|
||||
|
||||
/* Return the placewewant associated with statusbar_x, i.e, the
|
||||
/* Return the placewewant associated with statusbar_x, i.e. the
|
||||
* zero-based column position of the cursor. The value will be no
|
||||
* smaller than statusbar_x. */
|
||||
size_t statusbar_xplustabs(void)
|
||||
@@ -902,16 +905,18 @@ void update_statusbar_line(const char *curranswer, size_t index)
|
||||
reset_statusbar_cursor();
|
||||
|
||||
wattroff(bottomwin, reverse_attr);
|
||||
|
||||
wnoutrefresh(bottomwin);
|
||||
}
|
||||
|
||||
/* Return TRUE if we need an update after moving horizontally, and FALSE
|
||||
* otherwise. We need one if old_pww and statusbar_pww are on different
|
||||
* pages. */
|
||||
bool need_statusbar_horizontal_update(size_t old_pww)
|
||||
* otherwise. We need one if pww_save and statusbar_pww are on
|
||||
* different pages. */
|
||||
bool need_statusbar_horizontal_update(size_t pww_save)
|
||||
{
|
||||
size_t start_col = strlenpt(prompt) + 1;
|
||||
|
||||
return get_statusbar_page_start(start_col, start_col + old_pww) !=
|
||||
return get_statusbar_page_start(start_col, start_col + pww_save) !=
|
||||
get_statusbar_page_start(start_col, start_col + statusbar_pww);
|
||||
}
|
||||
|
||||
@@ -964,13 +969,20 @@ int get_prompt_string(bool allow_tabs,
|
||||
answer = mallocstrcpy(answer, curranswer);
|
||||
curranswer_len = strlen(answer);
|
||||
|
||||
/* Only put statusbar_x at the end of the string (and change
|
||||
* statusbar_pww to match) if it's uninitialized, if it would be
|
||||
* past the end of curranswer, or if reset_statusbar_x is TRUE.
|
||||
* Otherwise, leave it alone. This is so the cursor position stays
|
||||
* at the same place if a prompt-changing toggle is pressed. */
|
||||
if (statusbar_x == (size_t)-1 || statusbar_x > curranswer_len ||
|
||||
reset_statusbar_x) {
|
||||
/* If reset_statusbar_x is TRUE, restore statusbar_x and
|
||||
* statusbar_pww to what they were before this prompt. Then, if
|
||||
* statusbar_x is uninitialized or past the end of curranswer, put
|
||||
* statusbar_x at the end of the string and update statusbar_pww
|
||||
* based on it. We do these things so that the cursor position
|
||||
* stays at the right place if a prompt-changing toggle is pressed,
|
||||
* or if this prompt was started from another prompt and we cancel
|
||||
* out of it. */
|
||||
if (reset_statusbar_x) {
|
||||
statusbar_x = old_statusbar_x;
|
||||
statusbar_pww = old_pww;
|
||||
}
|
||||
|
||||
if (statusbar_x == (size_t)-1 || statusbar_x > curranswer_len) {
|
||||
statusbar_x = curranswer_len;
|
||||
statusbar_pww = statusbar_xplustabs();
|
||||
}
|
||||
@@ -1121,13 +1133,22 @@ int get_prompt_string(bool allow_tabs,
|
||||
}
|
||||
#endif
|
||||
|
||||
/* We finished putting in an answer or ran a normal shortcut's
|
||||
* associated function, so reset statusbar_x and statusbar_pww. */
|
||||
/* We've finished putting in an answer or run a normal shortcut's
|
||||
* associated function, so reset statusbar_x and statusbar_pww. If
|
||||
* we've finished putting in an answer, reset the statusbar cursor
|
||||
* position too. */
|
||||
if (kbinput == NANO_CANCEL_KEY || kbinput == NANO_ENTER_KEY ||
|
||||
ran_func) {
|
||||
statusbar_x = (size_t)-1;
|
||||
statusbar_pww = (size_t)-1;
|
||||
}
|
||||
statusbar_x = old_statusbar_x;
|
||||
statusbar_pww = old_pww;
|
||||
|
||||
if (!ran_func)
|
||||
reset_statusbar_x = TRUE;
|
||||
/* Otherwise, we're still putting in an answer or a shortcut with
|
||||
* an associated function, so leave the statusbar cursor position
|
||||
* alone. */
|
||||
} else
|
||||
reset_statusbar_x = FALSE;
|
||||
|
||||
return kbinput;
|
||||
}
|
||||
@@ -1191,16 +1212,19 @@ int do_prompt(bool allow_tabs,
|
||||
free(prompt);
|
||||
prompt = NULL;
|
||||
|
||||
reset_statusbar_x = FALSE;
|
||||
/* We're done with the prompt, so save the statusbar cursor
|
||||
* position. */
|
||||
old_statusbar_x = statusbar_x;
|
||||
old_pww = statusbar_pww;
|
||||
|
||||
/* If we left the prompt via Cancel or Enter, set the return value
|
||||
* properly. */
|
||||
switch (retval) {
|
||||
case NANO_CANCEL_KEY:
|
||||
retval = -1;
|
||||
reset_statusbar_x = TRUE;
|
||||
break;
|
||||
case NANO_ENTER_KEY:
|
||||
retval = (answer[0] == '\0') ? -2 : 0;
|
||||
reset_statusbar_x = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1223,8 +1247,8 @@ int do_prompt(bool allow_tabs,
|
||||
}
|
||||
|
||||
/* This function forces a reset of the statusbar cursor position. It
|
||||
* should only be called after do_prompt(), and is only needed if the
|
||||
* user leaves the prompt via something other than Enter or Cancel. */
|
||||
* should only be called after do_prompt(), and is only needed if we
|
||||
* leave the prompt via something other than Cancel or Enter. */
|
||||
void do_prompt_abort(void)
|
||||
{
|
||||
reset_statusbar_x = TRUE;
|
||||
@@ -1310,10 +1334,10 @@ int do_yesno_prompt(bool all, const char *msg)
|
||||
case KEY_MOUSE:
|
||||
get_mouseinput(&mouse_x, &mouse_y, FALSE);
|
||||
|
||||
if (mouse_x != -1 && mouse_y != -1 && !ISSET(NO_HELP) &&
|
||||
wenclose(bottomwin, mouse_y, mouse_x) &&
|
||||
mouse_x < (width * 2) && mouse_y - (2 -
|
||||
no_more_space()) - editwinrows - 1 >= 0) {
|
||||
if (wenclose(bottomwin, mouse_y, mouse_x) &&
|
||||
!ISSET(NO_HELP) && mouse_x < (width * 2) &&
|
||||
mouse_y - (2 - no_more_space()) -
|
||||
editwinrows - 1 >= 0) {
|
||||
int x = mouse_x / width;
|
||||
/* Calculate the x-coordinate relative to the
|
||||
* two columns of the Yes/No/All shortcuts in
|
||||
@@ -1322,7 +1346,7 @@ int do_yesno_prompt(bool all, const char *msg)
|
||||
editwinrows - 1;
|
||||
/* Calculate the y-coordinate relative to the
|
||||
* beginning of the Yes/No/All shortcuts in
|
||||
* bottomwin, i.e, with the sizes of topwin,
|
||||
* bottomwin, i.e. with the sizes of topwin,
|
||||
* edit, and the first line of bottomwin
|
||||
* subtracted out. */
|
||||
|
||||
|
||||
57
src/proto.h
57
src/proto.h
@@ -26,7 +26,7 @@
|
||||
|
||||
#include "nano.h"
|
||||
|
||||
/* Public externs. See global.c for descriptions of them. */
|
||||
/* Public external variables. See global.c for their descriptions. */
|
||||
#ifndef NANO_TINY
|
||||
extern sigjmp_buf jump_buf;
|
||||
extern bool jump_buf_main;
|
||||
@@ -148,6 +148,7 @@ char *do_browse_from(const char *inpath);
|
||||
void browser_init(const char *path, DIR *dir);
|
||||
void parse_browser_input(int *kbinput, bool *meta_key, bool *func_key);
|
||||
void browser_refresh(void);
|
||||
bool browser_select_filename(const char *needle);
|
||||
int filesearch_init(void);
|
||||
bool findnextfile(bool no_sameline, size_t begin, const char *needle);
|
||||
void findnextfile_wrap_reset(void);
|
||||
@@ -156,7 +157,7 @@ void do_filesearch(void);
|
||||
void do_fileresearch(void);
|
||||
void do_first_file(void);
|
||||
void do_last_file(void);
|
||||
void striponedir(char *path);
|
||||
char *striponedir(const char *path);
|
||||
#endif
|
||||
|
||||
/* Public functions in chars.c. */
|
||||
@@ -341,16 +342,19 @@ void save_history(void);
|
||||
/* Public functions in global.c. */
|
||||
size_t length_of_list(const shortcut *s);
|
||||
#ifndef NANO_TINY
|
||||
void toggle_init_one(int val, const char *desc, bool blank_after, long
|
||||
flag);
|
||||
void toggle_init_one(int val
|
||||
#ifndef DISABLE_HELP
|
||||
, const char *desc, bool blank_after
|
||||
#endif
|
||||
, long flag);
|
||||
void toggle_init(void);
|
||||
#endif
|
||||
void sc_init_one(shortcut **shortcutage, int ctrlval, const char *desc,
|
||||
void sc_init_one(shortcut **shortcutage, int ctrlval, const char *desc
|
||||
#ifndef DISABLE_HELP
|
||||
const char *help,
|
||||
, const char *help, bool blank_after
|
||||
#endif
|
||||
bool blank_after, int metaval, int funcval, int miscval, bool
|
||||
view, void (*func)(void));
|
||||
, int metaval, int funcval, int miscval, bool view, void
|
||||
(*func)(void));
|
||||
void shortcut_init(bool unjustify);
|
||||
void free_shortcutage(shortcut **shortcutage);
|
||||
#ifdef DEBUG
|
||||
@@ -388,11 +392,25 @@ void do_prev_word_void(void);
|
||||
#endif
|
||||
void do_home(void);
|
||||
void do_end(void);
|
||||
void do_up(void);
|
||||
void do_up(
|
||||
#ifndef NANO_TINY
|
||||
bool scroll_only
|
||||
#else
|
||||
void
|
||||
#endif
|
||||
);
|
||||
void do_up_void(void);
|
||||
#ifndef NANO_TINY
|
||||
void do_scroll_up(void);
|
||||
#endif
|
||||
void do_down(void);
|
||||
void do_down(
|
||||
#ifndef NANO_TINY
|
||||
bool scroll_only
|
||||
#else
|
||||
void
|
||||
#endif
|
||||
);
|
||||
void do_down_void(void);
|
||||
#ifndef NANO_TINY
|
||||
void do_scroll_down(void);
|
||||
#endif
|
||||
@@ -500,7 +518,7 @@ size_t statusbar_xplustabs(void);
|
||||
size_t get_statusbar_page_start(size_t start_col, size_t column);
|
||||
void reset_statusbar_cursor(void);
|
||||
void update_statusbar_line(const char *curranswer, size_t index);
|
||||
bool need_statusbar_horizontal_update(size_t old_pww);
|
||||
bool need_statusbar_horizontal_update(size_t pww_save);
|
||||
void total_statusbar_refresh(void (*refresh_func)(void));
|
||||
int get_prompt_string(bool allow_tabs,
|
||||
#ifndef DISABLE_TABCOMP
|
||||
@@ -612,9 +630,9 @@ void do_delete(void);
|
||||
void do_backspace(void);
|
||||
void do_tab(void);
|
||||
#ifndef NANO_TINY
|
||||
void do_indent_marked(ssize_t cols);
|
||||
void do_indent_marked_void(void);
|
||||
void do_unindent_marked_void(void);
|
||||
void do_indent(ssize_t cols);
|
||||
void do_indent_void(void);
|
||||
void do_unindent(void);
|
||||
#endif
|
||||
void do_enter(void);
|
||||
#ifndef NANO_TINY
|
||||
@@ -717,10 +735,9 @@ void unget_kbinput(int kbinput, bool meta_key, bool func_key);
|
||||
int *get_input(WINDOW *win, size_t input_len);
|
||||
int get_kbinput(WINDOW *win, bool *meta_key, bool *func_key);
|
||||
int parse_kbinput(WINDOW *win, bool *meta_key, bool *func_key);
|
||||
int get_escape_seq_kbinput(const int *seq, size_t seq_len, bool
|
||||
*ignore_seq);
|
||||
int get_escape_seq_kbinput(const int *seq, size_t seq_len);
|
||||
int get_escape_seq_abcd(int kbinput);
|
||||
int parse_escape_seq_kbinput(int kbinput, bool *ignore_seq);
|
||||
int parse_escape_seq_kbinput(WINDOW *win, int kbinput);
|
||||
int get_byte_kbinput(int kbinput);
|
||||
#ifdef ENABLE_UTF8
|
||||
long add_unicode_digit(int kbinput, long factor, long *uni);
|
||||
@@ -756,10 +773,10 @@ void reset_cursor(void);
|
||||
void edit_draw(const filestruct *fileptr, const char *converted, int
|
||||
line, size_t start);
|
||||
void update_line(const filestruct *fileptr, size_t index);
|
||||
bool need_horizontal_update(size_t old_pww);
|
||||
bool need_vertical_update(size_t old_pww);
|
||||
bool need_horizontal_update(size_t pww_save);
|
||||
bool need_vertical_update(size_t pww_save);
|
||||
void edit_scroll(scroll_dir direction, ssize_t nlines);
|
||||
void edit_redraw(const filestruct *old_current, size_t old_pww);
|
||||
void edit_redraw(const filestruct *old_current, size_t pww_save);
|
||||
void edit_refresh(void);
|
||||
void edit_update(update_type location);
|
||||
void total_redraw(void);
|
||||
|
||||
20
src/rcfile.c
20
src/rcfile.c
@@ -32,7 +32,7 @@
|
||||
|
||||
#ifdef ENABLE_NANORC
|
||||
|
||||
const static rcoption rcopts[] = {
|
||||
static const rcoption rcopts[] = {
|
||||
{"boldtext", BOLD_TEXT},
|
||||
#ifndef DISABLE_JUSTIFY
|
||||
{"brackets", 0},
|
||||
@@ -108,8 +108,9 @@ static colortype *endcolor = NULL;
|
||||
/* The end of the color list for the current syntax. */
|
||||
#endif
|
||||
|
||||
/* We have an error in some part of the rcfile. Put it on stderr and
|
||||
* make the user hit Enter to continue starting nano. */
|
||||
/* We have an error in some part of the rcfile. Print the error message
|
||||
* on stderr, and then make the user hit Enter to continue starting
|
||||
* nano. */
|
||||
void rcfile_error(const char *msg, ...)
|
||||
{
|
||||
va_list ap;
|
||||
@@ -127,8 +128,9 @@ void rcfile_error(const char *msg, ...)
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
|
||||
/* Parse the next word from the string. Return points to '\0' if we hit
|
||||
* the end of the line. */
|
||||
/* Parse the next word from the string, null-terminate it, and return
|
||||
* a pointer to the first character after the null terminator. The
|
||||
* returned pointer will point to '\0' if we hit the end of the line. */
|
||||
char *parse_next_word(char *ptr)
|
||||
{
|
||||
while (!isblank(*ptr) && *ptr != '\0')
|
||||
@@ -834,9 +836,11 @@ void parse_rcfile(FILE *rcstream
|
||||
rcfile_error(N_("Unknown flag \"%s\""), option);
|
||||
}
|
||||
|
||||
#ifdef ENABLE_COLOR
|
||||
if (endsyntax != NULL && endcolor == NULL)
|
||||
rcfile_error(N_("Syntax \"%s\" has no color commands"),
|
||||
endsyntax->desc);
|
||||
#endif
|
||||
|
||||
free(buf);
|
||||
fclose(rcstream);
|
||||
@@ -880,10 +884,10 @@ void do_rcfile(void)
|
||||
#endif
|
||||
);
|
||||
|
||||
#if defined(DISABLE_ROOTWRAP) && !defined(DISABLE_WRAPPING)
|
||||
#ifdef DISABLE_ROOTWRAPPING
|
||||
/* We've already read SYSCONFDIR/nanorc, if it's there. If we're
|
||||
* root and --disable-wrapping-as-root is used, turn wrapping
|
||||
* off now. */
|
||||
* root, and --disable-wrapping-as-root is used, turn wrapping off
|
||||
* now. */
|
||||
if (geteuid() == NANO_ROOT_UID)
|
||||
SET(NO_WRAP);
|
||||
#endif
|
||||
|
||||
10
src/search.c
10
src/search.c
@@ -421,7 +421,7 @@ void do_search(void)
|
||||
{
|
||||
filestruct *fileptr = openfile->current;
|
||||
size_t fileptr_x = openfile->current_x;
|
||||
size_t old_pww = openfile->placewewant;
|
||||
size_t pww_save = openfile->placewewant;
|
||||
int i;
|
||||
bool didfind;
|
||||
|
||||
@@ -493,7 +493,7 @@ void do_search(void)
|
||||
}
|
||||
|
||||
openfile->placewewant = xplustabs();
|
||||
edit_redraw(fileptr, old_pww);
|
||||
edit_redraw(fileptr, pww_save);
|
||||
search_replace_abort();
|
||||
}
|
||||
|
||||
@@ -503,7 +503,7 @@ void do_research(void)
|
||||
{
|
||||
filestruct *fileptr = openfile->current;
|
||||
size_t fileptr_x = openfile->current_x;
|
||||
size_t old_pww = openfile->placewewant;
|
||||
size_t pww_save = openfile->placewewant;
|
||||
bool didfind;
|
||||
|
||||
search_init_globals();
|
||||
@@ -555,7 +555,7 @@ void do_research(void)
|
||||
statusbar(_("No current search pattern"));
|
||||
|
||||
openfile->placewewant = xplustabs();
|
||||
edit_redraw(fileptr, old_pww);
|
||||
edit_redraw(fileptr, pww_save);
|
||||
search_replace_abort();
|
||||
}
|
||||
#endif
|
||||
@@ -576,7 +576,7 @@ int replace_regexp(char *string, bool create)
|
||||
/* Iterate through the replacement text to handle subexpression
|
||||
* replacement using \1, \2, \3, etc. */
|
||||
while (*c != '\0') {
|
||||
int num = (int)(*(c + 1) - '0');
|
||||
int num = (*(c + 1) - '0');
|
||||
|
||||
if (*c != '\\' || num < 1 || num > 9 || num >
|
||||
search_regexp.re_nsub) {
|
||||
|
||||
66
src/text.c
66
src/text.c
@@ -55,7 +55,7 @@ void do_mark(void)
|
||||
openfile->mark_begin = openfile->current;
|
||||
openfile->mark_begin_x = openfile->current_x;
|
||||
} else {
|
||||
statusbar(_("Mark UNset"));
|
||||
statusbar(_("Mark Unset"));
|
||||
openfile->mark_begin = NULL;
|
||||
openfile->mark_begin_x = 0;
|
||||
edit_refresh();
|
||||
@@ -191,12 +191,12 @@ void do_tab(void)
|
||||
}
|
||||
|
||||
#ifndef NANO_TINY
|
||||
/* Indent or unindent all lines covered by the mark len columns,
|
||||
* depending on whether len is positive or negative. If the
|
||||
* TABS_TO_SPACES flag is set, indent/unindent by len spaces.
|
||||
* Otherwise, indent/unindent by (len / tabsize) tabs and (len %
|
||||
* tabsize) spaces. */
|
||||
void do_indent_marked(ssize_t cols)
|
||||
/* Indent or unindent the current line (or all lines covered by the mark
|
||||
* if the mark is on) len columns, depending on whether len is positive
|
||||
* or negative. If the TABS_TO_SPACES flag is set, indent/unindent by
|
||||
* len spaces. Otherwise, indent/unindent by (len / tabsize) tabs and
|
||||
* (len % tabsize) spaces. */
|
||||
void do_indent(ssize_t cols)
|
||||
{
|
||||
bool indent_changed = FALSE;
|
||||
/* Whether any indenting or unindenting was done. */
|
||||
@@ -212,13 +212,6 @@ void do_indent_marked(ssize_t cols)
|
||||
|
||||
assert(openfile->current != NULL && openfile->current->data != NULL);
|
||||
|
||||
/* If the mark isn't on, indicate it on the statusbar and get
|
||||
* out. */
|
||||
if (!openfile->mark_set) {
|
||||
statusbar(_("No lines selected, nothing to do!"));
|
||||
return;
|
||||
}
|
||||
|
||||
/* If cols is zero, get out. */
|
||||
if (cols == 0)
|
||||
return;
|
||||
@@ -233,9 +226,15 @@ void do_indent_marked(ssize_t cols)
|
||||
} else
|
||||
indent_changed = TRUE;
|
||||
|
||||
/* Get the coordinates of the marked text. */
|
||||
mark_order((const filestruct **)&top, &top_x,
|
||||
(const filestruct **)&bot, &bot_x, NULL);
|
||||
/* If the mark is on, use all lines covered by the mark. */
|
||||
if (openfile->mark_set)
|
||||
mark_order((const filestruct **)&top, &top_x,
|
||||
(const filestruct **)&bot, &bot_x, NULL);
|
||||
/* Otherwise, use the current line. */
|
||||
else {
|
||||
top = openfile->current;
|
||||
bot = top;
|
||||
}
|
||||
|
||||
if (!unindent) {
|
||||
/* Set up the text we'll be using as indentation. */
|
||||
@@ -260,7 +259,7 @@ void do_indent_marked(ssize_t cols)
|
||||
line_indent[line_indent_len] = '\0';
|
||||
}
|
||||
|
||||
/* Go through each line of the marked text. */
|
||||
/* Go through each line of the text. */
|
||||
for (f = top; f != bot->next; f = f->next) {
|
||||
size_t line_len = strlen(f->data);
|
||||
size_t indent_len = indent_length(f->data);
|
||||
@@ -276,8 +275,8 @@ void do_indent_marked(ssize_t cols)
|
||||
openfile->totsize += line_indent_len;
|
||||
|
||||
/* Keep track of the change in the current line. */
|
||||
if (f == openfile->mark_begin && openfile->mark_begin_x >=
|
||||
indent_len)
|
||||
if (openfile->mark_set && f == openfile->mark_begin &&
|
||||
openfile->mark_begin_x >= indent_len)
|
||||
openfile->mark_begin_x += line_indent_len;
|
||||
|
||||
if (f == openfile->current && openfile->current_x >=
|
||||
@@ -311,7 +310,7 @@ void do_indent_marked(ssize_t cols)
|
||||
openfile->totsize -= indent_shift;
|
||||
|
||||
/* Keep track of the change in the current line. */
|
||||
if (f == openfile->mark_begin &&
|
||||
if (openfile->mark_set && f == openfile->mark_begin &&
|
||||
openfile->mark_begin_x > indent_new) {
|
||||
if (openfile->mark_begin_x <= indent_len)
|
||||
openfile->mark_begin_x = indent_new;
|
||||
@@ -347,16 +346,18 @@ void do_indent_marked(ssize_t cols)
|
||||
}
|
||||
}
|
||||
|
||||
/* Indent all lines covered by the mark tabsize columns. */
|
||||
void do_indent_marked_void(void)
|
||||
/* Indent the current line, or all lines covered by the mark if the mark
|
||||
* is on, tabsize columns. */
|
||||
void do_indent_void(void)
|
||||
{
|
||||
do_indent_marked(tabsize);
|
||||
do_indent(tabsize);
|
||||
}
|
||||
|
||||
/* Unindent all lines covered by the mark tabsize columns. */
|
||||
void do_unindent_marked_void(void)
|
||||
/* Unindent the current line, or all lines covered by the mark if the
|
||||
* mark is on, tabsize columns. */
|
||||
void do_unindent(void)
|
||||
{
|
||||
do_indent_marked(-tabsize);
|
||||
do_indent(-tabsize);
|
||||
}
|
||||
#endif /* !NANO_TINY */
|
||||
|
||||
@@ -496,11 +497,6 @@ bool execute_command(const char *command)
|
||||
|
||||
read_file(f, "stdin");
|
||||
|
||||
/* If multibuffer mode is on, we could be here in view mode. If so,
|
||||
* don't set the modification flag. */
|
||||
if (!ISSET(VIEW_MODE))
|
||||
set_modified();
|
||||
|
||||
if (wait(NULL) == -1)
|
||||
nperror("wait");
|
||||
|
||||
@@ -1946,7 +1942,7 @@ const char *do_int_speller(const char *tempfile_name)
|
||||
|
||||
/* A new process to run spell in. */
|
||||
if ((pid_spell = fork()) == 0) {
|
||||
/* Child continues (i.e, future spell process). */
|
||||
/* Child continues (i.e. future spell process). */
|
||||
close(spell_fd[0]);
|
||||
|
||||
/* Replace the standard input with the temp file. */
|
||||
@@ -1976,7 +1972,7 @@ const char *do_int_speller(const char *tempfile_name)
|
||||
|
||||
/* A new process to run sort in. */
|
||||
if ((pid_sort = fork()) == 0) {
|
||||
/* Child continues (i.e, future spell process). Replace the
|
||||
/* Child continues (i.e. future spell process). Replace the
|
||||
* standard input with the standard output of the old pipe. */
|
||||
if (dup2(spell_fd[0], STDIN_FILENO) != STDIN_FILENO)
|
||||
goto close_pipes_and_exit;
|
||||
@@ -2002,7 +1998,7 @@ const char *do_int_speller(const char *tempfile_name)
|
||||
|
||||
/* A new process to run uniq in. */
|
||||
if ((pid_uniq = fork()) == 0) {
|
||||
/* Child continues (i.e, future uniq process). Replace the
|
||||
/* Child continues (i.e. future uniq process). Replace the
|
||||
* standard input with the standard output of the old pipe. */
|
||||
if (dup2(sort_fd[0], STDIN_FILENO) != STDIN_FILENO)
|
||||
goto close_pipes_and_exit;
|
||||
|
||||
12
src/utils.c
12
src/utils.c
@@ -35,8 +35,12 @@ int digits(size_t n)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 1; n >= 10; n /= 10, i++)
|
||||
;
|
||||
if (n == 0)
|
||||
i = 1;
|
||||
else {
|
||||
for (i = 0; n != 0; n /= 10, i++)
|
||||
;
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
||||
@@ -425,7 +429,7 @@ size_t get_page_start(size_t column)
|
||||
return column - (COLS - 2);
|
||||
}
|
||||
|
||||
/* Return the placewewant associated with current_x, i.e, the zero-based
|
||||
/* Return the placewewant associated with current_x, i.e. the zero-based
|
||||
* column position of the cursor. The value will be no smaller than
|
||||
* current_x. */
|
||||
size_t xplustabs(void)
|
||||
@@ -434,7 +438,7 @@ size_t xplustabs(void)
|
||||
}
|
||||
|
||||
/* Return the index in s of the character displayed at the given column,
|
||||
* i.e, the largest value such that strnlenpt(s, actual_x(s, column)) <=
|
||||
* i.e. the largest value such that strnlenpt(s, actual_x(s, column)) <=
|
||||
* column. */
|
||||
size_t actual_x(const char *s, size_t column)
|
||||
{
|
||||
|
||||
744
src/winio.c
744
src/winio.c
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user