Compare commits

...

82 Commits

Author SHA1 Message Date
David Lawrence Ramsey
f70f0cf6bd GNU nano 1.3.2
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1704 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-31 18:42:52 +00:00
David Lawrence Ramsey
44e7f82e0e minor tweaks; also remove the need for the JUSTIFY_MODE flag
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1703 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-30 04:17:10 +00:00
David Lawrence Ramsey
0b047c561d fix error in changelog and add missing size_t cast
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1702 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-29 23:09:08 +00:00
David Lawrence Ramsey
ce991bb3ad set the input mode before turning the keypad on, and don't turn the
keypad on in a window before that window's initialized (oddly, ncurses
didn't segfault on the latter, but slang did)


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1701 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-29 18:36:39 +00:00
David Lawrence Ramsey
fd1768a902 minor bits
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1700 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-19 21:57:56 +00:00
David Lawrence Ramsey
1576d537a6 rename a few variables and make a few cosmetic cleanups
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1699 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-19 21:46:34 +00:00
David Lawrence Ramsey
7947544460 fix entry
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1698 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-19 20:47:57 +00:00
David Lawrence Ramsey
b977515bd7 avoid any more editbot-related segfaults by removing the last of the
references to it, as in DB's patch


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1697 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-19 02:15:42 +00:00
David Lawrence Ramsey
aca5d04f42 typo fix
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1696 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-19 01:35:57 +00:00
David Lawrence Ramsey
6aec4b85e6 fix potential memory corruption problems caused by passing answer in as
the value of def in statusq(), etc.


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1695 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-15 20:26:30 +00:00
David Lawrence Ramsey
dc10ecbbd6 revert the Meta-P and Meta-N aliases for the paragraph searches for now;
Meta-P was being interpreted as such even when it was used for the
Prepend toggle at the writeout prompt


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1694 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-15 20:03:01 +00:00
David Lawrence Ramsey
b6aa42864e add DB's similar simplification of do_prev_word() too
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1693 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-14 01:42:17 +00:00
David Lawrence Ramsey
bf3c93e268 add DB's patch to simplify do_next_word() and remove references to
editbot in it so as to avoid a segfault


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1692 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-13 19:42:58 +00:00
David Lawrence Ramsey
c6908f28b7 minor bits
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1691 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-11 02:20:25 +00:00
David Lawrence Ramsey
58924035c8 minor comment fix
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1690 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-08 19:53:11 +00:00
David Lawrence Ramsey
2a464cb07d fix error I made when porting over DB's refactored search code: the
strstr() call used in forward case-sensitive searches was using the
wrong variable, which made all such searches fail


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1689 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-07 21:16:18 +00:00
David Lawrence Ramsey
35557c555c change instances of "int main ()" to "int main(void)"
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1688 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-07 15:14:56 +00:00
David Lawrence Ramsey
221ebcdf70 remove trailing space
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1687 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-05 20:47:15 +00:00
David Lawrence Ramsey
da35251e98 wrap one reference to NANO_EXTCMD_KEY in a NANO_SMALL #ifdef
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1686 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-05 20:04:44 +00:00
David Lawrence Ramsey
a9cd41c42d minor comment fix
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1685 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-05 19:54:58 +00:00
David Lawrence Ramsey
37be3edebc remove redundant line
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1684 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-05 03:14:52 +00:00
David Lawrence Ramsey
5ae684fc81 TODO update: clarify the paragraph searching item, and add item for
filename searches in the file browser


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1683 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-04 23:48:26 +00:00
David Lawrence Ramsey
d7f5ad9786 add function key aliases for NANO_FIRSTLINE_KEY and NANO_LASTLINE_KEY,
and make sure statusbar input handles both them and NANO_HELP_FKEY
properly


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1682 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-04 19:30:53 +00:00
David Lawrence Ramsey
a619ae69bf Tom Bates' nsr-tandem-nsk port, plus a few tweaks of mine, take 2
(according to comments, including floss.h in nano.h does work)


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1681 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-04 06:33:52 +00:00
David Lawrence Ramsey
8911e235ba revert the tweaked nsr-tandem-nsk port for now, pending further comment
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1680 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-03 06:00:22 +00:00
David Lawrence Ramsey
ce364e2a57 minor capitalization fixes
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1679 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-03 01:25:46 +00:00
David Lawrence Ramsey
ea43a1dbca cosmetic #ifdef tweak
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1678 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-02 22:52:57 +00:00
David Lawrence Ramsey
b34c683f3f Tom Bates' nsr-tandem-nsk port, plus a few tweaks of mine
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1677 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-03-02 21:31:31 +00:00
David Lawrence Ramsey
ba7b1681a2 set the associated function for unjustify to 0 instead of
do_uncut_text(), since it's currently unused


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1676 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-29 20:07:14 +00:00
David Lawrence Ramsey
588ca6b79e fix typo
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1675 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-28 16:30:28 +00:00
David Lawrence Ramsey
04e42a6bcc Martin Ehmsen's backup directory patch, with a few minor changes
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1674 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-28 16:24:31 +00:00
David Lawrence Ramsey
6a2877d399 add another blank line
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1673 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-28 02:08:15 +00:00
David Lawrence Ramsey
81e157cd38 fix too-long line
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1672 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-28 01:58:21 +00:00
David Lawrence Ramsey
807681ac7e add blank line
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1671 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-27 20:50:01 +00:00
David Lawrence Ramsey
281e0563c6 decouple the paragraph searching code and the justification code
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1670 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-27 18:54:04 +00:00
David Lawrence Ramsey
95b7bdbdb0 minor cosmetic fixes
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1669 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-27 03:21:23 +00:00
David Lawrence Ramsey
24ae56cd4b a few minor cleanups
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1668 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-27 03:06:28 +00:00
David Lawrence Ramsey
60b942c64f minor comment fix
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1667 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-26 21:09:28 +00:00
David Lawrence Ramsey
b55e382dfc move the leaveok() calls back to edit_refresh() from update_line()
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1666 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-25 06:25:12 +00:00
David Lawrence Ramsey
3af54d3ff5 remove the redundant filestat() and replace it with stat() in the one
place it's called


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1665 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-25 04:43:27 +00:00
David Lawrence Ramsey
37853fd4ce and update the dates on the documentation
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1664 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-25 04:01:33 +00:00
David Lawrence Ramsey
475a2a7410 clarify the -T/--tabsize option in the documentation too
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1663 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-25 03:58:46 +00:00
David Lawrence Ramsey
a7c9364641 clarify the description of -T/--tabsize a bit in usage(), and add extra
{}'s to sunder() and unsunder() to make them a bit easier to read


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1662 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-25 03:19:29 +00:00
David Lawrence Ramsey
f5300af90a only include time.h in winio.c if NANO_EXTRA is defined, since we only
need it for nanosleep() in do_credits()


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1661 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-24 20:48:12 +00:00
David Lawrence Ramsey
1044d74fd3 add DB's refactored search code and a few of his minor display code
changes, plus a few minor search and display fixes of mine


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1660 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-24 20:41:39 +00:00
Jordi Mallach
656dd9c7eb Updated Malay translation by Sharuzzaman Ahmat Raslan.
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1657 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-24 14:01:20 +00:00
David Lawrence Ramsey
369732ff81 handle pending sigwinches better, etc.
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1652 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-16 20:32:40 +00:00
David Lawrence Ramsey
795a16b959 add more intuitive Meta-key aliases for ^W^W and ^W^O
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1651 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-07 05:03:25 +00:00
David Lawrence Ramsey
b7e5cf6538 fix comment inaccuracy
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1650 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-07 03:39:48 +00:00
David Lawrence Ramsey
d390dd8ea7 minor cosmetic fix
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1649 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-07 03:38:02 +00:00
David Lawrence Ramsey
815cba87e5 forgot a cast
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1648 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-07 03:07:01 +00:00
David Lawrence Ramsey
cb34a67ea1 make the saving of marked status in open_files->file_flags work properly
again; a tweak to the ISSET() macro in 1.3.0 to make it only return 0 or
1 broke it


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1647 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-06 21:20:05 +00:00
David Lawrence Ramsey
ee383dbd6c get_verbatim_kbinput() should use an int*, not a char*, for consistency
with get_kbinput()


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1646 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-06 03:07:10 +00:00
David Lawrence Ramsey
1bc9219beb one last minor comment fix
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1645 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-03 17:36:55 +00:00
David Lawrence Ramsey
00c2054780 don't allow verbatim input in view mode
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1644 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-02-01 06:27:59 +00:00
David Lawrence Ramsey
250267777c minor comment clarification
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1643 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-31 16:43:20 +00:00
David Lawrence Ramsey
be66a6b078 fix minor FAQ inaccuracy
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1642 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-30 21:31:57 +00:00
David Lawrence Ramsey
53809440f3 and switch to cbreak mode in handle_sigwinch() too
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1641 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-30 04:29:52 +00:00
David Lawrence Ramsey
273d2ce2d5 set keypad() to TRUE in handle_sigwinch() in case we resize during
verbatim input, and fix backwards _POSIX_VDISABLE #ifdefs so that raw()
and cbreak() are called properly in get_verbatim_kbinput()


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1640 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-30 04:20:28 +00:00
David Lawrence Ramsey
c91696e6df add function key alias for unjustify
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1639 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-29 04:16:23 +00:00
David Lawrence Ramsey
d03216a1ac use raw mode in get_verbatim_kbinput(), so that we don't have to deal
with interrupt-generating keys there


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1638 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-28 18:21:21 +00:00
David Lawrence Ramsey
58f6d836d9 set keypad() to FALSE while reading in verbatim input, to deal with a
bit of xterm weirdness, and update a few keypad-related comments


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1637 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-27 07:12:47 +00:00
David Lawrence Ramsey
2897d2b8b8 actually block SIGQUIT in signal_init()
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1636 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-26 20:56:20 +00:00
David Lawrence Ramsey
0ee54d9fb2 comment accuracy fix
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1635 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-26 20:18:52 +00:00
David Lawrence Ramsey
1eadebe21f minor capitalization fix
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1634 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-25 21:36:38 +00:00
David Lawrence Ramsey
35961c4252 add the ability to spell-check only marked text when the mark is on
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1633 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-23 19:34:03 +00:00
David Lawrence Ramsey
c2c5a51e52 add support for escape sequences for F1-F14 where conflicts don't occur
(and resurrect abcd() to make that job easier), additional comments, and
a few minor cosmetic cleanups


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1632 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-23 19:26:17 +00:00
David Lawrence Ramsey
66081d4e70 consistency tweak for get_page_start()
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1631 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-22 07:25:31 +00:00
David Lawrence Ramsey
fdece4621f add explanatory comment to do_credits()
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1630 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-19 18:15:03 +00:00
David Lawrence Ramsey
250613665f don't use "kbinput = wgetch(win)" as a switch value in
get_accepted_kbinput()


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1629 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-16 19:12:46 +00:00
David Lawrence Ramsey
70bd6e0dcb and document my tweak to do_writeout() from before
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1628 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-15 16:08:42 +00:00
David Lawrence Ramsey
41151ac50d add DB's fix for a do_replace_loop() segfault
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1627 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-15 05:47:03 +00:00
David Lawrence Ramsey
3e3fab5a0f wrt DB's overhaul of the cutting code and related file-writing code:
document the changes to the latter (in write_file() and do_writeout())
in the Changelog; I stupidly forgot to do this before


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1626 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-15 05:12:41 +00:00
David Lawrence Ramsey
62187d9ced remove other spurious "L"
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1625 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-14 22:45:05 +00:00
David Lawrence Ramsey
9da0831dbf remove spurious "L"
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1624 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-14 22:40:38 +00:00
David Lawrence Ramsey
e97c8d5918 use nanosleep() instead of usleep(); the latter is only standard under
BSD, whereas the former is POSIX compliant


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1623 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-14 19:26:29 +00:00
David Lawrence Ramsey
9591ee5d0a typo fix
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1622 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-14 16:51:06 +00:00
David Lawrence Ramsey
760a2dc9b2 if color support is enabled, we only need to call edit_refresh() to
properly paint multi-line color regexes when COLOR_SYNTAX is set


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1621 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-14 06:38:00 +00:00
David Lawrence Ramsey
c53a92d973 on systems that need raw(), call it once instead of every time through
the input/output loop in main()


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1620 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-12 03:28:06 +00:00
David Lawrence Ramsey
d5be947021 remove a few more unneeded spaces
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1619 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-10 06:12:04 +00:00
David Lawrence Ramsey
f0b3009400 minor fixes for the README
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1618 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-10 06:02:05 +00:00
David Lawrence Ramsey
606dfda47a Back to CVS
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1617 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
2004-01-09 23:26:54 +00:00
22 changed files with 2099 additions and 1627 deletions

302
ChangeLog
View File

@@ -1,3 +1,283 @@
GNU nano 1.3.2 - 2004.03.31
- General:
- 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)
- 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
changed accordingly. Also remove extraneous references to
NANO_DOWN_KEY in the search history shortcut entries. (DLR)
- Add NANO_UNJUSTIFY_FKEY (the same as NANO_UNCUT_FKEY) to the
shortcut list, and tweak the unjustify routine to use it.
Also add NANO_FIRSTLINE_FKEY and NANO_LASTLINE_FKEY, and tweak
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
waiting for input from the user. New function
allow_pending_sigwinch(); changes to signal_init(),
get_kbinput(), and get_verbatim_kbinput(). (DLR)
- Decouple the paragraph searching code and the justifying code.
Removed function do_para_operation(); new function
do_para_search(); changes to do_justify(). (DLR)
- Add -E/--backupdir option. When used with -B/--backup, backup
files will be saved in the specified directory with their
canonical pathnames encoded in their names (all '/'s replaced
with '!'s). Changes to write_file(). (Martin Ehmsen) DLR:
Add function init_backup_dir() to handle relative paths
correctly, use get_full_path() to get the canonical pathname,
and use tail() to get the filename if get_full_path() fails.
- Port to the Tandem NonStop Kernel (nsr-tandem-nsk). (Tom
Bates; minor tweaks by DLR)
- Change some instances of boolean 0 and 1 to TRUE and FALSE.
(David Benbennick)
- Fix memory corruption problem occurring when answer is used as
the value of def; if the realloc() of answer leads to its
pointing to a different memory block, there will be a segfault
when the value of def is copied into it via strcpy().
(bort@alltel.net, Christian Weisgarber, David Benbennick, and
DLR)
- Remove the last editbot references, to avoid any potential
segfaults related to them. Also remove fix_editbot(), as it's
no longer needed. (David Benbennick)
- Rename several variables to make their use clearer and to
avoid conflicts. (DLR)
- Set the input mode before turning the keypad on. (DLR)
- cut.c:
add_to_cutbuffer()
- Add parameter allow_concat to determine whether we're allowed
to concatenate strings in the cutbuffer. (DLR)
- files.c:
do_insertfile()
- Wrap one reference to NANO_EXTCMD_KEY in a NANO_SMALL #ifdef.
(DLR)
- Save the already-typed answer when switching from "Insert
File" to "Execute Command" mode via Ctrl-X, just in case we
started typing a command before switching. (DLR)
add_open_files()
- Make the saving of marked status in open_files->file_flags
work properly again; a tweak to the ISSET() macro in 1.3.0
to make it only return 0 or 1 broke it. (DLR)
write_marked()
- New function used to write the current marked selection to a
file, split out from do_writeout(). (DLR)
do_writeout()
- Tweak for efficiency. (David Benbennick) DLR: Modify to have
the current answer preserved between toggles again.
filestat()
- Removed, as it is only called in one place and is
redundant. (DLR)
do_browser()
- Replace the filestat() call with an equivalent stat() call.
(DLR)
- global.c:
shortcut_init()
- Only allow verbatim input when we're not in view mode. (DLR)
- Set the associated function for unjustify to 0 instead of
do_uncut_text(), since it's currently unused. (DLR)
- nano.c:
usage()
- Clarify the description for -T/--tabsize a bit. (DLR)
do_verbatim_input()
- Remove the now-unneeded code to disable XON, XOFF, and
suspend, since we now go into raw mode in
get_verbatim_kbinput() and bypass them. (DLR)
do_next_word()
- Simplify and remove references to editbot so as to avoid a
segfault. (David Benbennick)
do_prev_word()
- Simplify and remove references to edittop. (David Benbennick)
do_int_speller(), do_alt_speller(), do_spell()
- Modify to write only the current selection from a file to the
temporary file used for spell checking when the mark is on,
and add a few miscellaneous cosmetic cleanups. (DLR)
do_int_spell_fix()
- Store the value of current_x in a size_t instead of an int,
and add a few minor efficiency tweaks. (David Benbennick)
- Remove comment explaining why findnextstr() is called with
bracket_mode set to TRUE even though we aren't doing a bracket
search, since after the above efficiency tweaks, it's now more
accurately called can_display_wrap. (DLR)
indent_length()
- Remove unneeded #ifdef. (David Benbennick)
do_justify()
- Remove references to the now-unneeded JUSTIFY_MODE flag. (DLR)
signal_init()
- Trap SIGQUIT in addition to turning it off via termios in
main(). This is consistent with SIGINT, which we trap here
and turn off via termios in main(), as well as with the
associated comment. (DLR)
handle_sigwinch()
- Set keypad() to TRUE and switch to cbreak mode just before
calling siglongjmp(), in case we resized during verbatim
input. (DLR)
main()
- Move the call to raw() on systems that don't define
_POSIX_VDISABLE outside the main input/output loop, as it
doesn't need to be called every time through the loop. Call it
instead of cbreak() on such systems, as it overrides cbreak()
anyway. (DLR)
- Add more descriptive comments explaining the termios and
curses setup routines, and turn the keypad on before setting
the input mode. (DLR)
- Remove stray HAVE_GETOPT_LONG #ifdefs. (DLR)
- Don't call keypad() before initializing the windows it needs
via window_init().
- nano.h:
- Move the NANO_H include guard up before the first #include.
(DLR)
- Remove the now-unneeded JUSTIFY_MODE flag. (DLR)
- search.c:
regexp_cleanup()
- Only do anything if REGEXP_COMPILED is set. (David Benbennick)
search_abort()
- Only test if the mark is set when NANO_SMALL isn't defined.
(David Benbennick)
search_init()
- Add some more comments and comment tweaks, don't indicate that
the search has been canceled when we enter a blank string in
replace mode, only call regexp_init() when USE_REGEXP is set,
and return -1 instead of -3 since a canceled search and a
canceled replace should be mostly equivalent. (David
Benbennick) DLR: Tweak to use the old behavior if we try to
search for invalid regexes.
findnextstr()
- Refactor to use a loop invariant, and tweak for greater
efficiency and simplicity. Also modify so that all searches
start one character after (or before, if we're doing a
backwards search) the current one, as opposed to all searches
except for regex searches for "^" and the like, for
consistency with other searches. (David Benbennick)
do_search()
- Handle search_init()'s no longer returning -3 above. (David
Benbennick)
- Port the code from do_replace_loop() to skip the current line
if we're searching for a regex with "^" and/or "$" in it and
end up on the same line to this function. This fixes a
problem where doing a forward search for "^" on a file with
more than one line would erroneously stop at the magicline and
indicate that that was the only occurrence. (DLR)
do_research()
- Port David Benbennick's efficiency tweaks and the
aforementioned code ported from do_replace_loop() to this
function. (DLR)
replace_regexp()
- Completely refactor for increased efficiency. (David
Benbennick)
replace_line()
- Use a char* parameter for the replacement string instead of
last_search, and add minor efficiency tweaks. (David
Benbennick)
do_replace_loop()
- Fix segfault when doing a regex replace of a string that
matches inside a line (e.g. replace the "b" in "abc" with
anything). (David Benbennick)
- If the mark is on at the beginning of the functio, turn it off
and turn it back on just before returning. Also overhaul to
rely on the return value of findnextstr() instead of a loop
invariant, to not need to take an int* parameter, and store
the beginning x-coordinate in a size_t instead of an int.
(David Benbennick)
do_replace()
- Handle search_init()'s no longer returning -3 above, and add
efficiency tweaks. (David Benbennick) DLR: Tweak to follow
the old behavior of adding non-blank strings entered at the
"Replace: " prompt to the search history. (DLR)
do_gotoline()
- Simplify the edit_update() call depending on the value of
save_pos. (David Benbennick)
do_bracket()
- Add efficiency tweaks. (David Benbennick) DLR: Remove
reliance on the hardcoded bracket string length; instead, only
require that the bracket string length be even.
- utils.c:
regexec_safe()
- Wrap in HAVE_REGEX_H #ifdefs. (DLR)
regexp_bol_or_eol()
- New function used to check if a regex contains "^" and/or "$",
assuming that the regex would be found if the REG_NOT(BOL|EOL)
flags aren't used in the regexec() call; it replaces the
direct regexec()s used before. (DLR)
strstrwrapper()
- Refactor for increased efficiency, and eliminate the need for
the line_pos parameter. (David Benbennick)
mallocstrcpy()
- Tweak so that when src is "", "" is allocated and returned
instead of NULL. (David Benbennick)
- winio.c:
get_verbatim_kbinput()
- Set keypad() to FALSE and switch to raw mode while reading
input, and set it back to TRUE and go back into cbreak mode
mode afterwards. (Note that if _POSIX_VDISABLE isn't defined,
we don't need to change to or from raw mode since we're
already in it exclusively.) This ensures that we don't end up
reading in extended keypad values that are outside the ASCII
range or having to deal with interrupt-generating key values.
Also, with keypad() set to TRUE, xterm generates KEY_BACKSPACE
when the user hits Ctrl-H, which, when cut down to ASCII
range, ends up being Ctrl-G, which can be confusing. (DLR)
- For consistency with get_kbinput(), use an int* to store and
return the input instead of a char*, and tweak the functions
that call it to handle this. (DLR)
get_accepted_kbinput()
- 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
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].
(DLR)
get_escape_seq_abcd()
- A resurrected version of the old abcd() function, readded in
order to simplify get_escape_seq_kbinput(). (DLR)
get_mouseinput()
- Interpret shortcut key values slightly more stringently when
ungetch()ing them. (DLR)
strlenpt()
- Properly cast the second parameter of the strnlenpt() call to
size_t. (DLR)
get_page_start()
- For consistency, tweak so that scrolling always occurs when we
try to move onto the "$" at the end of the line, as opposed to
(a) when we move onto the "$" at the end of the line on the
first page and (b) when we move onto the character just before
the "$" on subsequent pages. (DLR)
reset_cursor()
- Tweak for efficiency. (David Benbennick)
edit_refresh()
- Tweak for efficiency. (David Benbennick)
statusq()
- Rename "tabs" to "allowtabs". (David Benbennick)
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,
if NANO_EXTRA is defined. (DLR)
- Add explanatory comment. (DLR)
- configure.ac:
- Change instances of "int main ()" to "int main(void)". (DLR)
- faq.html:
- Fixed inaccuracy: multibuffer mode was first in nano 1.1.0,
not 1.1.12. (DLR)
- nano.1, nanorc.5, nano.texi
- Clarify the description for -T/--tabsize a bit. (DLR)
- Add -E/--backupdir description. (Martin Ehmsen; minor cosmetic
fixes by DLR)
- nanorc.sample:
- Add backupdir description. (Martin Ehmsen; minor cosmetic
fixes by DLR)
- README:
- Reformat to 72 characters per line, fix wording in one spot,
and fix spacing and capitalization in several spots. (DLR)
- NEWS:
- Capitalization fix. (DLR)
- TODO:
- Clarify the paragraph searching item, and add item for
filename searches in the file browser. (DLR)
GNU nano 1.3.1 - 2004.01.09
- General:
- Minor overhaul and abstraction of the lowest level of mouse
@@ -49,12 +329,26 @@ GNU nano 1.3.1 - 2004.01.09
as being outside the operating directory when tab completion
is being used, and cosmetic cleanups. (David Benbennick)
copy_file()
- New function containing part of the functionality formerly in
- New function used to create a copy of a file, split out from
do_writeout(). (David Benbennick)
write_file()
- Completely overhauled to properly ignore appending/prepending
to symlinks when NOFOLLOW_SYMLINKS is defined, to properly
support writing a selection to a file under the changed
cutting code, to have more concise error messages, to add
various cleanups, and so on. (David Benbennick)
do_writeout()
- Prompt the user if we're trying to save an existing file (and
not just a selection of it) under a different name. (DLR;
suggested by Jean-Philippe Guérard)
- Overhaul the code used to write a selection of a file to
temporarily set fileage and filebot to the top and bottom of
the selection and then call write_file(), instead of following
the old hackish behavior with cut_marked_segment() (which
won't work after the cutting code changes anyway). (David
Benbennick) DLR: Tweak to not add an extra blank line to the
end of the written selection if the cursor is at the beginning
of the last line of the selection.
open_prevfile(), open_nextfile()
- For consistency with the rest of the multibuffer code, change
"No more open files" to "No more open file buffers". (DLR)
@@ -250,8 +544,8 @@ GNU nano 1.3.0 - 2003.10.22
interpreted as Ctrl-[character], and the support for Pico's
Esc Esc [three-digit decimal ASCII code] input method. (DLR)
do_mark()
- Toggle MARK_ISSET() at the beginning of the function instead
of setting it in one place and unsetting it in another place.
- Toggle MARK_ISSET at the beginning of the function instead of
setting it in one place and unsetting it in another place.
(David Benbennick)
do_suspend()
- Use handle_hupterm() to handle SIGHUP and SIGTERM so we can
@@ -533,7 +827,7 @@ GNU nano 1.1.99pre3 - 2003.02.13
- files.c:
cwd_tab_completion()
- Memory leak fix (David Benbennick).
intput_tab()
input_tab()
- Fix assumption that matches is null terminated (David
Benbennick).
load_history()

15
NEWS
View File

@@ -1,3 +1,16 @@
2004.03.31 - GNU nano 1.3.2 is prepared for the void. New features in
this release include the ability to spell-check only
marked text and the ability to save all backup files in
a specified directory instead of wherever the original
files are. Bug fixes include a fix for a segfault when
replacing certain regular expressions, fixes for some
misbehavior when doing searches, minor fixes to verbatim
input mode and keyboard input in general, better
handling of window resizes at certain times, and
allowing the mark to be saved properly again when
switching between multiple file buffers. nano has also
been ported to the Tandem NonStop Kernel. Have fun.
2004.01.09 - GNU nano 1.3.1 is outside the gates. This release
features, among other things, fixes for the input
routines to deal with some problems they had, a
@@ -199,7 +212,7 @@
support is enabled, and nano is now built with (and
requires for rebuilding) autoconf 2.5.
This release also includes fixes for some memory
leaks, detecting DOS and mac file format, justification,
leaks, detecting DOS and Mac file format, justification,
suspending keys, search & replace under various
conditions, variable width for shortcuts, and the usual
ton of translation updates.

45
README
View File

@@ -7,19 +7,20 @@ Overview
wonderfully easy-to-use and friendly Pico text editor.
First and foremost is its license: the Pine suite does not use the
GPL or a GPL-friendly license, and has unclear restrictions on
redistribution. Because of this, Pine and Pico are not included with
many GNU/Linux distributions. Also, other features (like goto line
number or search and replace) were unavailable until recently or
require a command line flag. Yuck.
GPL or a GPL-friendly license, and has unclear restrictions on
redistribution. Because of this, Pine and Pico are not included
with many GNU/Linux distributions. Also, other features (like goto
line number or search and replace) were unavailable until recently
or require a command line flag. Yuck.
nano aims to solve these problems by emulating the functionality of
Pico as closely as possible while addressing the problems above and
perhaps providing other extra functionality.
The nano editor is now an official GNU package. For more information
on GNU and the Free Software Foundation please see http://www.gnu.org.
The nano editor is now an official GNU package. For more
information on GNU and the Free Software Foundation please see
http://www.gnu.org.
How to compile and install nano
Download the nano source code, then:
@@ -28,37 +29,41 @@ How to compile and install nano
./configure
make
make install
It's that simple. Use --prefix with configure to override the
It's that simple. Use --prefix with configure to override the
default installation directory of /usr/local.
Web Page
http://www.nano-editor.org
Mailing List and Bug Reports
Savannah hosts all the nano-related mailing-lists.
+ info-nano@gnu.org is a very low traffic list
used to announce new Nano versions or other important information
about the project.
used to announce new nano versions or other important
information about the project.
+ help-nano@gnu.org is for those seeking to get help without
wanting to hear about the technical details of its
development.
+ nano-devel@gnu.org is the list used by the people
that make Nano and a general development discussion list, with
that make nano and a general development discussion list, with
moderate traffic.
To subscribe, send email to nano-<name>-request@gnu.org
with a subject of "subscribe", where <name> is the list you want to
To subscribe, send email to nano-<name>-request@gnu.org with a
subject of "subscribe", where <name> is the list you want to
subscribe to.
For general bug reports, send a description of the problem to
nano@nano-editor.org or directly to the development list.
Current Status
GNU nano has reaching its second major milestone, 1.2.x. Development
of new features will continue in the 1.3.x branch, while 1.2.x
versions will be dedicated to bugfixing and polishing.
GNU nano has reached its second major milestone, 1.2.x.
Development of new features will continue in the 1.3.x branch,
while 1.2.x versions will be dedicated to bugfixing and
polishing.
Chris Allegretta (chrisa@asty.org)

5
TODO
View File

@@ -3,12 +3,13 @@ TODO file (? means the feature may be implemented, but not definitely)
For version 1.4:
- UTF-8 support.
- Support for Pico's paragraph searching ability. [DONE]
- Support for paragraph searches. [DONE]
- Support for filename searches in the file browser.
- Undo/Redo key?
- Rebindable keys?
- Keystroke to implement "Add next sequence as raw" like vi's ^V.
[DONE for edit window, needs to be done for statusbar prompt]
- Spell check selected text only.
- Spell check selected text only. [DONE]
- Make "To line" (^W^T) and "Read from Command" (^R^X) re-enter their
parent menu when their keystroke is entered a second time (^W^T^T and
(^R^X^X)(requires figuring out when to keep cursor pos and when not

View File

@@ -19,7 +19,7 @@
#
# $Id$
AC_INIT([GNU nano], [1.3.1], [nano-devel@gnu.org], [nano])
AC_INIT([GNU nano], [1.3.2], [nano-devel@gnu.org], [nano])
AC_CONFIG_SRCDIR([src/nano.c])
AM_INIT_AUTOMAKE
AM_CONFIG_HEADER([config.h:config.h.in])
@@ -43,7 +43,7 @@ AC_CHECK_HEADER(regex.h,
AC_TRY_RUN([
#include <sys/types.h>
#include <regex.h>
int main () { regex_t reg; size_t n = 1; regmatch_t r; regcomp(&reg, "\\<", 0); regexec(&reg, "", n, &r, 0); regfree(&reg); return 0; }],
int main(void) { regex_t reg; size_t n = 1; regmatch_t r; regcomp(&reg, "\\<", 0); regexec(&reg, "", n, &r, 0); regfree(&reg); return 0; }],
AC_MSG_RESULT(no),
AC_MSG_RESULT(yes); AC_DEFINE(BROKEN_REGEXEC, 1, [Define this if your regexec() function segfaults when passed an empty string under certain conditions.])
)
@@ -201,7 +201,7 @@ AC_ARG_WITH(slang,
AC_TRY_RUN([
#include <stdio.h>
#include <slcurses.h>
int main () { SLtt_initialize (NULL); return 0; }],
int main(void) { SLtt_initialize(NULL); 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
@@ -223,7 +223,7 @@ int main () { SLtt_initialize (NULL); return 0; }],
AC_TRY_RUN([
#include <stdio.h>
#include <slcurses.h>
int main () { SLtt_initialize (NULL); return 0; }],
int main(void) { SLtt_initialize(NULL); 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
@@ -240,7 +240,7 @@ int main () { SLtt_initialize (NULL); return 0; }],
AC_TRY_RUN([
#include <stdio.h>
#include <slcurses.h>
int main () { SLtt_initialize (NULL); return 0; }],
int main(void) { SLtt_initialize(NULL); 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

View File

@@ -79,7 +79,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 &quot;establishes a full duplex terminal connection to a remote host&quot;, 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.1. 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.3.2. 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.2/nano.1.html">here</a>.</p></blockquote>
<hr width="100%">
@@ -158,7 +158,7 @@
<b>--enable-multibuffer</b> Enables having multiple file buffers open
<b>--enable-all</b> Enables all of the above features</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.12 or newer, and you must have configured nano with <b>--enable-multibuffer</b> or <b>--enable-extra</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> or <b>--enable-extra</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-&lt;</b> and <b>Meta-&gt;</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 &quot;Close&quot;, instead of the normal &quot;Exit&quot; 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 &quot;Verbatim input&quot;.) Then press the key(s) that generate the character you want.</p>
@@ -241,6 +241,7 @@
<h2><a name="8"></a>8. ChangeLog</h2>
<blockquote>
<p>
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 &quot;set pico&quot; (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>

View File

@@ -6,7 +6,7 @@
.\" Public License for copying conditions. There is NO warranty.
.\"
.\" $Id$
.TH NANO 1 "version 1.3.1" "January 09, 2004"
.TH NANO 1 "version 1.3.2" "March 31, 2004"
.\" Please adjust this date whenever revising the manpage.
.\"
@@ -42,6 +42,10 @@ filename suffixed with a ~.
.B \-D (\-\-dos)
Write file in DOS format.
.TP
.B \-E \fIdir\fP (\-\-backupdir=\fIdir\fP)
Set the directory where \fBnano\fP puts the backup files if file backups
are enabled.
.TP
.B \-F (\-\-multibuffer)
Enable multiple file buffers, if available.
.TP
@@ -77,8 +81,8 @@ Enable regular expression matching for search strings, as well as
Enable smooth scrolling. Text will scroll line-by-line, instead of the
usual chunk-by-chunk behavior.
.TP
.B \-T \fInum\fP (\-\-tabsize=\fInum\fP)
Set the size (width) of a tab.
.B \-T \fIcols\fP (\-\-tabsize=\fIcols\fP)
Set the size (width) of a tab to \fIcols\fP columns.
.TP
.B \-V (\-\-version)
Show the current version number and author.
@@ -100,8 +104,8 @@ acts like Delete on your system.
Display a summary of command line options.
.TP
.B \-i (\-\-autoindent)
Indent new lines to the previous line's indentation. Useful when editing
source code.
Indent new lines to the previous line's indentation. Useful when
editing source code.
.TP
.B \-k (\-\-cut)
Enable cut from cursor to end of line with ^K.

View File

@@ -5,7 +5,7 @@
.\" Public License for copying conditions. There is NO warranty.
.\"
.\" $Id$
.TH NANORC 5 "version 1.3.1" "January 09, 2004"
.TH NANORC 5 "version 1.3.2" "March 31, 2004"
.\" Please adjust this date whenever revising the manpage.
.\"
.SH NAME
@@ -47,6 +47,10 @@ Use auto-indentation.
Create backup files in
.IR filename~ .
.TP
\fBset backupdir "\fIdirectory\fP"\fP
Set the directory where \fBnano\fP puts the backup files if file backups
are enabled.
.TP
\fBset/unset const\fP
Constantly display the cursor position in the status bar.
.TP
@@ -115,8 +119,8 @@ calls \fIspell\fP.
Allow nano to be suspended with ^Z.
.TP
\fBset tabsize \fIn\fP\fP
Use a tab size of \fIn\fP instead of the default (8); must be greater
than 0.
Use a tab size of \fIn\fP columns instead of the default (8); must be
greater than 0.
.TP
\fBset/unset tempfile\fP
Save automatically on exit, don't prompt.

View File

@@ -14,6 +14,9 @@
## Backup files to filename~
# set backup
## The directory to put the backup files in.
# set backupdir ""
## Constantly display the cursor position in the status bar.
# set const

View File

@@ -8,8 +8,8 @@
@c Run `makeinfo' rather than `texinfo-format-buffer'.
@smallbook
@set EDITION 0.1
@set VERSION 1.3.1
@set UPDATED 09 Jan 2004
@set VERSION 1.3.2
@set UPDATED 31 Mar 2004
@dircategory Editors
@direntry
@@ -23,7 +23,7 @@
@titlepage
@title GNU @code{nano}
@subtitle a small and friendly text editor.
@subtitle version 1.3.1
@subtitle version 1.3.2
@author Chris Allegretta
@page
@@ -114,6 +114,10 @@ filename suffixed with a ~.
@item -D, --dos
Write file in DOS format.
@item -E, --backupdir=[dir]
Set the directory where @code{nano} puts the backup files if file
backups are enabled.
@item -F, --multibuffer
Enable multiple file buffers, if available.
@@ -143,8 +147,8 @@ Turn on regular expression search and search/replace.
@item -S, --smooth
Enable smooth scrolling.
@item -T [num], --tabsize=[num]
Set the displayed tab length to [num] columns.
@item -T [num], --tabsize=[#cols]
Set the displayed tab length to [#cols] columns.
@item -V, --version
Print the version number and copyright and quit.

View File

@@ -1,3 +1,7 @@
2004-02-24 Jordi Mallach <jordi@gnu.org>
* ms.po: Updated Malay translation by Sharuzzaman Ahmat Raslan.
2003-11-25 Jordi Mallach <jordi@gnu.org>
* ro.po: Updated Romanian translation by Laurentiu Buzdugan.
@@ -48,7 +52,7 @@
2003-05-06 Jordi Mallach <jordi@gnu.org>
* ms.po: Malay translation by Sharuzzaman Ahmat Raslan.
* ms.po: Updated Malay translation by Sharuzzaman Ahmat Raslan.
2003-04-24 Jordi Mallach <jordi@gnu.org>

247
po/ms.po
View File

@@ -1,20 +1,19 @@
# Nano Editor Bahasa Melayu.
# Copyright (C) 2002 Free Software Foundation, Inc.
# Sharuzzaman Ahmat Raslan <sharuzzaman@myrealbox.com>, 2002.
# Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
# Sharuzzaman Ahmat Raslan <sharuzzaman@myrealbox.com>, 2002, 2003, 2004.
#
msgid ""
msgstr ""
"Project-Id-Version: nano 1.2.1\n"
"Project-Id-Version: nano 1.2.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2003-08-11 21:49-0400\n"
"PO-Revision-Date: 2003-05-06 00:51GMT+8\n"
"PO-Revision-Date: 2004-02-24 00:51GMT+8\n"
"Last-Translator: Sharuzzaman Ahmat Raslan <sharuzzaman@myrealbox.com>\n"
"Language-Team: Malay <translation-team-ms@lists.sourceforge.net>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: KBabel 0.9.5\n"
#: files.c:317
#, c-format
@@ -734,27 +733,18 @@ msgstr "Kekunci tidak sah dalam mod LIHAT"
msgid ""
"Search Command Help Text\n"
"\n"
" Enter the words or characters you would like to search for, then hit "
"enter. If there is a match for the text you entered, the screen will be "
"updated to the location of the nearest match for the search string.\n"
" Enter the words or characters you would like to search for, then hit enter. If there is a match for the text you entered, the screen will be updated to the location of the nearest match for the search string.\n"
"\n"
" The previous search string will be shown in brackets after the Search: "
"prompt. Hitting Enter without entering any text will perform the previous "
"search.\n"
" The previous search string will be shown in brackets after the Search: prompt. Hitting Enter without entering any text will perform the previous search.\n"
"\n"
" The following function keys are available in Search mode:\n"
"\n"
msgstr ""
"Teks Bantuan Arahan Carian\n"
"\n"
" Masukkan perkataan atau aksara yang anda hendak cari, kemudian tekan "
"enter. Jika terdapat padanan untuk teks yang anda masukkan, skrin akan "
"dikemaskinikan kepada lokasi terdekat padanan terhampir rentetan carian "
"tersebut.\n"
" Masukkan perkataan atau aksara yang anda hendak cari, kemudian tekan enter. Jika terdapat padanan untuk teks yang anda masukkan, skrin akan dikemaskinikan kepada lokasi terdekat padanan terhampir rentetan carian tersebut.\n"
"\n"
" Rentetan carian terdahulu akan dipaparkan dalam kurungan selepas prom "
"Cari:. Menekan Enter tanpa memasukkan apa-apa teks akan melaksanakan carian "
"terdahulu.\n"
" Rentetan carian terdahulu akan dipaparkan dalam kurungan selepas prom Cari:. Menekan Enter tanpa memasukkan apa-apa teks akan melaksanakan carian terdahulu.\n"
"\n"
" Kekunci fungsi berikut terdapat didalam mod Cari:\n"
"\n"
@@ -763,18 +753,14 @@ msgstr ""
msgid ""
"Go To Line Help Text\n"
"\n"
" Enter the line number that you wish to go to and hit Enter. If there are "
"fewer lines of text than the number you entered, you will be brought to the "
"last line of the file.\n"
" Enter the line number that you wish to go to and hit Enter. If there are fewer lines of text than the number you entered, you will be brought to the last line of the file.\n"
"\n"
" The following function keys are available in Go To Line mode:\n"
"\n"
msgstr ""
"Teks Bantuan Pergi Ke Baris\n"
"\n"
" Masukkan nombor baris yang anda hendak pergi dan tekan Enter. Jika "
"terdapat kurang baris teks daripada nombor yang anda masukkan, anda akan "
"dibawa ke baris akhir fail tersebut.\n"
" Masukkan nombor baris yang anda hendak pergi dan tekan Enter. Jika terdapat kurang baris teks daripada nombor yang anda masukkan, anda akan dibawa ke baris akhir fail tersebut.\n"
"\n"
" Kekunci fungsi berikut terdapat didalam mod Pergi Ke Baris:\n"
"\n"
@@ -783,33 +769,22 @@ msgstr ""
msgid ""
"Insert File Help Text\n"
"\n"
" Type in the name of a file to be inserted into the current file buffer at "
"the current cursor location.\n"
" Type in the name of a file to be inserted into the current file buffer at the current cursor location.\n"
"\n"
" If you have compiled nano with multiple file buffer support, and enable "
"multiple buffers with the -F or --multibuffer command line flags, the Meta-F "
"toggle, or a nanorc file, inserting a file will cause it to be loaded into a "
"separate buffer (use Meta-< and > to switch between file buffers).\n"
" If you have compiled nano with multiple file buffer support, and enable multiple buffers with the -F or --multibuffer command line flags, the Meta-F toggle, or a nanorc file, inserting a file will cause it to be loaded into a separate buffer (use Meta-< and > to switch between file buffers).\n"
"\n"
" If you need another blank buffer, do not enter any filename, or type in a "
"nonexistent filename at the prompt and press Enter.\n"
" If you need another blank buffer, do not enter any filename, or type in a nonexistent filename at the prompt and press Enter.\n"
"\n"
" The following function keys are available in Insert File mode:\n"
"\n"
msgstr ""
"Teks Bantuan Sisipan Fail\n"
"\n"
" Taip nama fail yang hendak disisipkan ke dalam buffer fail semasa di "
"kedudukan kursor semasa.\n"
" Taip nama fail yang hendak disisipkan ke dalam buffer fail semasa di kedudukan kursor semasa.\n"
"\n"
" Jika anda telah menghimpun nano dengan sokongan buffer fail berganda, dan "
"menghidupkan buffer berganda dengan penanda baris arahan -F atau --"
"multibuffer, Meta-F toggle, atau fail nanorc, menyisipkan fail akan "
"menyebabkannya dimuatkan ke dalam buffer berlainan (guna Meta-< dan > untuk "
"menukar diantara buffer fail).\n"
" Jika anda telah menghimpun nano dengan sokongan buffer fail berganda, dan menghidupkan buffer berganda dengan penanda baris arahan -F atau --multibuffer, Meta-F toggle, atau fail nanorc, menyisipkan fail akan menyebabkannya dimuatkan ke dalam buffer berlainan (guna Meta-< dan > untuk menukar diantara buffer fail).\n"
"\n"
" Jika anda memerlukan buffer kosong tambahan, jangan masukkan sebarang "
"namafail, atau taip namafail yang tidak wujud pada prom dan tekan Enter.\n"
" Jika anda memerlukan buffer kosong tambahan, jangan masukkan sebarang namafail, atau taip namafail yang tidak wujud pada prom dan tekan Enter.\n"
"\n"
" Kekunci fungsi berikut terdapat didalam mod Sisipan Fail:\n"
"\n"
@@ -818,26 +793,18 @@ msgstr ""
msgid ""
"Write File Help Text\n"
"\n"
" Type the name that you wish to save the current file as and hit Enter to "
"save the file.\n"
" Type the name that you wish to save the current file as and hit Enter to save the file.\n"
"\n"
" If you have selected text with Ctrl-^, you will be prompted to save only "
"the selected portion to a separate file. To reduce the chance of "
"overwriting the current file with just a portion of it, the current filename "
"is not the default in this mode.\n"
" If you have selected text with Ctrl-^, you will be prompted to save only the selected portion to a separate file. To reduce the chance of overwriting the current file with just a portion of it, the current filename is not the default in this mode.\n"
"\n"
" The following function keys are available in Write File mode:\n"
"\n"
msgstr ""
"Teks Bantuan Menulis Fail\n"
"\n"
" Taip nama fail semasa yang anda hendak simpan dan tekan Enter untuk "
"menyimpan fail tersebut.\n"
" Taip nama fail semasa yang anda hendak simpan dan tekan Enter untuk menyimpan fail tersebut.\n"
"\n"
" Jika anda telah memilih teks dengan Ctrl-^, anda akan ditanya untuk "
"menyimpan hanya bahagian dipilih ke dalam fail berasingan. Untuk "
"mengurangkan risiko menulisganti fail semasa dengan hanya sebahagian "
"daripadanya, namafail semasa tidak dijadikan pilihan asal dalam mod ini.\n"
" Jika anda telah memilih teks dengan Ctrl-^, anda akan ditanya untuk menyimpan hanya bahagian dipilih ke dalam fail berasingan. Untuk mengurangkan risiko menulisganti fail semasa dengan hanya sebahagian daripadanya, namafail semasa tidak dijadikan pilihan asal dalam mod ini.\n"
"\n"
" Kekunci fungsi berikut terdapat didalam mod Menulis Fail:\n"
"\n"
@@ -846,22 +813,14 @@ msgstr ""
msgid ""
"File Browser Help Text\n"
"\n"
" The file browser is used to visually browse the directory structure to "
"select a file for reading or writing. You may use the arrow keys or Page Up/"
"Down to browse through the files, and S or Enter to choose the selected file "
"or enter the selected directory. To move up one level, select the directory "
"called \"..\" at the top of the file list.\n"
" The file browser is used to visually browse the directory structure to select a file for reading or writing. You may use the arrow keys or Page Up/Down to browse through the files, and S or Enter to choose the selected file or enter the selected directory. To move up one level, select the directory called \"..\" at the top of the file list.\n"
"\n"
" The following function keys are available in the file browser:\n"
"\n"
msgstr ""
"Teks Bantuan Pelayar Fail\n"
"\n"
" Pelayar fail digunakan untuk melihat secara visual struktur direktori untuk "
"memilih fail untuk membaca dan menulis. Anda boleh menggunakan kekunci "
"panah atau Page Up/Down untuk melihat fail, dan S atau Enter untuk memilih "
"fail atau memasuki direktori yang dipilih. Untuk naik ke atas satu tahap, "
"pilih direktori bernama \"..\" di bahagian atas senarai fail.\n"
" Pelayar fail digunakan untuk melihat secara visual struktur direktori untuk memilih fail untuk membaca dan menulis. Anda boleh menggunakan kekunci panah atau Page Up/Down untuk melihat fail, dan S atau Enter untuk memilih fail atau memasuki direktori yang dipilih. Untuk naik ke atas satu tahap, pilih direktori bernama \"..\" di bahagian atas senarai fail.\n"
"\n"
" Kekunci fungsi berikut terdapat didalam pelayar fail:\n"
"\n"
@@ -872,8 +831,7 @@ msgid ""
"\n"
" Enter the name of the directory you would like to browse to.\n"
"\n"
" If tab completion has not been disabled, you can use the TAB key to "
"(attempt to) automatically complete the directory name.\n"
" If tab completion has not been disabled, you can use the TAB key to (attempt to) automatically complete the directory name.\n"
"\n"
" The following function keys are available in Browser Go To Directory mode:\n"
"\n"
@@ -882,9 +840,7 @@ msgstr ""
"\n"
" Masukkan nama direktori yang anda hendak lihat.\n"
"\n"
" Jika tab pelengkapan tidak dimatikan, anda boleh menggunakan kekunci TAB "
"untuk (mencuba untuk) melengkapkan secara automatik nama direktori "
"tersebut.\n"
" Jika tab pelengkapan tidak dimatikan, anda boleh menggunakan kekunci TAB untuk (mencuba untuk) melengkapkan secara automatik nama direktori tersebut.\n"
"\n"
" Kekunci fungsi berikut terdapat didalam mod Pelayar Pergi ke Direktori:\n"
"\n"
@@ -893,20 +849,14 @@ msgstr ""
msgid ""
"Spell Check Help Text\n"
"\n"
" The spell checker checks the spelling of all text in the current file. "
"When an unknown word is encountered, it is highlighted and a replacement can "
"be edited. It will then prompt to replace every instance of the given "
"misspelled word in the current file.\n"
" The spell checker checks the spelling of all text in the current file. When an unknown word is encountered, it is highlighted and a replacement can be edited. It will then prompt to replace every instance of the given misspelled word in the current file.\n"
"\n"
" The following other functions are available in Spell Check mode:\n"
"\n"
msgstr ""
"Teks Bantuan Penyemak Ejaan\n"
"\n"
" Penyemak ejaan menyemak ejaan semua teks didalam fail semasa. Apabila "
"perkataan yang tidak diketahui dijumpai, ia akan disorot dan penggantinya "
"boleh disunting. Ia kemudian akan bertanya untuk menggantikan setiap "
"jumpaan perkataan salah eja yang diberikan didalam fail semasa.\n"
" Penyemak ejaan menyemak ejaan semua teks didalam fail semasa. Apabila perkataan yang tidak diketahui dijumpai, ia akan disorot dan penggantinya boleh disunting. Ia kemudian akan bertanya untuk menggantikan setiap jumpaan perkataan salah eja yang diberikan didalam fail semasa.\n"
"\n"
" Fungsi lain berikut terdapat didalam mod Penyemak Ejaan:\n"
"\n"
@@ -915,17 +865,14 @@ msgstr ""
msgid ""
"External Command Help Text\n"
"\n"
" This menu allows you to insert the output of a command run by the shell "
"into the current buffer (or a new buffer in multibuffer mode).\n"
" This menu allows you to insert the output of a command run by the shell into the current buffer (or a new buffer in multibuffer mode).\n"
"\n"
" The following keys are available in this mode:\n"
"\n"
msgstr ""
"Teks Bantuan Arahan Luaran\n"
"\n"
" Menu ini membenearkan anda untuk memasukkan keluaran sesuatu arahan yang "
"dijalankan oleh shell ke dalam buffer semasa (atau satu buffer baru dalam "
"mod multibuffer).\n"
" Menu ini membenearkan anda untuk memasukkan keluaran sesuatu arahan yang dijalankan oleh shell ke dalam buffer semasa (atau satu buffer baru dalam mod multibuffer).\n"
"\n"
" Kekunci berikut terdapat didalam mod ini:\n"
"\n"
@@ -934,38 +881,16 @@ msgstr ""
msgid ""
" 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: The "
"top line shows the program version, the current filename being edited, and "
"whether or not the file 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"
" 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: The top line shows the program version, the current filename being edited, and whether or not the file 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"
" The notation for shortcuts is as follows: Control-key sequences are notated "
"with a caret (^) symbol and are entered with the Control (Ctrl) key. 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. The "
"following keystrokes are available in the main editor window. Alternative "
"keys are shown in parentheses:\n"
" The notation for shortcuts is as follows: Control-key sequences are notated with a caret (^) symbol and are entered with the Control (Ctrl) key. 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. The following keystrokes are available in the main editor window. Alternative keys are shown in parentheses:\n"
"\n"
msgstr ""
" teks bantuan nano\n"
"\n"
" Penyunting nano direka untuk meniru fungsi dan kemudahgunaan penyunting "
"teks UW Pico. Terdapat empat bahagian utama penyunting: Baris teratas "
"menunjukkan versi program, namafail semasa yang sedang disunting, dan adakah "
"fail tersebut telah diubahsuai. Berikutnya adalah tetingkap utama "
"penyunting yang menunjukkan fail yang sedang disunting. Baris status adalah "
"baris ketiga dari bawah dan menunjukkan mesej-mesej penting. Dua baris "
"terbawah menunjukkan pintasan yang sering digunakan dalam penyunting.\n"
" Penyunting nano direka untuk meniru fungsi dan kemudahgunaan penyunting teks UW Pico. Terdapat empat bahagian utama penyunting: Baris teratas menunjukkan versi program, namafail semasa yang sedang disunting, dan adakah fail tersebut telah diubahsuai. Berikutnya adalah tetingkap utama penyunting yang menunjukkan fail yang sedang disunting. Baris status adalah baris ketiga dari bawah dan menunjukkan mesej-mesej penting. Dua baris terbawah menunjukkan pintasan yang sering digunakan dalam penyunting.\n"
"\n"
" Penandaan untuk pintasan adalah seperti berikut: turutan kekunci Control "
"ditandakan dengan simbol caret (^) dan dimasukkan dengan kekunci Control "
"(Ctrl). Turutan kekunci Escape ditandakan dengan simbol Meta (M) dan boleh "
"dimasukkan dengan menggunakan kekunci Esc, Alt atau Meta tergantung pada "
"susunatur papan kekunci anda. Kekunci-kekunci berikut terdapat dalam "
"tetingkap utama penyunting. Kekunci alternatif ditunjukkan dalam kurungan:\n"
" Penandaan untuk pintasan adalah seperti berikut: turutan kekunci Control ditandakan dengan simbol caret (^) dan dimasukkan dengan kekunci Control (Ctrl). Turutan kekunci Escape ditandakan dengan simbol Meta (M) dan boleh dimasukkan dengan menggunakan kekunci Esc, Alt atau Meta tergantung pada susunatur papan kekunci anda. Kekunci-kekunci berikut terdapat dalam tetingkap utama penyunting. Kekunci alternatif ditunjukkan dalam kurungan:\n"
"\n"
#: nano.c:388 nano.c:458
@@ -1271,8 +1196,7 @@ msgstr "Sekarang boleh UnJustify!"
#: nano.c:2696
msgid "Save modified buffer (ANSWERING \"No\" WILL DESTROY CHANGES) ? "
msgstr ""
"Simpan buffer ubahsuai (JAWAB \"Tidak\" AKAN MENGHILANGKAN PERUBAHAN) ? "
msgstr "Simpan buffer ubahsuai (JAWAB \"Tidak\" AKAN MENGHILANGKAN PERUBAHAN) ? "
#: nano.c:2796
msgid "Received SIGHUP or SIGTERM\n"
@@ -1596,108 +1520,3 @@ msgstr "dan sesiapa yang kami lupa...."
#: winio.c:1845
msgid "Thank you for using nano!\n"
msgstr "Terima kasih kerana menggunakan nano!\n"
#~ msgid "add_to_cutbuffer() called with inptr->data = %s\n"
#~ msgstr "add_to_cutbuffer() dipanggil dengan inptr->data = %s\n"
#~ msgid "Blew away cutbuffer =)\n"
#~ msgstr "Cutbuffer dipadamkan =)\n"
#~ msgid "filename is %s\n"
#~ msgstr "nama fail adalah %s\n"
#~ msgid "%s: free'd a node, YAY!\n"
#~ msgstr "%s: sebuah nod dibebaskan, YAY!\n"
#~ msgid "%s: free'd last node.\n"
#~ msgstr "%s: nod terakhir dibebaskan.\n"
#~ msgid "Backing up %s to %s\n"
#~ msgstr "Menyalin %s ke %s\n"
#~ msgid "Wrote >%s\n"
#~ msgstr "Ditulis >%s\n"
#~ msgid "current->data now = \"%s\"\n"
#~ msgstr "current->data sekarang = \"%s\"\n"
#~ msgid "After, data = \"%s\"\n"
#~ msgstr "Setelah, data= \"%s\"\n"
#~ msgid "Main: set up windows\n"
#~ msgstr "Utama: menetapkan tetingkap\n"
#~ msgid "Main: bottom win\n"
#~ msgstr "Utama: tetingkap bawah\n"
#~ msgid "Main: open file\n"
#~ msgstr "Utama: buka fail\n"
#~ msgid "AHA! %c (%d)\n"
#~ msgstr "AHA! %c (%d)\n"
#~ msgid "I got Alt-O-%c! (%d)\n"
#~ msgstr "Saya mendapat Alt-O-%c! (%d)\n"
#~ msgid "I got Alt-[-1-%c! (%d)\n"
#~ msgstr "Saya mendapat Alt-[-1-%c! (%d)\n"
#~ msgid "I got Alt-[-2-%c! (%d)\n"
#~ msgstr "Saya mendapat Alt-[-2-%c! (%d)\n"
#~ msgid "I got Alt-[-%c! (%d)\n"
#~ msgstr "Saya mendapat Alt-[-%c! (%d)\n"
#~ msgid "I got Alt-%c! (%d)\n"
#~ msgstr "Saya mendapat Alt-%c! (%d)\n"
#~ msgid "I got %c (%d)!\n"
#~ msgstr "Saya mendapat %c (%d)!\n"
#~ msgid "Adding new syntax after 1st\n"
#~ msgstr "Menambah sintaks baru selepas yang pertama\n"
#~ msgid "Starting a new syntax type\n"
#~ msgstr "Memulakan jenis sintaks baru\n"
#~ msgid "Starting a new colorstring for fg %d bg %d\n"
#~ msgstr "Memulakan rentetanwarna baru bagi fg %d bg %d\n"
#~ msgid "Adding new entry for fg %d bg %d\n"
#~ msgstr "Menambah kemasukan baru bagi fg %d bg %d\n"
#~ msgid "%s: Read a comment\n"
#~ msgstr "%s: Baca komen\n"
#~ msgid "%s: Parsing option %s\n"
#~ msgstr "%s: Pilihan huraian %s\n"
#~ msgid "set flag %d!\n"
#~ msgstr "set penanda %d!\n"
#~ msgid "unset flag %d!\n"
#~ msgstr "penanda %d di nyahset!\n"
#~ msgid "actual_x for xplus=%d returns %d\n"
#~ msgstr "actual_x untuk xplus=%d mengembalikan %d\n"
#~ msgid "Aha! '%c' (%d)\n"
#~ msgstr "Aha! '%c' (%d)\n"
#~ msgid "input '%c' (%d)\n"
#~ msgstr "masukan '%c' (%d)\n"
#~ msgid "Moved to (%d, %d) in edit buffer\n"
#~ msgstr "Pindah ke (%d, %d) dalam buffer suntingan\n"
#~ msgid "I got \"%s\"\n"
#~ msgstr "Saya dapat \"%s\"\n"
#~ msgid "Dumping file buffer to stderr...\n"
#~ msgstr "Lambak buffer fail ke stderr...\n"
#~ msgid "Dumping cutbuffer to stderr...\n"
#~ msgstr "Lambak cutbuffer ke stderr...\n"
#~ msgid "Dumping a buffer to stderr...\n"
#~ msgstr "Lambak buffer ke stderr...\n"

View File

@@ -45,7 +45,7 @@ filestruct *get_cutbottom(void)
return cutbottom;
}
void add_to_cutbuffer(filestruct *inptr)
void add_to_cutbuffer(filestruct *inptr, int allow_concat)
{
#ifdef DEBUG
fprintf(stderr, "add_to_cutbuffer(): inptr->data = %s\n", inptr->data);
@@ -54,9 +54,9 @@ void add_to_cutbuffer(filestruct *inptr)
if (cutbuffer == NULL)
cutbuffer = inptr;
#ifndef NANO_SMALL
else if (concatenate_cut && !ISSET(JUSTIFY_MODE)) {
else if (allow_concat && concatenate_cut) {
/* Just tack the text in inptr onto the text in cutbottom,
* unless we're backing up lines while justifying text. */
* unless allow_concat is false. */
cutbottom->data = charealloc(cutbottom->data,
strlen(cutbottom->data) + strlen(inptr->data) + 1);
strcat(cutbottom->data, inptr->data);
@@ -207,7 +207,7 @@ int do_cut_text(void)
cutbuffer = NULL;
marked_cut = 0;
#ifndef NANO_SMALL
concatenate_cut = 0;
concatenate_cut = FALSE;
#endif
#ifdef DEBUG
fprintf(stderr, "Blew away cutbuffer =)\n");
@@ -238,7 +238,7 @@ int do_cut_text(void)
junk->data = charalloc(1);
junk->data[0] = '\0';
add_to_cutbuffer(junk);
add_to_cutbuffer(junk, TRUE);
#ifdef DEBUG
dump_buffer(cutbuffer);
#endif
@@ -265,7 +265,7 @@ int do_cut_text(void)
* the first line of any cut done immediately afterward to the
* end of this cut, as Pico does. */
if (current == mark_beginbuf && current_x < strlen(current->data))
concatenate_cut = 1;
concatenate_cut = TRUE;
marked_cut = 1;
edit_refresh();
set_modified();
@@ -279,7 +279,7 @@ int do_cut_text(void)
fileptr = current;
current = current->next;
current->prev = fileptr->prev;
add_to_cutbuffer(fileptr);
add_to_cutbuffer(fileptr, TRUE);
#ifdef DEBUG
dump_buffer(cutbuffer);
#endif
@@ -298,7 +298,7 @@ int do_cut_text(void)
set_modified();
marked_cut = 0;
#ifndef NANO_SMALL
concatenate_cut = 0;
concatenate_cut = FALSE;
#endif
return 1;
}

View File

@@ -62,7 +62,8 @@ void load_file(int update)
#ifdef ENABLE_COLOR
update_color();
edit_refresh();
if (ISSET(COLOR_SYNTAX))
edit_refresh();
#endif
}
@@ -74,7 +75,6 @@ void new_file(void)
fileage->data[0] = '\0';
filebot = fileage;
edittop = fileage;
editbot = fileage;
current = fileage;
current_x = 0;
totlines = 1;
@@ -100,7 +100,8 @@ void new_file(void)
#ifdef ENABLE_COLOR
update_color();
edit_refresh();
if (ISSET(COLOR_SYNTAX))
edit_refresh();
#endif
}
@@ -404,7 +405,7 @@ char *get_next_filename(const char *name)
buf = charalloc(strlen(name) + num_of_digits(INT_MAX) + 2);
strcpy(buf, name);
while (1) {
while (TRUE) {
if (stat(buf, &fs) == -1)
return buf;
@@ -446,20 +447,20 @@ int do_insertfile(int loading_file)
#endif
#ifndef DISABLE_OPERATINGDIR
if (operating_dir != NULL && strcmp(operating_dir, ".") != 0)
if (operating_dir != NULL && strcmp(operating_dir, "."))
#ifdef ENABLE_MULTIBUFFER
if (ISSET(MULTIBUFFER))
i = statusq(1, insertfile_list, inspath,
i = statusq(TRUE, insertfile_list, inspath,
#ifndef NANO_SMALL
0,
NULL,
#endif
_("File to insert into new buffer [from %s] "),
operating_dir);
else
#endif
i = statusq(1, insertfile_list, inspath,
i = statusq(TRUE, insertfile_list, inspath,
#ifndef NANO_SMALL
0,
NULL,
#endif
_("File to insert [from %s] "),
operating_dir);
@@ -468,16 +469,16 @@ int do_insertfile(int loading_file)
#endif
#ifdef ENABLE_MULTIBUFFER
if (ISSET(MULTIBUFFER))
i = statusq(1, insertfile_list, inspath,
i = statusq(TRUE, insertfile_list, inspath,
#ifndef NANO_SMALL
0,
NULL,
#endif
_("File to insert into new buffer [from ./] "));
else
#endif /* ENABLE_MULTIBUFFER */
i = statusq(1, insertfile_list, inspath,
i = statusq(TRUE, insertfile_list, inspath,
#ifndef NANO_SMALL
0,
NULL,
#endif
_("File to insert [from ./] "));
@@ -499,8 +500,12 @@ int do_insertfile(int loading_file)
#endif /* ENABLE_MULTIBUFFER */
if (i == NANO_EXTCMD_KEY) {
int ts = statusq(TRUE, extcmd_list, "", NULL,
char *ans = mallocstrcpy(NULL, answer);
int ts = statusq(TRUE, extcmd_list, ans, NULL,
_("Command to execute"));
free(ans);
if (ts == -1 || answer == NULL || answer[0] == '\0') {
statusbar(_("Cancelled"));
display_main_list();
@@ -522,7 +527,11 @@ int do_insertfile(int loading_file)
#endif
#ifndef DISABLE_OPERATINGDIR
if (i != NANO_EXTCMD_KEY && check_operating_dir(answer, 0) != 0) {
if (
#ifndef NANO_SMALL
i != NANO_EXTCMD_KEY &&
#endif
check_operating_dir(answer, 0) != 0) {
statusbar(_("Can't insert file from outside of %s"),
operating_dir);
return 0;
@@ -582,9 +591,6 @@ int do_insertfile(int loading_file)
#endif
set_modified();
/* Here we want to rebuild the edit window */
fix_editbot();
#ifdef ENABLE_MULTIBUFFER
/* If we've loaded another file, update the titlebar's contents */
if (loading_file) {
@@ -608,10 +614,7 @@ int do_insertfile(int loading_file)
#endif
/* If we've gone off the bottom, recenter; otherwise, just redraw */
if (current->lineno > editbot->lineno)
edit_update(current, CENTER);
else
edit_refresh();
edit_refresh();
} else {
statusbar(_("Cancelled"));
@@ -775,17 +778,24 @@ int add_open_file(int update)
/* save current line number */
open_files->file_lineno = current->lineno;
/* start with default modification status: unmodified (and marking
status, if available: unmarked) */
open_files->file_flags = 0;
/* if we're updating, save current modification status (and marking
status, if available) */
if (update) {
#ifndef NANO_SMALL
open_files->file_flags = (MODIFIED & ISSET(MODIFIED)) | (MARK_ISSET & ISSET(MARK_ISSET));
if (ISSET(MODIFIED))
open_files->file_flags |= MODIFIED;
if (ISSET(MARK_ISSET)) {
open_files->file_mark_beginbuf = mark_beginbuf;
open_files->file_mark_beginx = mark_beginx;
open_files->file_flags |= MARK_ISSET;
}
#else
open_files->file_flags = (MODIFIED & ISSET(MODIFIED));
if (ISSET(MODIFIED))
open_files->file_flags |= MODIFIED;
#endif
}
@@ -1017,7 +1027,7 @@ int close_open_file(void)
}
#endif /* MULTIBUFFER */
#if !defined(DISABLE_SPELLER) || !defined(DISABLE_OPERATINGDIR)
#if !defined(DISABLE_SPELLER) || !defined(DISABLE_OPERATINGDIR) || !defined(NANO_SMALL)
/*
* When passed "[relative path]" or "[relative path][filename]" in
* origpath, return "[full path]" or "[full path][filename]" on success,
@@ -1260,10 +1270,11 @@ void init_operating_dir(void)
if (operating_dir == NULL)
return;
full_operating_dir = get_full_path(operating_dir);
/* If get_full_path() failed or the operating directory is
inaccessible, unset operating_dir. */
* inaccessible, unset operating_dir. */
if (full_operating_dir == NULL || chdir(full_operating_dir) == -1) {
free(full_operating_dir);
full_operating_dir = NULL;
@@ -1290,6 +1301,7 @@ int check_operating_dir(const char *currpath, int allow_tabcomp)
/* If no operating directory is set, don't bother doing anything. */
if (operating_dir == NULL)
return 0;
assert(full_operating_dir != NULL);
fullpath = get_full_path(currpath);
@@ -1322,6 +1334,30 @@ int check_operating_dir(const char *currpath, int allow_tabcomp)
}
#endif
#ifndef NANO_SMALL
void init_backup_dir(void)
{
char *full_backup_dir;
if (backup_dir == NULL)
return;
full_backup_dir = get_full_path(backup_dir);
/* If get_full_path() failed or the backup directory is
* inaccessible, unset backup_dir. */
if (full_backup_dir == NULL ||
full_backup_dir[strlen(full_backup_dir) - 1] != '/') {
free(full_backup_dir);
free(backup_dir);
backup_dir = NULL;
} else {
free(backup_dir);
backup_dir = full_backup_dir;
}
}
#endif
/* Read from inn, write to out. We assume inn is opened for reading,
* and out for writing. We return 0 on success, -1 on read error, -2 on
* write error. */
@@ -1454,8 +1490,38 @@ int write_file(const char *name, int tmp, int append, int nonamechange)
goto cleanup_and_exit;
}
backupname = charalloc(strlen(realname) + 2);
sprintf(backupname, "%s~", realname);
/* If backup_dir is set, we set backupname to
* backup_dir/backupname~, where backupnae is the canonicalized
* absolute pathname of realname with every '/' replaced with a
* '!'. This means that /home/foo/file is backed up in
* backup_dir/!home!foo!file~. */
if (backup_dir != NULL) {
char *canon_realname = get_full_path(realname);
size_t i;
if (canon_realname == NULL)
/* If get_full_path() failed, we don't have a
* canonicalized absolute pathname, so just use the
* filename portion of the pathname. We use tail() so
* that e.g. ../backupname will be backed up in
* backupdir/backupname~ instead of
* backupdir/../backupname~. */
canon_realname = mallocstrcpy(NULL, tail(realname));
else {
for (i = 0; canon_realname[i] != '\0'; i++) {
if (canon_realname[i] == '/')
canon_realname[i] = '!';
}
}
backupname = charalloc(strlen(backup_dir) +
strlen(canon_realname) + 2);
sprintf(backupname, "%s%s~", backup_dir, canon_realname);
free(canon_realname);
} else {
backupname = charalloc(strlen(realname) + 2);
sprintf(backupname, "%s~", realname);
}
/* Open the destination backup file. Before we write to it, we
* set its permissions, so no unauthorized person can read it as
@@ -1647,7 +1713,8 @@ int write_file(const char *name, int tmp, int append, int nonamechange)
filename = mallocstrcpy(filename, realname);
#ifdef ENABLE_COLOR
update_color();
edit_refresh();
if (ISSET(COLOR_SYNTAX))
edit_refresh();
#endif
}
@@ -1669,35 +1736,113 @@ int write_file(const char *name, int tmp, int append, int nonamechange)
return retval;
}
int do_writeout(const char *path, int exiting, int append)
#ifndef NANO_SMALL
/* Write a marked selection from a file out. First, set fileage and
* filebot as the top and bottom of the mark, respectively. Then call
* write_file() with the values of name, temp, append, and nonamechange.
* Finally, set fileage and filebot back to their old values and
* return. */
int write_marked(const char *name, int tmp, int append, int
nonamechange)
{
int i = 0;
int retval = -1;
filestruct *fileagebak = fileage;
filestruct *filebotbak = filebot;
int oldmod = ISSET(MODIFIED);
/* write_file() unsets the MODIFIED flag. */
size_t topx;
/* The column of the beginning of the mark. */
char origchar;
/* We replace the character at the end of the mark with '\0'.
* We save the original character, to restore it. */
char *origcharloc;
/* The location of the character we nulled. */
if (!ISSET(MARK_ISSET))
return -1;
/* Set fileage as the top of the mark, and filebot as the bottom. */
if (current->lineno > mark_beginbuf->lineno ||
(current->lineno == mark_beginbuf->lineno &&
current_x > mark_beginx)) {
fileage = mark_beginbuf;
topx = mark_beginx;
filebot = current;
origcharloc = current->data + current_x;
} else {
fileage = current;
topx = current_x;
filebot = mark_beginbuf;
origcharloc = mark_beginbuf->data + mark_beginx;
}
origchar = *origcharloc;
*origcharloc = '\0';
fileage->data += topx;
/* If the line at filebot is blank, treat it as the magicline and
* hence the end of the file. Otherwise, treat the line after
* filebot as the end of the file. */
if (filebot->data[0] != '\0' && filebot->next != NULL)
filebot = filebot->next;
retval = write_file(name, tmp, append, nonamechange);
/* Now restore everything. */
fileage->data -= topx;
*origcharloc = origchar;
fileage = fileagebak;
filebot = filebotbak;
if (oldmod)
set_modified();
return retval;
}
#endif /* !NANO_SMALL */
int do_writeout(int exiting)
{
int i;
int append = 0;
#ifdef NANO_EXTRA
static int did_cred = 0;
static int did_cred = FALSE;
#endif
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_MOUSE)
currshortcut = writefile_list;
#endif
answer = mallocstrcpy(answer, path);
if (exiting && ISSET(TEMP_OPT)) {
i = -1;
if (filename[0] != '\0') {
i = write_file(answer, 0, 0, 0);
display_main_list();
return i;
} else {
i = write_file(filename, FALSE, 0, FALSE);
if (i == 1) {
/* Write succeeded. */
display_main_list();
return 1;
}
}
/* No filename or the write above failed. */
if (i == -1) {
UNSET(TEMP_OPT);
do_exit();
/* They cancelled, abort quit */
/* They cancelled; abort quit. */
return -1;
}
}
while (1) {
#ifndef NANO_SMALL
if (ISSET(MARK_ISSET) && !exiting)
answer = mallocstrcpy(answer, "");
else
#endif
answer = mallocstrcpy(answer, filename);
while (TRUE) {
const char *msg;
#ifndef NANO_SMALL
char *ans = mallocstrcpy(NULL, answer);
const char *formatstr, *backupstr;
if (ISSET(MAC_FILE))
@@ -1712,44 +1857,39 @@ int do_writeout(const char *path, int exiting, int append)
else
backupstr = "";
/* Be nice to the translation folks */
/* Be nice to the translation folks. */
if (ISSET(MARK_ISSET) && !exiting) {
if (append == 2)
i = statusq(1, writefile_list, "", 0,
"%s%s%s", _("Prepend Selection to File"), formatstr, backupstr);
msg = _("Prepend Selection to File");
else if (append == 1)
i = statusq(1, writefile_list, "", 0,
"%s%s%s", _("Append Selection to File"), formatstr, backupstr);
msg = _("Append Selection to File");
else
i = statusq(1, writefile_list, "", 0,
"%s%s%s", _("Write Selection to File"), formatstr, backupstr);
} else {
if (append == 2)
i = statusq(1, writefile_list, answer, 0,
"%s%s%s", _("File Name to Prepend to"), formatstr, backupstr);
else if (append == 1)
i = statusq(1, writefile_list, answer, 0,
"%s%s%s", _("File Name to Append to"), formatstr, backupstr);
else
i = statusq(1, writefile_list, answer, 0,
"%s%s%s", _("File Name to Write"), formatstr, backupstr);
}
#else
if (append == 2)
i = statusq(1, writefile_list, answer,
"%s", _("File Name to Prepend to"));
else if (append == 1)
i = statusq(1, writefile_list, answer,
"%s", _("File Name to Append to"));
else
i = statusq(1, writefile_list, answer,
"%s", _("File Name to Write"));
msg = _("Write Selection to File");
} else
#endif /* !NANO_SMALL */
if (append == 2)
msg = _("File Name to Prepend to");
else if (append == 1)
msg = _("File Name to Append to");
else
msg = _("File Name to Write");
i = statusq(TRUE, writefile_list,
#ifndef NANO_SMALL
ans, NULL, "%s%s%s", msg, formatstr, backupstr
#else
filename, "%s", msg
#endif
);
#ifndef NANO_SMALL
free(ans);
#endif
if (i == -1) {
statusbar(_("Cancelled"));
display_main_list();
return 0;
return -1;
}
#ifndef DISABLE_BROWSER
@@ -1793,7 +1933,7 @@ int do_writeout(const char *path, int exiting, int append)
if (exiting && !ISSET(TEMP_OPT) && !strcasecmp(answer, "zzy")
&& !did_cred) {
do_credits();
did_cred = 1;
did_cred = TRUE;
return -1;
}
#endif
@@ -1801,7 +1941,7 @@ int do_writeout(const char *path, int exiting, int append)
struct stat st;
if (!stat(answer, &st)) {
i = do_yesno(0, _("File exists, OVERWRITE ?"));
i = do_yesno(FALSE, _("File exists, OVERWRITE ?"));
if (i == 0 || i == -1)
continue;
} else if (filename[0] != '\0'
@@ -1809,7 +1949,7 @@ int do_writeout(const char *path, int exiting, int append)
&& (!ISSET(MARK_ISSET) || exiting)
#endif
) {
i = do_yesno(0, _("Save file under DIFFERENT NAME ?"));
i = do_yesno(FALSE, _("Save file under DIFFERENT NAME ?"));
if (i == 0 || i == -1)
continue;
}
@@ -1818,70 +1958,26 @@ int do_writeout(const char *path, int exiting, int append)
#ifndef NANO_SMALL
/* Here's where we allow the selected text to be written to
* a separate file. */
if (ISSET(MARK_ISSET) && !exiting) {
filestruct *fileagebak = fileage;
filestruct *filebotbak = filebot;
int oldmod = ISSET(MODIFIED);
/* write_file() unsets the MODIFIED flag. */
size_t topx;
/* The column of the beginning of the mark. */
char origchar;
/* We replace the character at the end of the mark with
* '\0'. We save the original character, to restore
* it. */
char *origcharloc;
/* The location of the character we nulled. */
/* Set fileage as the top of the mark, and filebot as the
* bottom. */
if (current->lineno > mark_beginbuf->lineno ||
(current->lineno == mark_beginbuf->lineno &&
current_x > mark_beginx)) {
fileage = mark_beginbuf;
topx = mark_beginx;
filebot = current;
origcharloc = current->data + current_x;
} else {
fileage = current;
topx = current_x;
filebot = mark_beginbuf;
origcharloc = mark_beginbuf->data + mark_beginx;
}
origchar = *origcharloc;
*origcharloc = '\0';
fileage->data += topx;
/* If the line at filebot is blank, treat it as the
* magicline and hence the end of the file. Otherwise,
* treat the line after filebot as the end of the file. */
if (filebot->data[0] != '\0' && filebot->next != NULL)
filebot = filebot->next;
i = write_file(answer, 0, append, 1);
/* Now restore everything. */
fileage->data -= topx;
*origcharloc = origchar;
fileage = fileagebak;
filebot = filebotbak;
if (oldmod)
set_modified();
} else
if (ISSET(MARK_ISSET) && !exiting)
i = write_marked(answer, FALSE, append, FALSE);
else
#endif /* !NANO_SMALL */
i = write_file(answer, 0, append, 0);
i = write_file(answer, FALSE, append, FALSE);
#ifdef ENABLE_MULTIBUFFER
/* If we're not about to exit, update the current entry in
the open_files structure. */
* the open_files structure. */
if (!exiting)
add_open_file(1);
#endif
display_main_list();
return i;
} /* while (1) */
} /* while (TRUE) */
}
int do_writeout_void(void)
{
return do_writeout(filename, 0, 0);
return do_writeout(FALSE);
}
/* Return a malloc()ed string containing the actual directory, used
@@ -2249,7 +2345,7 @@ char *input_tab(char *buf, int place, int *lastwastab, int *newplace, int *list)
pos <= strlen(matches[0]); pos++)
tmp++;
while (1) {
while (TRUE) {
match_matches = 0;
for (i = 0; i < num_matches; i++) {
@@ -2339,16 +2435,24 @@ char *input_tab(char *buf, int place, int *lastwastab, int *newplace, int *list)
}
#endif /* !DISABLE_TABCOMP */
#ifndef DISABLE_BROWSER
/* Return the stat of the file pointed to by path */
struct stat filestat(const char *path)
#if !defined(DISABLE_BROWSER) || !defined(NANO_SMALL)
/* Only print the last part of a path; isn't there a shell
* command for this? */
const char *tail(const char *foo)
{
struct stat st;
const char *tmp = foo + strlen(foo);
stat(path, &st);
return st;
while (*tmp != '/' && tmp != foo)
tmp--;
if (*tmp == '/')
tmp++;
return tmp;
}
#endif
#ifndef DISABLE_BROWSER
/* Our sort routine for file listings -- sort directories before
* files, and then alphabetically. */
int diralphasort(const void *va, const void *vb)
@@ -2374,21 +2478,6 @@ void free_charptrarray(char **array, int len)
free(array);
}
/* Only print the last part of a path; isn't there a shell
* command for this? */
const char *tail(const char *foo)
{
const char *tmp = foo + strlen(foo);
while (*tmp != '/' && tmp != foo)
tmp--;
if (*tmp == '/')
tmp++;
return tmp;
}
/* Strip one dir from the end of a string. */
void striponedir(char *foo)
{
@@ -2478,7 +2567,7 @@ char *do_browser(const char *inpath)
struct stat st;
char *foo, *retval = NULL;
static char *path = NULL;
int numents = 0, i = 0, j = 0, kbinput = -1, meta, longest = 0;
int numents = 0, i = 0, j = 0, kbinput = ERR, meta_key, longest = 0;
int abort = 0, col = 0, selected = 0, editline = 0, width = 0;
int filecols = 0, lineno = 0;
char **filelist = (char **)NULL;
@@ -2568,7 +2657,7 @@ char *do_browser(const char *inpath)
break;
#endif
case NANO_UP_KEY:
case NANO_PREVLINE_KEY:
if (selected - width >= 0)
selected -= width;
break;
@@ -2576,7 +2665,7 @@ char *do_browser(const char *inpath)
if (selected > 0)
selected--;
break;
case NANO_DOWN_KEY:
case NANO_NEXTLINE_KEY:
if (selected + width <= numents - 1)
selected += width;
break;
@@ -2670,9 +2759,9 @@ char *do_browser(const char *inpath)
case 'G': /* Pico compatibility */
case 'g':
curs_set(1);
j = statusq(0, gotodir_list, "",
j = statusq(FALSE, gotodir_list, "",
#ifndef NANO_SMALL
0,
NULL,
#endif
_("Goto Directory"));
bottombars(browser_list);
@@ -2751,7 +2840,7 @@ char *do_browser(const char *inpath)
if (S_ISLNK(st.st_mode)) {
/* Aha! It's a symlink! Now, is it a dir? If so,
mark it as such */
st = filestat(filelist[j]);
stat(filelist[j], &st);
if (S_ISDIR(st.st_mode))
strcpy(foo + longest - 5, "(dir)");
else
@@ -2792,7 +2881,7 @@ char *do_browser(const char *inpath)
}
}
wrefresh(edit);
} while ((kbinput = get_kbinput(edit, &meta)) != NANO_EXIT_KEY && kbinput != NANO_EXIT_FKEY);
} while ((kbinput = get_kbinput(edit, &meta_key)) != NANO_EXIT_KEY && kbinput != NANO_EXIT_FKEY);
curs_set(1);
blank_edit();
titlebar(NULL);

View File

@@ -59,7 +59,6 @@ filestruct *fileage = NULL; /* Our file buffer */
filestruct *edittop = NULL; /* Pointer to the top of the edit
buffer with respect to the
file struct */
filestruct *editbot = NULL; /* Same for the bottom */
filestruct *filebot = NULL; /* Last node in the file struct */
filestruct *cutbuffer = NULL; /* A place to store cut text */
@@ -72,6 +71,10 @@ char *quotestr = NULL; /* Quote string. The default value is
set in main(). */
#endif
#ifndef NANO_SMALL
char *backup_dir = NULL; /* Backup directory. */
#endif
int resetstatuspos; /* Hack for resetting the status bar
cursor position */
char *answer = NULL; /* Answer str to many questions */
@@ -158,7 +161,7 @@ int curses_ended = FALSE; /* Indicates to statusbar() to simply
* ended curses mode. */
int length_of_list(const shortcut *s)
int length_of_list(const shortcut *s)
{
int i = 0;
@@ -168,11 +171,12 @@ int length_of_list(const shortcut *s)
}
/* Initialize a struct *without* our lovely braces =( */
void sc_init_one(shortcut **shortcutage, int key, const char *desc,
void sc_init_one(shortcut **shortcutage, int ctrlval, const char *desc,
#ifndef DISABLE_HELP
const char *help,
#endif
int meta, int func_key, int misc, int view, int (*func) (void))
int metaval, int funcval, int miscval, int view, int
(*func)(void))
{
shortcut *s;
@@ -186,14 +190,14 @@ void sc_init_one(shortcut **shortcutage, int key, const char *desc,
s = s->next;
}
s->val = key;
s->ctrlval = ctrlval;
s->desc = desc;
#ifndef DISABLE_HELP
s->help = help;
#endif
s->metaval = meta;
s->func_key = func_key;
s->misc = misc;
s->metaval = metaval;
s->funcval = funcval;
s->miscval = miscval;
s->viewok = view;
s->func = func;
s->next = NULL;
@@ -328,8 +332,8 @@ void shortcut_init(int unjustify)
"", *nano_whereis_next_msg = "", *nano_prevpage_msg =
"", *nano_nextpage_msg = "", *nano_cut_msg =
"", *nano_uncut_msg = "", *nano_cursorpos_msg =
"", *nano_spell_msg = "", *nano_up_msg =
"", *nano_down_msg = "", *nano_forward_msg =
"", *nano_spell_msg = "", *nano_prevline_msg =
"", *nano_nextline_msg = "", *nano_forward_msg =
"", *nano_back_msg = "", *nano_home_msg =
"", *nano_end_msg = "", *nano_firstline_msg =
"", *nano_lastline_msg = "", *nano_refresh_msg =
@@ -374,8 +378,8 @@ void shortcut_init(int unjustify)
nano_uncut_msg = _("Uncut from the cutbuffer into the current line");
nano_cursorpos_msg = _("Show the position of the cursor");
nano_spell_msg = _("Invoke the spell checker, if available");
nano_up_msg = _("Move up one line");
nano_down_msg = _("Move down one line");
nano_prevline_msg = _("Move to the previous line");
nano_nextline_msg = _("Move to the next line");
nano_forward_msg = _("Move forward one character");
nano_back_msg = _("Move back one character");
nano_home_msg = _("Move to the beginning of the current line");
@@ -424,10 +428,10 @@ void shortcut_init(int unjustify)
/* The following macro is to be used in calling sc_init_one. The point is
* that sc_init_one takes 9 arguments, unless DISABLE_HELP is defined,
* when the fourth one should not be there. */
#ifdef DISABLE_HELP
# define IFHELP(help, nextvar) nextvar
#else
#ifndef DISABLE_HELP
# define IFHELP(help, nextvar) help, nextvar
#else
# define IFHELP(help, nextvar) nextvar
#endif
/* Translators: try to keep this string under 10 characters long */
@@ -494,8 +498,8 @@ void shortcut_init(int unjustify)
if (unjustify)
/* Translators: try to keep this string under 10 characters long */
sc_init_one(&main_list, NANO_UNJUSTIFY_KEY, _("UnJustify"),
IFHELP(nano_unjustify_msg, NANO_NO_KEY), NANO_NO_KEY,
NANO_NO_KEY, NOVIEW, do_uncut_text);
IFHELP(nano_unjustify_msg, NANO_NO_KEY), NANO_UNJUSTIFY_FKEY,
NANO_NO_KEY, NOVIEW, 0);
else
/* Translators: try to keep this string under 10 characters long */
sc_init_one(&main_list, NANO_UNCUT_KEY, _("UnCut Txt"),
@@ -520,12 +524,12 @@ void shortcut_init(int unjustify)
IFHELP(nano_replace_msg, NANO_ALT_REPLACE_KEY), NANO_REPLACE_FKEY,
NANO_NO_KEY, NOVIEW, do_replace);
sc_init_one(&main_list, NANO_UP_KEY, _("Up"),
IFHELP(nano_up_msg, NANO_NO_KEY), NANO_NO_KEY,
sc_init_one(&main_list, NANO_PREVLINE_KEY, _("Prev Line"),
IFHELP(nano_prevline_msg, NANO_NO_KEY), NANO_NO_KEY,
NANO_NO_KEY, VIEW, do_up);
sc_init_one(&main_list, NANO_DOWN_KEY, _("Down"),
IFHELP(nano_down_msg, NANO_NO_KEY), NANO_NO_KEY,
sc_init_one(&main_list, NANO_NEXTLINE_KEY, _("Next Line"),
IFHELP(nano_nextline_msg, NANO_NO_KEY), NANO_NO_KEY,
NANO_NO_KEY, VIEW, do_down);
sc_init_one(&main_list, NANO_FORWARD_KEY, _("Forward"),
@@ -580,7 +584,7 @@ void shortcut_init(int unjustify)
sc_init_one(&main_list, NANO_NO_KEY, _("Verbatim Input"),
IFHELP(nano_verbatim_msg, NANO_VERBATIM_KEY), NANO_NO_KEY,
NANO_NO_KEY, VIEW, do_verbatim_input);
NANO_NO_KEY, NOVIEW, do_verbatim_input);
#ifdef ENABLE_MULTIBUFFER
sc_init_one(&main_list, NANO_NO_KEY, _("Previous File"),
@@ -615,12 +619,12 @@ void shortcut_init(int unjustify)
/* Translators: try to keep this string under 10 characters long */
sc_init_one(&whereis_list, NANO_FIRSTLINE_KEY, _("First Line"),
IFHELP(nano_firstline_msg, NANO_NO_KEY), NANO_NO_KEY,
IFHELP(nano_firstline_msg, NANO_NO_KEY), NANO_FIRSTLINE_FKEY,
NANO_NO_KEY, VIEW, do_first_line);
/* Translators: try to keep this string under 10 characters long */
sc_init_one(&whereis_list, NANO_LASTLINE_KEY, _("Last Line"),
IFHELP(nano_lastline_msg, NANO_NO_KEY), NANO_NO_KEY,
IFHELP(nano_lastline_msg, NANO_NO_KEY), NANO_LASTLINE_FKEY,
NANO_NO_KEY, VIEW, do_last_line);
/* Translators: try to keep this string under 10 characters long */
@@ -716,7 +720,7 @@ void shortcut_init(int unjustify)
sc_init_one(&replace_list, NANO_HISTORY_KEY, _("History"),
IFHELP(nano_editstr_msg, NANO_NO_KEY), NANO_NO_KEY,
NANO_DOWN_KEY, VIEW, 0);
NANO_NO_KEY, VIEW, 0);
#endif /* !NANO_SMALL */
free_shortcutage(&replace_list_2);
@@ -738,9 +742,9 @@ void shortcut_init(int unjustify)
NANO_NO_KEY, VIEW, do_last_line);
#ifndef NANO_SMALL
sc_init_one(&replace_list_2, NANO_UP_KEY, _("History"),
sc_init_one(&replace_list_2, NANO_HISTORY_KEY, _("History"),
IFHELP(nano_editstr_msg, NANO_NO_KEY), NANO_NO_KEY,
NANO_DOWN_KEY, VIEW, 0);
NANO_NO_KEY, VIEW, 0);
#endif
free_shortcutage(&goto_list);
@@ -932,6 +936,10 @@ void thanks_for_all_the_fish(void)
if (quotestr != NULL)
free(quotestr);
#endif
#ifndef NANO_SMALL
if (backup_dir != NULL)
free(backup_dir);
#endif
#ifndef DISABLE_OPERATINGDIR
if (operating_dir != NULL)
free(operating_dir);

File diff suppressed because it is too large Load Diff

View File

@@ -19,13 +19,21 @@
* *
**************************************************************************/
#ifndef NANO_H
#define NANO_H 1
#ifdef __TANDEM
/* Tandem NonStop Kernel */
#include <floss.h>
#define NANO_ROOT_UID 65535
#else
#define NANO_ROOT_UID 0
#endif
#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif
#ifndef NANO_H
#define NANO_H 1
/* Macros for the flags int... */
#define SET(bit) flags |= bit
#define UNSET(bit) flags &= ~bit
@@ -179,11 +187,11 @@ typedef struct openfilestruct {
typedef struct shortcut {
/* Key values that aren't used should be set to NANO_NO_KEY. */
int val; /* Special sentinel key or control key we want
int ctrlval; /* Special sentinel key or control key we want
* bound. */
int metaval; /* Meta key we want bound. */
int func_key; /* Function key we want bound. */
int misc; /* Other Meta key we want bound. */
int metaval; /* Meta key we want bound. */
int funcval; /* Function key we want bound. */
int miscval; /* Other Meta key we want bound. */
int viewok; /* Is this function legal in view mode? */
int (*func) (void); /* Function to call when we catch this key. */
const char *desc; /* Description, e.g. "Page Up". */
@@ -288,7 +296,6 @@ typedef struct historyheadtype {
#define PRESERVE (1<<27)
#define HISTORY_CHANGED (1<<28)
#define HISTORYLOG (1<<29)
#define JUSTIFY_MODE (1<<30)
/* Control key sequences, changing these would be very very bad. */
#define NANO_CONTROL_SPACE 0
@@ -399,14 +406,17 @@ typedef struct historyheadtype {
#define NANO_SPELL_KEY NANO_CONTROL_T
#define NANO_SPELL_FKEY KEY_F(12)
#define NANO_FIRSTLINE_KEY NANO_PREVPAGE_KEY
#define NANO_FIRSTLINE_FKEY NANO_PREVPAGE_FKEY
#define NANO_LASTLINE_KEY NANO_NEXTPAGE_KEY
#define NANO_LASTLINE_FKEY NANO_NEXTPAGE_FKEY
#define NANO_CANCEL_KEY NANO_CONTROL_C
#define NANO_REFRESH_KEY NANO_CONTROL_L
#define NANO_JUSTIFY_KEY NANO_CONTROL_J
#define NANO_JUSTIFY_FKEY KEY_F(4)
#define NANO_UNJUSTIFY_KEY NANO_CONTROL_U
#define NANO_UP_KEY NANO_CONTROL_P
#define NANO_DOWN_KEY NANO_CONTROL_N
#define NANO_UNJUSTIFY_KEY NANO_UNCUT_KEY /* Same key as uncut. */
#define NANO_UNJUSTIFY_FKEY NANO_UNCUT_FKEY /* Same key as uncut. */
#define NANO_PREVLINE_KEY NANO_CONTROL_P
#define NANO_NEXTLINE_KEY NANO_CONTROL_N
#define NANO_FORWARD_KEY NANO_CONTROL_F
#define NANO_BACK_KEY NANO_CONTROL_B
#define NANO_MARK_KEY NANO_CONTROL_6

View File

@@ -50,6 +50,10 @@ extern int currslen;
extern char *quotestr;
#endif
#ifndef NANO_SMALL
extern char *backup_dir;
#endif
extern WINDOW *edit, *topwin, *bottomwin;
extern char *filename;
extern struct stat originalfilestat;
@@ -70,7 +74,7 @@ extern char *alt_speller;
extern int resetstatuspos;
extern struct stat fileinfo;
extern filestruct *current, *fileage, *edittop, *editbot, *filebot;
extern filestruct *current, *fileage, *edittop, *filebot;
extern filestruct *cutbuffer;
#ifndef NANO_SMALL
extern filestruct *mark_beginbuf;
@@ -139,7 +143,7 @@ void update_color(void);
/* Public functions in cut.c */
filestruct *get_cutbottom(void);
void add_to_cutbuffer(filestruct *inptr);
void add_to_cutbuffer(filestruct *inptr, int allow_concat);
void cut_marked_segment(void);
int do_cut_text(void);
int do_uncut_text(void);
@@ -178,8 +182,15 @@ char *safe_tempnam(const char *dirname, const char *filename_prefix);
void init_operating_dir(void);
int check_operating_dir(const char *currpath, int allow_tabcomp);
#endif
#ifndef NANO_SMALL
void init_backup_dir(void);
#endif
int write_file(const char *name, int tmp, int append, int nonamechange);
int do_writeout(const char *path, int exiting, int append);
#ifndef NANO_SMALL
int write_marked(const char *name, int tmp, int append, int
nonamechange);
#endif
int do_writeout(int exiting);
int do_writeout_void(void);
char *real_dir_from_tilde(const char *buf);
#ifndef DISABLE_TABCOMP
@@ -188,11 +199,12 @@ char **username_tab_completion(char *buf, int *num_matches);
char **cwd_tab_completion(char *buf, int *num_matches);
char *input_tab(char *buf, int place, int *lastwastab, int *newplace, int *list);
#endif
#if !defined(DISABLE_BROWSER) || !defined(NANO_SMALL)
const char *tail(const char *foo);
#endif
#ifndef DISABLE_BROWSER
struct stat filestat(const char *path);
int diralphasort(const void *va, const void *vb);
void free_charptrarray(char **array, int len);
const char *tail(const char *foo);
void striponedir(char *foo);
int readable_dir(const char *path);
char **browser_init(const char *path, int *longest, int *numents);
@@ -206,7 +218,8 @@ void sc_init_one(shortcut **shortcutage, int key, const char *desc,
#ifndef DISABLE_HELP
const char *help,
#endif
int meta, int func_key, int misc, int view, int (*func) (void));
int metaval, int funcval, int miscval, int view, int
(*func)(void));
#ifndef NANO_SMALL
void toggle_init_one(int val, const char *desc, int flag);
void toggle_init(void);
@@ -313,13 +326,12 @@ filestruct *backup_lines(filestruct *first_line, size_t par_len,
size_t quote_len);
int breakable(const char *line, int goal);
int break_line(const char *line, int goal, int force);
int do_para_operation(int operation);
#endif /* !DISABLE_JUSTIFY */
int do_justify(void);
#ifndef DISABLE_JUSTIFY
int do_para_search(int search_type, size_t *quote, size_t *par, size_t
*indent, int do_refresh);
int do_para_begin(void);
int do_para_end(void);
#endif
#endif /* !DISABLE_JUSTIFY */
int do_justify(void);
int do_exit(void);
void signal_init(void);
RETSIGTYPE handle_hupterm(int signal);
@@ -327,6 +339,7 @@ RETSIGTYPE do_suspend(int signal);
RETSIGTYPE do_cont(int signal);
#ifndef NANO_SMALL
void handle_sigwinch(int s);
void allow_pending_sigwinch(int allow);
#endif
void print_numlock_warning(void);
#ifndef NANO_SMALL
@@ -359,19 +372,19 @@ void not_found_msg(const char *str);
void search_abort(void);
void search_init_globals(void);
int search_init(int replacing);
int is_whole_word(int curr_pos, const char *datastr, const char *searchword);
filestruct *findnextstr(int quiet, int bracket_mode,
const filestruct *begin, int beginx,
const char *needle, int no_sameline);
int is_whole_word(int curr_pos, const char *datastr, const char
*searchword);
int findnextstr(int can_display_wrap, int wholeword, const filestruct
*begin, size_t beginx, const char *needle, int no_sameline);
int do_search(void);
int do_research(void);
void replace_abort(void);
#ifdef HAVE_REGEX_H
int replace_regexp(char *string, int create_flag);
#endif
char *replace_line(void);
int do_replace_loop(const char *prevanswer, const filestruct *begin,
int *beginx, int wholewords, int *i);
char *replace_line(const char *needle);
int do_replace_loop(const char *needle, const filestruct *real_current,
size_t *real_current_x, int wholewords);
int do_replace(void);
int do_gotoline(int line, int save_pos);
int do_gotoline_void(void);
@@ -396,10 +409,13 @@ void save_history(void);
#endif
/* Public functions in utils.c */
#ifdef HAVE_REGEX_H
#ifdef BROKEN_REGEXEC
int regexec_safe(const regex_t *preg, const char *string, size_t nmatch,
regmatch_t pmatch[], int eflags);
#endif
int regexp_bol_or_eol(const regex_t *preg, const char *string);
#endif
int is_cntrl_char(int c);
int num_of_digits(int n);
void align(char **strp);
@@ -420,7 +436,7 @@ const char *revstristr(const char *haystack, const char *needle,
#endif
const char *stristr(const char *haystack, const char *needle);
const char *strstrwrapper(const char *haystack, const char *needle,
const char *rev_start, int line_pos);
const char *start);
void nperror(const char *s);
void *nmalloc(size_t howmuch);
void *nrealloc(void *ptr, size_t howmuch);
@@ -435,14 +451,15 @@ int check_wildcard_match(const char *text, const char *pattern);
#endif
/* Public functions in winio.c */
int get_kbinput(WINDOW *win, int *meta);
char *get_verbatim_kbinput(WINDOW *win, int *kbinput_len,
int allow_ascii);
int get_kbinput(WINDOW *win, int *meta_key);
int *get_verbatim_kbinput(WINDOW *win, int *kbinput_len, int
allow_ascii);
int get_ignored_kbinput(WINDOW *win);
int get_accepted_kbinput(WINDOW *win, int kbinput, int *meta);
int get_accepted_kbinput(WINDOW *win, int kbinput, int *meta_key);
int get_ascii_kbinput(WINDOW *win, int kbinput);
int get_escape_seq_kbinput(WINDOW *win, char *escape_seq, int
int get_escape_seq_kbinput(WINDOW *win, int *escape_seq, int
escape_seq_len);
int get_escape_seq_abcd(int kbinput);
int get_mouseinput(int *mouse_x, int *mouse_y, int shortcut);
int do_first_line(void);
int do_last_line(void);
@@ -487,7 +504,7 @@ void center_cursor(void);
void edit_refresh(void);
void edit_refresh_clearok(void);
void edit_update(filestruct *fileptr, topmidnone location);
int statusq(int tabs, const shortcut *s, const char *def,
int statusq(int allowtabs, const shortcut *s, const char *def,
#ifndef NANO_SMALL
historyheadtype *history_list,
#endif
@@ -501,7 +518,6 @@ int do_cursorpos_void(void);
int line_len(const char *ptr);
int do_help(void);
void do_replace_highlight(int highlight_flag, const char *word);
void fix_editbot(void);
#ifdef DEBUG
void dump_buffer(const filestruct *inptr);
void dump_buffer_reverse(void);

View File

@@ -41,6 +41,7 @@ const static rcoption rcopts[] = {
#ifndef NANO_SMALL
{"autoindent", AUTOINDENT},
{"backup", BACKUP_FILE},
{"backupdir", 0},
#endif
{"const", CONSTUPDATE},
#ifndef NANO_SMALL
@@ -145,12 +146,12 @@ char *parse_next_word(char *ptr)
return ptr;
}
/* The keywords operatingdir, fill, tabsize, speller, and quotestr take
* an argument when set. Among these, operatingdir, speller, and
* quotestr have to allow tabs and spaces in the argument. Thus, if the
* next word starts with a ", we say it ends with the last " of the line.
* Otherwise, the word is interpreted as usual. That is so the arguments
* can contain "s too. */
/* The keywords operatingdir, backupdir, fill, tabsize, speller, and
* quotestr take an argument when set. Among these, operatingdir,
* backupdir, speller, and quotestr have to allow tabs and spaces in the
* argument. Thus, if the next word starts with a ", we say it ends
* with the last " of the line. Otherwise, the word is interpreted as
* usual. That is so the arguments can contain "s too. */
char *parse_argument(char *ptr)
{
const char *ptr_bak = ptr;
@@ -540,6 +541,9 @@ void parse_rcfile(FILE *rcstream)
#ifndef DISABLE_JUSTIFY
|| !strcasecmp(rcopts[i].name, "quotestr")
#endif
#ifndef NANO_SMALL
|| !strcasecmp(rcopts[i].name, "backupdir")
#endif
#ifndef DISABLE_SPELLER
|| !strcasecmp(rcopts[i].name, "speller")
#endif
@@ -582,6 +586,11 @@ void parse_rcfile(FILE *rcstream)
quotestr = mallocstrcpy(NULL, option);
else
#endif
#ifndef NANO_SMALL
if (!strcasecmp(rcopts[i].name, "backupdir"))
backup_dir = mallocstrcpy(NULL, option);
else
#endif
#ifndef DISABLE_SPELLER
if (!strcasecmp(rcopts[i].name, "speller"))
alt_speller = mallocstrcpy(NULL, option);
@@ -667,9 +676,9 @@ void do_rcfile(void)
if (!ISSET(NO_RCFILE)) {
#if defined(DISABLE_ROOTWRAP) && !defined(DISABLE_WRAPPING)
/* If we've already read $SYSCONFDIR/nanorc (if it's there), we're
/* If we've already read SYSCONFDIR/nanorc (if it's there), we're
root, and --disable-wrapping-as-root is used, turn wrapping off */
if (euid == 0)
if (euid == NANO_ROOT_UID)
SET(NO_WRAP);
#endif
if ((rcstream = fopen(nanorc, "r")) == NULL) {

File diff suppressed because it is too large Load Diff

View File

@@ -30,6 +30,7 @@
#include "proto.h"
#include "nano.h"
#ifdef HAVE_REGEX_H
#ifdef BROKEN_REGEXEC
#undef regexec
int regexec_safe(const regex_t *preg, const char *string, size_t nmatch,
@@ -40,7 +41,16 @@ int regexec_safe(const regex_t *preg, const char *string, size_t nmatch,
return REG_NOMATCH;
}
#define regexec(preg, string, nmatch, pmatch, eflags) regexec_safe(preg, string, nmatch, pmatch, eflags)
#endif
#endif /* BROKEN_REGEXEC */
/* Assume that string will be found by regexec() if the REG_NOTBOL and
* REG_NOTEOL glags are not set. */
int regexp_bol_or_eol(const regex_t *preg, const char *string)
{
return (regexec(preg, string, 0, NULL, REG_NOTBOL | REG_NOTEOL) ==
REG_NOMATCH);
}
#endif /* HAVE_REGEX_H */
int is_cntrl_char(int c)
{
@@ -84,9 +94,10 @@ void null_at(char **data, size_t index)
void unsunder(char *str, size_t true_len)
{
assert(str != NULL);
for (; true_len > 0; true_len--, str++)
for (; true_len > 0; true_len--, str++) {
if (*str == '\0')
*str = '\n';
}
}
/* For non-null-terminated lines. A line, by definition, shouldn't
@@ -94,9 +105,10 @@ void unsunder(char *str, size_t true_len)
void sunder(char *str)
{
assert(str != NULL);
for (; *str != '\0'; str++)
for (; *str != '\0'; str++) {
if (*str == '\n')
*str = '\0';
}
}
#ifndef HAVE_STRCASECMP
@@ -182,29 +194,32 @@ const char *stristr(const char *haystack, const char *needle)
return NULL;
}
/* If we are searching backwards, we will find the last match
* that starts no later than rev_start. If we are doing a regexp search,
* then line_pos should be 0 if haystack starts at the beginning of a
* line, and positive otherwise. In the regexp case, we fill in the
* global variable regmatches with at most 9 subexpression matches. Also,
* all .rm_so elements are relative to the start of the whole match, so
* regmatches[0].rm_so == 0. */
/* If we are searching backwards, we will find the last match that
* starts no later than start. Otherwise we find the first match
* starting no earlier than start. If we are doing a regexp search, we
* fill in the global variable regmatches with at most 9 subexpression
* matches. Also, all .rm_so elements are relative to the start of the
* whole match, so regmatches[0].rm_so == 0. */
const char *strstrwrapper(const char *haystack, const char *needle,
const char *rev_start, int line_pos)
const char *start)
{
/* start can be 1 character before the start or after the end of the
* line. In either case, we just say there is no match found. */
if ((start > haystack && *(start - 1) == '\0') || start < haystack)
return NULL;
assert(haystack != NULL && needle != NULL && start != NULL);
#ifdef HAVE_REGEX_H
if (ISSET(USE_REGEXP)) {
#ifndef NANO_SMALL
if (ISSET(REVERSE_SEARCH)) {
/* When doing a backwards search, haystack is a whole line. */
if (regexec(&search_regexp, haystack, 1, regmatches, 0) == 0 &&
haystack + regmatches[0].rm_so <= rev_start) {
if (regexec(&search_regexp, haystack, 1, regmatches, 0) == 0
&& haystack + regmatches[0].rm_so <= start) {
const char *retval = haystack + regmatches[0].rm_so;
/* Search forward until there is no more match. */
while (regexec(&search_regexp, retval + 1, 1, regmatches,
REG_NOTBOL) == 0 &&
retval + 1 + regmatches[0].rm_so <= rev_start)
REG_NOTBOL) == 0 && retval + 1 +
regmatches[0].rm_so <= start)
retval += 1 + regmatches[0].rm_so;
/* Finally, put the subexpression matches in global
* variable regmatches. The REG_NOTBOL flag doesn't
@@ -214,9 +229,9 @@ const char *strstrwrapper(const char *haystack, const char *needle,
}
} else
#endif /* !NANO_SMALL */
if (regexec(&search_regexp, haystack, 10, regmatches,
line_pos > 0 ? REG_NOTBOL : 0) == 0) {
const char *retval = haystack + regmatches[0].rm_so;
if (regexec(&search_regexp, start, 10, regmatches,
start > haystack ? REG_NOTBOL : 0) == 0) {
const char *retval = start + regmatches[0].rm_so;
regexec(&search_regexp, retval, 10, regmatches, 0);
return retval;
@@ -224,21 +239,26 @@ const char *strstrwrapper(const char *haystack, const char *needle,
return NULL;
}
#endif /* HAVE_REGEX_H */
#ifndef NANO_SMALL
#if !defined(DISABLE_SPELLER) || !defined(NANO_SMALL)
if (ISSET(CASE_SENSITIVE)) {
#ifndef NANO_SMALL
if (ISSET(REVERSE_SEARCH))
return revstrstr(haystack, needle, rev_start);
return revstrstr(haystack, needle, start);
else
return strstr(haystack, needle);
} else if (ISSET(REVERSE_SEARCH))
return revstristr(haystack, needle, rev_start);
#endif
return stristr(haystack, needle);
return strstr(start, needle);
}
#endif /* !DISABLE_SPELLER || !NANO_SMALL */
#ifndef NANO_SMALL
else if (ISSET(REVERSE_SEARCH))
return revstristr(haystack, needle, start);
#endif
return stristr(start, needle);
}
/* This is a wrapper for the perror function. The wrapper takes care of
* ncurses, calls perror (which writes to STDERR), then refreshes the
* screen. Note that nperror causes the window to flicker once. */
/* This is a wrapper for the perror() function. The wrapper takes care
* of ncurses, calls perror (which writes to stderr), then refreshes the
* screen. Note that nperror() causes the window to flicker once. */
void nperror(const char *s)
{
/* leave ncurses mode, go to the terminal */
@@ -273,14 +293,11 @@ void *nrealloc(void *ptr, size_t howmuch)
* dest = mallocstrcpy(dest, src); */
char *mallocstrcpy(char *dest, const char *src)
{
if (src == dest)
return dest;
if (dest != NULL)
free(dest);
if (src == NULL)
return NULL;
src = "";
if (src != dest)
free(dest);
dest = charalloc(strlen(src) + 1);
strcpy(dest, src);

View File

@@ -30,33 +30,61 @@
#include "proto.h"
#include "nano.h"
#ifdef NANO_EXTRA
#include <time.h>
#endif
static int statblank = 0; /* Number of keystrokes left after
we call statusbar(), before we
actually blank the statusbar */
/* Read in a single input character. If it's ignored, swallow it and go
* on. Otherwise, try to translate it from ASCII and extended (keypad)
* input. Assume nodelay(win) is FALSE. */
int get_kbinput(WINDOW *win, int *meta)
* on. Otherwise, try to translate it from ASCII, extended keypad
* values, and/or escape sequences. Supported extended keypad values
* consist of [arrow key], Ctrl-[arrow key], Shift-[arrow key], Enter,
* Backspace, Insert, Delete, Home, End, PageUp, PageDown, and F1-F14.
* Assume nodelay(win) is FALSE. */
int get_kbinput(WINDOW *win, int *meta_key)
{
int kbinput, retval;
#ifndef NANO_SMALL
allow_pending_sigwinch(TRUE);
#endif
kbinput = get_ignored_kbinput(win);
retval = get_accepted_kbinput(win, kbinput, meta);
retval = get_accepted_kbinput(win, kbinput, meta_key);
#ifndef NANO_SMALL
allow_pending_sigwinch(FALSE);
#endif
return retval;
}
/* Read in a string of input characters (e. g. an escape sequence)
/* Read in a string of input characters (e.g. an escape sequence)
* verbatim, and return the length of the string in kbinput_len. Assume
* nodelay(win) is FALSE. */
char *get_verbatim_kbinput(WINDOW *win, int *kbinput_len,
int allow_ascii)
int *get_verbatim_kbinput(WINDOW *win, int *kbinput_len, int
allow_ascii)
{
char *verbatim_kbinput;
int kbinput = wgetch(win);
int kbinput, *verbatim_kbinput;
verbatim_kbinput = charalloc(1);
#ifndef NANO_SMALL
allow_pending_sigwinch(TRUE);
#endif
/* Switch to raw mode so that we can type ^C, ^Q, ^S, ^Z, and ^\
* (and ^Y on the Hurd) without getting interrupts, and Turn the
* keypad off so that we don't get extended keypad values all of
* which are outside the ASCII range. */
#ifdef _POSIX_VDISABLE
raw();
#endif
keypad(win, FALSE);
kbinput = wgetch(win);
verbatim_kbinput = (int *)nmalloc(sizeof(int));
verbatim_kbinput[0] = kbinput;
*kbinput_len = 1;
@@ -64,20 +92,32 @@ char *get_verbatim_kbinput(WINDOW *win, int *kbinput_len,
/* Entering a three-digit decimal ASCII code from 000-255 in
* verbatim mode will produce the corresponding ASCII
* character. */
verbatim_kbinput[0] = (char)get_ascii_kbinput(win, kbinput);
verbatim_kbinput[0] = get_ascii_kbinput(win, kbinput);
else {
nodelay(win, TRUE);
while ((kbinput = wgetch(win)) != ERR) {
(*kbinput_len)++;
verbatim_kbinput = charealloc(verbatim_kbinput, *kbinput_len);
verbatim_kbinput[*kbinput_len - 1] = (char)kbinput;
verbatim_kbinput = realloc(verbatim_kbinput, *kbinput_len * sizeof(int));
verbatim_kbinput[*kbinput_len - 1] = kbinput;
}
nodelay(win, FALSE);
}
/* Switch back to cbreak mode and turn the keypad back on now that
* we're done. */
#ifdef _POSIX_VDISABLE
cbreak();
#endif
keypad(win, TRUE);
#ifdef DEBUG
fprintf(stderr, "get_verbatim_kbinput(): verbatim_kbinput = %s\n", verbatim_kbinput);
#endif
#ifndef NANO_SMALL
allow_pending_sigwinch(FALSE);
#endif
return verbatim_kbinput;
}
@@ -87,7 +127,7 @@ int get_ignored_kbinput(WINDOW *win)
{
int kbinput;
while (1) {
while (TRUE) {
kbinput = wgetch(win);
switch (kbinput) {
case ERR:
@@ -110,20 +150,22 @@ int get_ignored_kbinput(WINDOW *win)
}
}
/* Translate acceptable ASCII and extended (keypad) input. Set meta to
* 1 if we get a Meta sequence. Assume nodelay(win) is FALSE. */
int get_accepted_kbinput(WINDOW *win, int kbinput, int *meta)
/* Translate acceptable ASCII, extended keypad values, and/or escape
* sequences. Set meta_key to 1 if we get a Meta sequence. Assume
* nodelay(win) is FALSE. */
int get_accepted_kbinput(WINDOW *win, int kbinput, int *meta_key)
{
*meta = 0;
*meta_key = FALSE;
switch (kbinput) {
case NANO_CONTROL_3: /* Escape */
switch (kbinput = wgetch(win)) {
kbinput = wgetch(win);
switch (kbinput) {
case NANO_CONTROL_3: /* Escape */
kbinput = wgetch(win);
/* Esc Esc [three-digit decimal ASCII code from
* 000-255] == [corresponding ASCII character];
Esc Esc 2 obviously can't be Ctrl-2 here */
* Esc Esc 2 obviously can't be Ctrl-2 here */
if (kbinput >= '0' && kbinput <= '2')
kbinput = get_ascii_kbinput(win, kbinput);
/* Esc Esc [character] == Ctrl-[character];
@@ -151,14 +193,13 @@ int get_accepted_kbinput(WINDOW *win, int kbinput, int *meta)
* Hemel. */
case '[':
{
int old_kbinput = kbinput, escape_seq_len;
char *escape_seq;
int old_kbinput = kbinput, *escape_seq, escape_seq_len;
nodelay(win, TRUE);
kbinput = wgetch(win);
switch (kbinput) {
case ERR:
kbinput = tolower(old_kbinput);
*meta = 1;
*meta_key = TRUE;
break;
default:
ungetch(kbinput);
@@ -173,7 +214,7 @@ int get_accepted_kbinput(WINDOW *win, int kbinput, int *meta)
default:
/* Esc [character] == Meta-[character] */
kbinput = tolower(kbinput);
*meta = 1;
*meta_key = TRUE;
}
break;
case NANO_CONTROL_8:
@@ -182,10 +223,10 @@ int get_accepted_kbinput(WINDOW *win, int kbinput, int *meta)
kbinput = ISSET(REBIND_DELETE) ? NANO_DELETE_KEY : NANO_BACKSPACE_KEY;
break;
case KEY_DOWN:
kbinput = NANO_DOWN_KEY;
kbinput = NANO_NEXTLINE_KEY;
break;
case KEY_UP:
kbinput = NANO_UP_KEY;
kbinput = NANO_PREVLINE_KEY;
break;
case KEY_LEFT:
kbinput = NANO_BACK_KEY;
@@ -231,7 +272,7 @@ int get_accepted_kbinput(WINDOW *win, int kbinput, int *meta)
break;
}
#ifdef DEBUG
fprintf(stderr, "get_accepted_kbinput(): kbinput = %d, meta = %d\n", kbinput, *meta);
fprintf(stderr, "get_accepted_kbinput(): kbinput = %d, meta_key = %d\n", kbinput, *meta_key);
#endif
return kbinput;
}
@@ -302,29 +343,59 @@ int get_ascii_kbinput(WINDOW *win, int kbinput)
return retval;
}
/* Translate common escape sequences for some keys. These are generated
* when the terminal doesn't support those keys. Assume that Escape has
* already been read in, and that nodelay(win) is TRUE. */
int get_escape_seq_kbinput(WINDOW *win, char *escape_seq, int
/* Translate escape sequences, most of which correspond to extended
* keypad values. These sequences are generated when the terminal
* doesn't support the needed keys. Assume that Escape has already been
* read in, and that nodelay(win) is TRUE.
*
* The supported terminals are the Linux console, the FreeBSD console,
* the Hurd console (a.k.a. the Mach console), xterm, rxvt, and Eterm.
* There are several escape sequence conflicts and omissions, outlined
* as follows:
*
* - F1 on FreeBSD console == kmous on xterm/rxvt/Eterm; the latter is
* omitted. (Mouse input will only work properly if the extended
* keypad value KEY_MOUSE is generated on mouse events instead of the
* kmous escape sequence.)
* - F9 on FreeBSD console == PageDown on Hurd console; the former is
* omitted. (The editing keypad, consisting of Insert, Delete, Home,
* End, PageUp, and PageDown, is more important to have working than
* the function keys, because the functions of the former are not
* arbitrary and the functions of the latter are.)
* - F10 on FreeBSD console == PageUp on Hurd console; the former is
* omitted. (Same as above.)
* - F13 on FreeBSD console == End on Hurd console; the former is
* omitted. (Same as above.)
* - The Hurd console has no escape sequences for F11, F12, F13, or
* F14. */
int get_escape_seq_kbinput(WINDOW *win, int *escape_seq, int
escape_seq_len)
{
int kbinput = -1;
int kbinput = ERR;
if (escape_seq_len > 1) {
switch (escape_seq[0]) {
case 'O':
switch (escape_seq[1]) {
case '2':
if (escape_seq_len >= 3) {
switch (escape_seq[2]) {
case 'P': /* Esc O 2 P == F13 on
* xterm. */
kbinput = KEY_F(13);
break;
case 'Q': /* Esc O 2 Q == F14 on
* xterm. */
kbinput = KEY_F(14);
break;
}
}
break;
case 'A': /* Esc O A == Up on xterm. */
kbinput = NANO_UP_KEY;
break;
case 'B': /* Esc O B == Down on xterm. */
kbinput = NANO_DOWN_KEY;
break;
case 'C': /* Esc O C == Right on xterm. */
kbinput = NANO_FORWARD_KEY;
break;
case 'D': /* Esc O D == Left on xterm. */
kbinput = NANO_BACK_KEY;
kbinput = get_escape_seq_abcd(escape_seq[1]);
break;
case 'F': /* Esc O F == End on xterm. */
kbinput = NANO_END_KEY;
@@ -332,96 +403,169 @@ int get_escape_seq_kbinput(WINDOW *win, char *escape_seq, int
case 'H': /* Esc O H == Home on xterm. */
kbinput = NANO_HOME_KEY;
break;
case 'P': /* Esc O P == F1 on Hurd console. */
kbinput = KEY_F(1);
break;
case 'Q': /* Esc O Q == F2 on Hurd console. */
kbinput = KEY_F(2);
break;
case 'R': /* Esc O R == F3 on Hurd console. */
kbinput = KEY_F(3);
break;
case 'S': /* Esc O S == F4 on Hurd console. */
kbinput = KEY_F(4);
break;
case 'T': /* Esc O T == F5 on Hurd console. */
kbinput = KEY_F(5);
break;
case 'U': /* Esc O U == F6 on Hurd console. */
kbinput = KEY_F(6);
break;
case 'V': /* Esc O V == F7 on Hurd console. */
kbinput = KEY_F(7);
break;
case 'W': /* Esc O W == F8 on Hurd console. */
kbinput = KEY_F(8);
break;
case 'X': /* Esc O X == F9 on Hurd console. */
kbinput = KEY_F(9);
break;
case 'Y': /* Esc O Y == F10 on Hurd console. */
kbinput = KEY_F(10);
break;
case 'a': /* Esc O a == Ctrl-Up on rxvt. */
kbinput = NANO_UP_KEY;
break;
case 'b': /* Esc O b == Ctrl-Down on rxvt. */
kbinput = NANO_DOWN_KEY;
break;
case 'c': /* Esc O c == Ctrl-Right on rxvt. */
kbinput = NANO_FORWARD_KEY;
break;
case 'd': /* Esc O d == Ctrl-Left on rxvt. */
kbinput = NANO_BACK_KEY;
kbinput = get_escape_seq_abcd(escape_seq[1]);
break;
}
break;
case 'o':
switch (escape_seq[1]) {
case 'a': /* Esc o a == Ctrl-Up on Eterm. */
kbinput = NANO_UP_KEY;
break;
case 'b': /* Esc o b == Ctrl-Down on Eterm. */
kbinput = NANO_DOWN_KEY;
break;
case 'c': /* Esc o c == Ctrl-Right on Eterm. */
kbinput = NANO_FORWARD_KEY;
break;
case 'd': /* Esc o d == Ctrl-Left on Eterm. */
kbinput = NANO_BACK_KEY;
kbinput = get_escape_seq_abcd(escape_seq[1]);
break;
}
break;
case '[':
switch (escape_seq[1]) {
case '1':
if (escape_seq_len >= 5) {
if (!strncmp(escape_seq, "[1;2", 4)) {
switch (escape_seq[4]) {
case 'A':
/* Esc [ 1 ; 2 A == Shift-Up on
* xterm. */
kbinput = NANO_UP_KEY;
break;
case 'B':
/* Esc [ 1 ; 2 B == Shift-Down
* on xterm. */
kbinput = NANO_DOWN_KEY;
break;
case 'C':
/* Esc [ 1 ; 2 C == Shift-Right
* on xterm. */
kbinput = NANO_FORWARD_KEY;
break;
case 'D':
/* Esc [ 1 ; 2 D == Shift-Left
* on xterm. */
kbinput = NANO_BACK_KEY;
break;
}
} else if (!strncmp(escape_seq, "[1;5", 4)) {
switch (escape_seq[4]) {
case 'A':
/* Esc [ 1 ; 5 A == Ctrl-Up on
* xterm. */
kbinput = NANO_UP_KEY;
break;
case 'B':
/* Esc [ 1 ; 5 B == Ctrl-Down on
* xterm. */
kbinput = NANO_DOWN_KEY;
break;
case 'C':
/* Esc [ 1 ; 5 C == Ctrl-Right
* on xterm. */
kbinput = NANO_FORWARD_KEY;
break;
case 'D':
/* Esc [ 1 ; 5 D == Ctrl-Left on
* xterm. */
kbinput = NANO_BACK_KEY;
break;
}
if (escape_seq_len >= 3) {
switch (escape_seq[2]) {
case '1': /* Esc [ 1 1 ~ == F1 on
* rxvt/Eterm. */
kbinput = KEY_F(1);
break;
case '2': /* Esc [ 1 2 ~ == F2 on
* rxvt/Eterm. */
kbinput = KEY_F(2);
break;
case '3': /* Esc [ 1 3 ~ == F3 on
* rxvt/Eterm. */
kbinput = KEY_F(3);
break;
case '4': /* Esc [ 1 4 ~ == F4 on
* rxvt/Eterm. */
kbinput = KEY_F(4);
break;
case '5': /* Esc [ 1 5 ~ == F5 on
* xterm/rxvt/Eterm. */
kbinput = KEY_F(5);
break;
case '7': /* Esc [ 1 7 ~ == F6 on Linux
* console/xterm/rxvt/Eterm. */
kbinput = KEY_F(6);
break;
case '8': /* Esc [ 1 8 ~ == F7 on Linux
* console/xterm/rxvt/Eterm. */
kbinput = KEY_F(7);
break;
case '9': /* Esc [ 1 9 ~ == F8 on Linux
* console/xterm/rxvt/Eterm. */
kbinput = KEY_F(8);
break;
case ';':
if (escape_seq_len >= 4) {
switch (escape_seq[3]) {
case '2':
if (escape_seq_len >= 5) {
switch (escape_seq[4]) {
case 'A': /* Esc [ 1 ; 2 A == Shift-Up on
* xterm. */
case 'B': /* Esc [ 1 ; 2 B == Shift-Down on
* xterm. */
case 'C': /* Esc [ 1 ; 2 C == Shift-Right on
* xterm. */
case 'D': /* Esc [ 1 ; 2 D == Shift-Left on
* xterm. */
kbinput = get_escape_seq_abcd(escape_seq[4]);
break;
}
}
break;
case '5':
if (escape_seq_len >= 5) {
switch (escape_seq[4]) {
case 'A': /* Esc [ 1 ; 5 A == Ctrl-Up on
* xterm. */
case 'B': /* Esc [ 1 ; 5 B == Ctrl-Down on
* xterm. */
case 'C': /* Esc [ 1 ; 5 C == Ctrl-Right on
* xterm. */
case 'D': /* Esc [ 1 ; 5 D == Ctrl-Left on
* xterm. */
kbinput = get_escape_seq_abcd(escape_seq[4]);
break;
}
}
break;
}
}
break;
default: /* Esc [ 1 ~ == Home on Linux
* console. */
kbinput = NANO_HOME_KEY;
break;
}
}
break;
case '2':
if (escape_seq_len >= 3) {
switch (escape_seq[2]) {
case '0': /* Esc [ 2 0 ~ == F9 on Linux
* console/xterm/rxvt/Eterm. */
kbinput = KEY_F(9);
break;
case '1': /* Esc [ 2 1 ~ == F10 on Linux
* console/xterm/rxvt/Eterm. */
kbinput = KEY_F(10);
break;
case '3': /* Esc [ 2 3 ~ == F11 on Linux
* console/xterm/rxvt/Eterm. */
kbinput = KEY_F(11);
break;
case '4': /* Esc [ 2 4 ~ == F12 on Linux
* console/xterm/rxvt/Eterm. */
kbinput = KEY_F(12);
break;
case '5': /* Esc [ 2 5 ~ == F13 on Linux
* console/rxvt/Eterm. */
kbinput = KEY_F(13);
break;
case '6': /* Esc [ 2 6 ~ == F14 on Linux
* console/rxvt/Eterm. */
kbinput = KEY_F(14);
break;
default: /* Esc [ 2 ~ == Insert on Linux
* console/xterm. */
kbinput = NANO_INSERTFILE_KEY;
break;
}
break;
} else {
/* Esc [ 1 ~ == Home on Linux console. */
kbinput = NANO_HOME_KEY;
break;
}
case '2': /* Esc [ 2 ~ == Insert on Linux
* console/xterm. */
kbinput = NANO_INSERTFILE_KEY;
break;
case '3': /* Esc [ 3 ~ == Delete on Linux
* console/xterm. */
@@ -432,12 +576,12 @@ int get_escape_seq_kbinput(WINDOW *win, char *escape_seq, int
kbinput = NANO_END_KEY;
break;
case '5': /* Esc [ 5 ~ == PageUp on Linux
* console/xterm, Esc [ 5 ^ == PageUp on
* console/xterm; Esc [ 5 ^ == PageUp on
* Eterm. */
kbinput = NANO_PREVPAGE_KEY;
break;
case '6': /* Esc [ 6 ~ == PageDown on Linux
* console/xterm, Esc [ 6 ^ == PageDown on
* console/xterm; Esc [ 6 ^ == PageDown on
* Eterm. */
kbinput = NANO_NEXTPAGE_KEY;
break;
@@ -455,22 +599,16 @@ int get_escape_seq_kbinput(WINDOW *win, char *escape_seq, int
break;
case 'A': /* Esc [ A == Up on Linux console/FreeBSD
* console/Hurd console/rxvt/Eterm. */
kbinput = NANO_UP_KEY;
break;
case 'B': /* Esc [ B == Down on Linux
* console/FreeBSD console/Hurd
* console/rxvt/Eterm. */
kbinput = NANO_DOWN_KEY;
break;
case 'C': /* Esc [ C == Right on Linux
* console/FreeBSD console/Hurd
* console/rxvt/Eterm. */
kbinput = NANO_FORWARD_KEY;
break;
case 'D': /* Esc [ D == Left on Linux
* console/FreeBSD console/Hurd
* console/rxvt/Eterm. */
kbinput = NANO_BACK_KEY;
kbinput = get_escape_seq_abcd(escape_seq[1]);
break;
case 'F': /* Esc [ F == End on FreeBSD
* console/Eterm. */
@@ -492,34 +630,110 @@ int get_escape_seq_kbinput(WINDOW *win, char *escape_seq, int
* console. */
kbinput = NANO_INSERTFILE_KEY;
break;
case 'M': /* Esc [ M == F1 on FreeBSD console. */
kbinput = KEY_F(1);
break;
case 'N': /* Esc [ N == F2 on FreeBSD console. */
kbinput = KEY_F(2);
break;
case 'O':
if (escape_seq_len >= 3) {
switch (escape_seq[2]) {
case 'P': /* Esc [ O P == F1 on
* xterm. */
kbinput = KEY_F(1);
break;
case 'Q': /* Esc [ O Q == F2 on
* xterm. */
kbinput = KEY_F(2);
break;
case 'R': /* Esc [ O R == F3 on
* xterm. */
kbinput = KEY_F(3);
break;
case 'S': /* Esc [ O S == F4 on
* xterm. */
kbinput = KEY_F(4);
break;
default: /* Esc [ O == F3 on
* FreeBSD console. */
kbinput = KEY_F(3);
break;
}
}
break;
case 'P': /* Esc [ P == F4 on FreeBSD console. */
kbinput = KEY_F(4);
break;
case 'Q': /* Esc [ Q == F5 on FreeBSD console. */
kbinput = KEY_F(5);
break;
case 'R': /* Esc [ R == F6 on FreeBSD console. */
kbinput = KEY_F(6);
break;
case 'S': /* Esc [ S == F7 on FreeBSD console. */
kbinput = KEY_F(7);
break;
case 'T': /* Esc [ T == F8 on FreeBSD console. */
kbinput = KEY_F(8);
break;
case 'U': /* Esc [ U == PageDown on Hurd console. */
kbinput = NANO_NEXTPAGE_KEY;
break;
case 'V': /* Esc [ V == PageUp on Hurd console. */
kbinput = NANO_PREVPAGE_KEY;
break;
case 'W': /* Esc [ W == F11 on FreeBSD console. */
kbinput = KEY_F(11);
break;
case 'X': /* Esc [ X == F12 on FreeBSD console. */
kbinput = KEY_F(12);
break;
case 'Y': /* Esc [ Y == End on Hurd console. */
kbinput = NANO_END_KEY;
break;
case 'Z': /* Esc [ Z == F14 on FreeBSD console. */
kbinput = KEY_F(14);
break;
case 'a': /* Esc [ a == Shift-Up on rxvt/Eterm. */
kbinput = NANO_UP_KEY;
break;
case 'b': /* Esc [ b == Shift-Down on rxvt/Eterm. */
kbinput = NANO_DOWN_KEY;
break;
case 'c': /* Esc [ c == Shift-Right on
* rxvt/Eterm. */
kbinput = NANO_FORWARD_KEY;
break;
case 'd': /* Esc [ d == Shift-Left on rxvt/Eterm. */
kbinput = NANO_BACK_KEY;
kbinput = get_escape_seq_abcd(escape_seq[1]);
break;
case '[':
if (escape_seq_len >= 3) {
switch (escape_seq[2]) {
case 'A': /* Esc [ [ A == F1 on Linux
* console. */
kbinput = KEY_F(1);
break;
case 'B': /* Esc [ [ B == F2 on Linux
* console. */
kbinput = KEY_F(2);
break;
case 'C': /* Esc [ [ C == F3 on Linux
* console. */
kbinput = KEY_F(3);
break;
case 'D': /* Esc [ [ D == F4 on Linux
* console. */
kbinput = KEY_F(4);
break;
case 'E': /* Esc [ [ E == F5 on Linux
* console. */
kbinput = KEY_F(5);
break;
}
}
break;
}
break;
}
}
if (kbinput == -1) {
if (kbinput == ERR) {
/* This escape sequence is unrecognized; send it back. */
for (; escape_seq_len > 1; escape_seq_len--)
ungetch(escape_seq[escape_seq_len - 1]);
@@ -529,6 +743,25 @@ int get_escape_seq_kbinput(WINDOW *win, char *escape_seq, int
return kbinput;
}
/* Return the equivalent arrow key value for the case-insensitive
* letters A (up), B (down), C (right), and D (left). These are common
* to many escape sequences. */
int get_escape_seq_abcd(int kbinput)
{
switch (tolower(kbinput)) {
case 'a':
return NANO_PREVLINE_KEY;
case 'b':
return NANO_NEXTLINE_KEY;
case 'c':
return NANO_FORWARD_KEY;
case 'd':
return NANO_BACK_KEY;
default:
return ERR;
}
}
#ifndef DISABLE_MOUSE
/* Check for a mouse event, and if one's taken place, save the
* coordinates where it took place in mouse_x and mouse_y. After that,
@@ -600,13 +833,16 @@ int get_mouseinput(int *mouse_x, int *mouse_y, int allow_shortcuts)
for (; j > 0; j--)
s = s->next;
/* And ungetch() the equivalent keystroke. */
ungetch(s->val);
/* If it's not a control character, assume it's a Meta key
* sequence, in which case we need to ungetch() Escape too. */
if (!is_cntrl_char(s->val))
ungetch(NANO_CONTROL_3);
/* And ungetch() the equivalent control key. If it's a Meta key
* sequence, we need to ungetch() Escape too. Assume that the
* shortcut has an equivalent control key, meta key sequence, or
* both. */
if (s->ctrlval != NANO_NO_KEY)
ungetch(s->ctrlval);
else {
ungetch(s->metaval);
ungetch(NANO_CONTROL_3);
}
return 1;
}
@@ -690,7 +926,7 @@ size_t strnlenpt(const char *buf, size_t size)
/* How many columns wide is buf? */
size_t strlenpt(const char *buf)
{
return strnlenpt(buf, -1);
return strnlenpt(buf, (size_t)-1);
}
void blank_bottombars(void)
@@ -832,7 +1068,7 @@ void nanoget_repaint(const char *buf, const char *inputbuf, size_t x)
wattroff(bottomwin, A_REVERSE);
}
/* Get the input from the kb; this should only be called from
/* Get the input from the keyboard; this should only be called from
* statusq(). */
int nanogetstr(int allowtabs, const char *buf, const char *def,
#ifndef NANO_SMALL
@@ -845,7 +1081,7 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
)
{
int kbinput;
int meta;
int meta_key;
static int x = -1;
/* the cursor position in 'answer' */
int xend;
@@ -896,29 +1132,33 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
input */
wrefresh(edit);
while ((kbinput = get_kbinput(bottomwin, &meta)) != NANO_ENTER_KEY) {
while ((kbinput = get_kbinput(bottomwin, &meta_key)) != NANO_ENTER_KEY) {
for (t = s; t != NULL; t = t->next) {
#ifdef DEBUG
fprintf(stderr, "Aha! \'%c\' (%d)\n", kbinput, kbinput);
#endif
if (kbinput == t->val && is_cntrl_char(kbinput)) {
/* Temporary hack to interpret NANO_HELP_FKEY correctly. */
if (kbinput == t->funcval)
kbinput = t->ctrlval;
if (kbinput == t->ctrlval && is_cntrl_char(kbinput)) {
#ifndef DISABLE_HELP
/* Have to do this here, it would be too late to do it
in statusq() */
if (kbinput == NANO_HELP_KEY || kbinput == NANO_HELP_FKEY) {
if (kbinput == NANO_HELP_KEY) {
do_help();
break;
}
#endif
#ifndef NANO_SMALL
/* Have to handle these here too, for the time being */
if (kbinput == NANO_UP_KEY || kbinput == NANO_DOWN_KEY)
if (kbinput == NANO_PREVLINE_KEY || kbinput == NANO_NEXTLINE_KEY)
break;
#endif
return t->val;
return t->ctrlval;
}
}
assert(0 <= x && x <= xend && xend == strlen(answer));
@@ -997,7 +1237,7 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
if (x > 0)
x--;
break;
case NANO_UP_KEY:
case NANO_PREVLINE_KEY:
#ifndef NANO_SMALL
if (history_list != NULL) {
@@ -1039,7 +1279,7 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
}
#endif
break;
case NANO_DOWN_KEY:
case NANO_NEXTLINE_KEY:
#ifndef NANO_SMALL
if (history_list != NULL) {
@@ -1089,7 +1329,7 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
fprintf(stderr, "Aha! \'%c\' (%d)\n", kbinput,
kbinput);
#endif
if (meta == 1 && (kbinput == t->metaval || kbinput == t->misc))
if (meta_key == TRUE && (kbinput == t->metaval || kbinput == t->miscval))
/* We hit a Meta key. Do like above. We don't
* just ungetch() the letter and let it get
* caught above cause that screws the
@@ -1210,18 +1450,18 @@ void bottombars(const shortcut *s)
wmove(bottomwin, 1 + j, i * (COLS / numcols));
/* Yucky sentinel values we can't handle a better way */
if (s->val != NANO_NO_KEY) {
if (s->ctrlval != NANO_NO_KEY) {
#ifndef NANO_SMALL
if (s->val == NANO_HISTORY_KEY)
if (s->ctrlval == NANO_HISTORY_KEY)
strncpy(keystr, _("Up"), 8);
else
#endif
if (s->val == NANO_CONTROL_SPACE)
if (s->ctrlval == NANO_CONTROL_SPACE)
strcpy(keystr, "^ ");
else if (s->val == NANO_CONTROL_8)
else if (s->ctrlval == NANO_CONTROL_8)
strcpy(keystr, "^?");
else
sprintf(keystr, "^%c", s->val + 64);
sprintf(keystr, "^%c", s->ctrlval + 64);
} else if (s->metaval != NANO_NO_KEY)
sprintf(keystr, "M-%c", toupper(s->metaval));
@@ -1281,7 +1521,7 @@ size_t get_page_start(size_t column)
if (column == 0 || column < COLS - 1)
return 0;
else if (COLS > 9)
return column - 7 - (column - 8) % (COLS - 9);
return column - 7 - (column - 7) % (COLS - 8);
else if (COLS > 2)
return column - (COLS - 2);
else
@@ -1293,23 +1533,17 @@ size_t get_page_start(size_t column)
* cursor at (current_y, current_x). */
void reset_cursor(void)
{
const filestruct *ptr = edittop;
size_t x;
/* Yuck. This condition can be true after open_file() when opening
* the first file. */
if (edittop == NULL)
return;
current_y = 0;
current_y = current->lineno - edittop->lineno;
if (current_y < editwinrows) {
size_t x = xplustabs();
while (ptr != current && ptr != editbot && ptr->next != NULL) {
ptr = ptr->next;
current_y++;
}
x = xplustabs();
wmove(edit, current_y, x - get_page_start(x));
wmove(edit, current_y, x - get_page_start(x));
}
}
/* edit_add() takes care of the job of actually painting a line into the
@@ -1441,7 +1675,7 @@ void edit_add(const filestruct *fileptr, const char *converted,
* line not followed by an end on this line? */
start_col = 0;
while (1) {
while (TRUE) {
start_col += startmatch.rm_so;
startmatch.rm_eo -= startmatch.rm_so;
if (regexec(tmpcolor->end,
@@ -1718,26 +1952,33 @@ void edit_refresh(void)
edit_update(current, CENTER);
else {
int nlines = 0;
const filestruct *foo = edittop;
/* Don't make the cursor jump around the screen whilst
#ifdef DEBUG
fprintf(stderr, "edit_refresh(): edittop->lineno = %ld\n", edittop->lineno);
#endif
/* Don't let the cursor jump around the screen while
* updating. */
leaveok(edit, TRUE);
editbot = edittop;
while (nlines < editwinrows) {
update_line(editbot, current_x);
update_line(foo, current_x);
nlines++;
if (editbot->next == NULL)
if (foo->next == NULL)
break;
editbot = editbot->next;
foo = foo->next;
}
while (nlines < editwinrows) {
mvwaddstr(edit, nlines, 0, hblank);
nlines++;
}
reset_cursor();
/* What the hell are we expecting to update the screen if this
* isn't here? Luck? */
wrefresh(edit);
/* Let the cursor jump around the screen again. */
leaveok(edit, FALSE);
}
}
@@ -1774,7 +2015,7 @@ void edit_update(filestruct *fileptr, topmidnone location)
* want to put up by default.
*
* New arg tabs tells whether or not to allow tab completion. */
int statusq(int tabs, const shortcut *s, const char *def,
int statusq(int allowtabs, const shortcut *s, const char *def,
#ifndef NANO_SMALL
historyheadtype *which_history,
#endif
@@ -1794,7 +2035,7 @@ int statusq(int tabs, const shortcut *s, const char *def,
va_end(ap);
foo[COLS - 4] = '\0';
ret = nanogetstr(tabs, foo, def,
ret = nanogetstr(allowtabs, foo, def,
#ifndef NANO_SMALL
which_history,
#endif
@@ -1808,10 +2049,12 @@ int statusq(int tabs, const shortcut *s, const char *def,
switch (ret) {
case NANO_FIRSTLINE_KEY:
case NANO_FIRSTLINE_FKEY:
do_first_line();
resetstatuspos = 1;
break;
case NANO_LASTLINE_KEY:
case NANO_LASTLINE_FKEY:
do_last_line();
resetstatuspos = 1;
break;
@@ -1904,12 +2147,12 @@ int do_yesno(int all, const char *msg)
do {
int kbinput;
int meta;
int meta_key;
#ifndef DISABLE_MOUSE
int mouse_x, mouse_y;
#endif
kbinput = get_kbinput(edit, &meta);
kbinput = get_kbinput(edit, &meta_key);
if (kbinput == NANO_CANCEL_KEY)
ok = -1;
@@ -2116,7 +2359,7 @@ int line_len(const char *ptr)
int do_help(void)
{
#ifndef DISABLE_HELP
int i, page = 0, kbinput = -1, meta, no_more = 0;
int i, page = 0, kbinput = ERR, meta_key, no_more = 0;
int no_help_flag = 0;
const shortcut *oldshortcut;
@@ -2192,7 +2435,7 @@ int do_help(void)
no_more = 1;
continue;
}
} while ((kbinput = get_kbinput(edit, &meta)) != NANO_EXIT_KEY && kbinput != NANO_EXIT_FKEY);
} while ((kbinput = get_kbinput(edit, &meta_key)) != NANO_EXIT_KEY && kbinput != NANO_EXIT_FKEY);
currshortcut = oldshortcut;
@@ -2252,16 +2495,6 @@ void do_replace_highlight(int highlight_flag, const char *word)
wattroff(edit, A_REVERSE);
}
/* Fix editbot, based on the assumption that edittop is correct. */
void fix_editbot(void)
{
int i;
editbot = edittop;
for (i = 0; i < editwinrows && editbot->next != NULL; i++)
editbot = editbot->next;
}
#ifdef DEBUG
/* Dump the passed-in file structure to stderr. */
void dump_buffer(const filestruct *inptr)
@@ -2295,9 +2528,11 @@ void dump_buffer_reverse(void)
#define CREDIT_LEN 53
#define XLCREDIT_LEN 8
/* Easter egg: Display credits. Assume nodelay(edit) is FALSE. */
void do_credits(void)
{
int i, j = 0, k, place = 0, start_x;
struct timespec scrolldelay;
const char *what;
const char *xlcredits[XLCREDIT_LEN];
@@ -2361,6 +2596,9 @@ void do_credits(void)
xlcredits[6] = _("and anyone else we forgot...");
xlcredits[7] = _("Thank you for using nano!\n");
scrolldelay.tv_sec = 0;
scrolldelay.tv_nsec = 700000000;
curs_set(0);
nodelay(edit, TRUE);
blank_bottombars();
@@ -2392,7 +2630,7 @@ void do_credits(void)
start_x = COLS / 2 - strlen(what) / 2 - 1;
mvwaddstr(edit, i * 2 - k, start_x, what);
}
usleep(700000);
nanosleep(&scrolldelay, NULL);
wrefresh(edit);
}
if (j < editwinrows / 2 - 1)