low-level input overhaul
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1523 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
Этот коммит содержится в:
родитель
f3fee5db91
Коммит
4d7c260270
33
ChangeLog
33
ChangeLog
@ -1,5 +1,36 @@
|
|||||||
CVS code -
|
CVS code -
|
||||||
|
- General:
|
||||||
|
- Complete overhaul and abstraction of the lowest level of
|
||||||
|
keyboard input, mostly rewritten but incorporating a few bits
|
||||||
|
from the old functions and adding support for Pico's Esc Esc
|
||||||
|
[three-digit decimal ASCII code] input method. New functions
|
||||||
|
get_kbinput(), get_verbatim_kbinput(), get_ignored_kbinput(),
|
||||||
|
get_accepted_kbinput(), get_ascii_kbinput(),
|
||||||
|
get_escape_seq_kbinput(), and get_skip_tilde_kbinput(). These
|
||||||
|
should work properly on FreeBSD (due to code and input
|
||||||
|
provided by Lee Nelson and Wouter van Hemel, respectively).
|
||||||
|
(DLR)
|
||||||
|
- The -K/--keypad command line/rcfile option has been removed,
|
||||||
|
and keypad() is now always TRUE. keypad_on() in winio.c and
|
||||||
|
the check for _use_keypad in configure.ac have both been
|
||||||
|
removed. (DLR)
|
||||||
|
- The -d/--rebinddelete command line/rcfile option, equivalent
|
||||||
|
to Pico's -d, has been added. It is intended to work around
|
||||||
|
the problem with Backspace/Delete confusion on some terminals,
|
||||||
|
notably FreeBSD; if your Backspace key acts like Delete, this
|
||||||
|
option will fix that. (DLR)
|
||||||
|
- files.c:
|
||||||
|
do_browser():
|
||||||
|
- Some of the Pico compatibility options in the file browser
|
||||||
|
that don't work properly for Pico 4.6 have been removed.
|
||||||
|
Backspace, 'g', 'l', 'q', and 'u' are invalid, 'd' deletes the
|
||||||
|
highlighted file, and 'r' renames the highlighted file. (DLR)
|
||||||
|
- nano.h:
|
||||||
|
- Define KEY_SUSPEND as -1 when slang is used, as slang has no
|
||||||
|
KEY_SUSPEND equivalent. When nano is compiled with slang
|
||||||
|
support, pressing Ctrl-Z to suspend nano at the Linux console
|
||||||
|
with keypad(TRUE) generates Ctrl-Z instead of KEY_SUSPEND
|
||||||
|
(which is what ncurses generates then). (DLR)
|
||||||
- AUTHORS
|
- AUTHORS
|
||||||
- Updated to show 1.2/1.3 maintainers.
|
- Updated to show 1.2/1.3 maintainers.
|
||||||
|
|
||||||
|
14
configure.ac
14
configure.ac
@ -330,20 +330,6 @@ AC_CHECK_LIB([$CURSES_LIB_NAME], use_default_colors, AC_DEFINE(HAVE_USE_DEFAULT_
|
|||||||
if test x$slang_support != xyes; then
|
if test x$slang_support != xyes; then
|
||||||
AC_CHECK_LIB([$CURSES_LIB_NAME], wresize, AC_DEFINE(HAVE_WRESIZE, 1, [Define this if you have the wresize function in your ncurses-type library.]))
|
AC_CHECK_LIB([$CURSES_LIB_NAME], wresize, AC_DEFINE(HAVE_WRESIZE, 1, [Define this if you have the wresize function in your ncurses-type library.]))
|
||||||
AC_CHECK_LIB([$CURSES_LIB_NAME], resizeterm, AC_DEFINE(HAVE_RESIZETERM, 1, [Define this if you have the resizeterm function in your ncurses-type library.]))
|
AC_CHECK_LIB([$CURSES_LIB_NAME], resizeterm, AC_DEFINE(HAVE_RESIZETERM, 1, [Define this if you have the resizeterm function in your ncurses-type library.]))
|
||||||
|
|
||||||
# Taken from aumix (can't tell from the variable name?)
|
|
||||||
AC_CACHE_CHECK([for private member _use_keypad in WINDOW],
|
|
||||||
aumix_cv_struct_window_usekeypad,
|
|
||||||
[AC_TRY_COMPILE([#ifdef HAVE_NCURSES_H
|
|
||||||
#include <ncurses.h>
|
|
||||||
#else
|
|
||||||
#include <curses.h>
|
|
||||||
#endif], [WINDOW w; w._use_keypad;],
|
|
||||||
aumix_cv_struct_window_usekeypad=yes, aumix_cv_struct_window_usekeypad=no)])
|
|
||||||
|
|
||||||
if test $aumix_cv_struct_window_usekeypad = yes; then
|
|
||||||
AC_DEFINE(HAVE_USEKEYPAD, 1, [Define this if your curses lib has the _use_keypad flag.])
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl Parse any configure options
|
dnl Parse any configure options
|
||||||
|
30
files.c
30
files.c
@ -2477,9 +2477,9 @@ char *do_browser(const char *inpath)
|
|||||||
struct stat st;
|
struct stat st;
|
||||||
char *foo, *retval = NULL;
|
char *foo, *retval = NULL;
|
||||||
static char *path = NULL;
|
static char *path = NULL;
|
||||||
int numents = 0, i = 0, j = 0, kbinput = 0, longest = 0, abort = 0;
|
int numents = 0, i = 0, j = 0, kbinput = -1, meta, longest = 0;
|
||||||
int col = 0, selected = 0, editline = 0, width = 0, filecols = 0;
|
int abort = 0, col = 0, selected = 0, editline = 0, width = 0;
|
||||||
int lineno = 0, kb;
|
int filecols = 0, lineno = 0;
|
||||||
char **filelist = (char **)NULL;
|
char **filelist = (char **)NULL;
|
||||||
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
|
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
|
||||||
MEVENT mevent;
|
MEVENT mevent;
|
||||||
@ -2505,7 +2505,6 @@ char *do_browser(const char *inpath)
|
|||||||
/* Sort the list by directory first, then alphabetically */
|
/* Sort the list by directory first, then alphabetically */
|
||||||
qsort(filelist, numents, sizeof(char *), diralphasort);
|
qsort(filelist, numents, sizeof(char *), diralphasort);
|
||||||
|
|
||||||
kb = keypad_on(edit, 1);
|
|
||||||
titlebar(path);
|
titlebar(path);
|
||||||
bottombars(browser_list);
|
bottombars(browser_list);
|
||||||
curs_set(0);
|
curs_set(0);
|
||||||
@ -2569,34 +2568,23 @@ char *do_browser(const char *inpath)
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case NANO_UP_KEY:
|
case NANO_UP_KEY:
|
||||||
case KEY_UP:
|
|
||||||
case 'u':
|
|
||||||
if (selected - width >= 0)
|
if (selected - width >= 0)
|
||||||
selected -= width;
|
selected -= width;
|
||||||
break;
|
break;
|
||||||
case NANO_BACK_KEY:
|
case NANO_BACK_KEY:
|
||||||
case KEY_LEFT:
|
|
||||||
case NANO_BACKSPACE_KEY:
|
|
||||||
case 127:
|
|
||||||
case 'l':
|
|
||||||
if (selected > 0)
|
if (selected > 0)
|
||||||
selected--;
|
selected--;
|
||||||
break;
|
break;
|
||||||
case KEY_DOWN:
|
|
||||||
case NANO_DOWN_KEY:
|
case NANO_DOWN_KEY:
|
||||||
case 'd':
|
|
||||||
if (selected + width <= numents - 1)
|
if (selected + width <= numents - 1)
|
||||||
selected += width;
|
selected += width;
|
||||||
break;
|
break;
|
||||||
case KEY_RIGHT:
|
|
||||||
case NANO_FORWARD_KEY:
|
case NANO_FORWARD_KEY:
|
||||||
case 'r':
|
|
||||||
if (selected < numents - 1)
|
if (selected < numents - 1)
|
||||||
selected++;
|
selected++;
|
||||||
break;
|
break;
|
||||||
case NANO_PREVPAGE_KEY:
|
case NANO_PREVPAGE_KEY:
|
||||||
case NANO_PREVPAGE_FKEY:
|
case NANO_PREVPAGE_FKEY:
|
||||||
case KEY_PPAGE:
|
|
||||||
case '-':
|
case '-':
|
||||||
if (selected >= (editwinrows + lineno % editwinrows) * width)
|
if (selected >= (editwinrows + lineno % editwinrows) * width)
|
||||||
selected -= (editwinrows + lineno % editwinrows) * width;
|
selected -= (editwinrows + lineno % editwinrows) * width;
|
||||||
@ -2605,7 +2593,6 @@ char *do_browser(const char *inpath)
|
|||||||
break;
|
break;
|
||||||
case NANO_NEXTPAGE_KEY:
|
case NANO_NEXTPAGE_KEY:
|
||||||
case NANO_NEXTPAGE_FKEY:
|
case NANO_NEXTPAGE_FKEY:
|
||||||
case KEY_NPAGE:
|
|
||||||
case ' ':
|
case ' ':
|
||||||
selected += (editwinrows - lineno % editwinrows) * width;
|
selected += (editwinrows - lineno % editwinrows) * width;
|
||||||
if (selected >= numents)
|
if (selected >= numents)
|
||||||
@ -2615,7 +2602,6 @@ char *do_browser(const char *inpath)
|
|||||||
case NANO_HELP_FKEY:
|
case NANO_HELP_FKEY:
|
||||||
do_help();
|
do_help();
|
||||||
break;
|
break;
|
||||||
case KEY_ENTER:
|
|
||||||
case NANO_ENTER_KEY:
|
case NANO_ENTER_KEY:
|
||||||
case 's': /* More Pico compatibility */
|
case 's': /* More Pico compatibility */
|
||||||
case 'S':
|
case 'S':
|
||||||
@ -2678,10 +2664,8 @@ char *do_browser(const char *inpath)
|
|||||||
return do_browser(path);
|
return do_browser(path);
|
||||||
|
|
||||||
/* Goto a specific directory */
|
/* Goto a specific directory */
|
||||||
case 'g': /* Pico compatibility */
|
|
||||||
case 'G':
|
|
||||||
case NANO_GOTO_KEY:
|
case NANO_GOTO_KEY:
|
||||||
|
case NANO_GOTO_FKEY:
|
||||||
curs_set(1);
|
curs_set(1);
|
||||||
j = statusq(0, gotodir_list, "",
|
j = statusq(0, gotodir_list, "",
|
||||||
#ifndef NANO_SMALL
|
#ifndef NANO_SMALL
|
||||||
@ -2726,11 +2710,10 @@ char *do_browser(const char *inpath)
|
|||||||
return do_browser(path);
|
return do_browser(path);
|
||||||
|
|
||||||
/* Stuff we want to abort the browser */
|
/* Stuff we want to abort the browser */
|
||||||
case 'q':
|
|
||||||
case 'Q':
|
|
||||||
case 'e': /* Pico compatibility, yeech */
|
case 'e': /* Pico compatibility, yeech */
|
||||||
case 'E':
|
case 'E':
|
||||||
case NANO_CANCEL_KEY:
|
case NANO_CANCEL_KEY:
|
||||||
|
case NANO_EXIT_KEY:
|
||||||
case NANO_EXIT_FKEY:
|
case NANO_EXIT_FKEY:
|
||||||
abort = 1;
|
abort = 1;
|
||||||
break;
|
break;
|
||||||
@ -2806,12 +2789,11 @@ char *do_browser(const char *inpath)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
wrefresh(edit);
|
wrefresh(edit);
|
||||||
} while ((kbinput = wgetch(edit)) != NANO_EXIT_KEY);
|
} while ((kbinput = get_kbinput(edit, &meta, ISSET(REBIND_DELETE))) != NANO_EXIT_KEY && kbinput != NANO_EXIT_FKEY);
|
||||||
curs_set(1);
|
curs_set(1);
|
||||||
blank_edit();
|
blank_edit();
|
||||||
titlebar(NULL);
|
titlebar(NULL);
|
||||||
edit_refresh();
|
edit_refresh();
|
||||||
kb = keypad_on(edit, kb);
|
|
||||||
|
|
||||||
/* cleanup */
|
/* cleanup */
|
||||||
free_charptrarray(filelist, numents);
|
free_charptrarray(filelist, numents);
|
||||||
|
221
nano.c
221
nano.c
@ -66,9 +66,6 @@ static sigjmp_buf jmpbuf; /* Used to return to mainloop after SIGWINCH */
|
|||||||
/* What we do when we're all set to exit */
|
/* What we do when we're all set to exit */
|
||||||
RETSIGTYPE finish(int sigage)
|
RETSIGTYPE finish(int sigage)
|
||||||
{
|
{
|
||||||
keypad(edit, TRUE);
|
|
||||||
keypad(bottomwin, TRUE);
|
|
||||||
|
|
||||||
if (!ISSET(NO_HELP)) {
|
if (!ISSET(NO_HELP)) {
|
||||||
mvwaddstr(bottomwin, 1, 0, hblank);
|
mvwaddstr(bottomwin, 1, 0, hblank);
|
||||||
mvwaddstr(bottomwin, 2, 0, hblank);
|
mvwaddstr(bottomwin, 2, 0, hblank);
|
||||||
@ -251,9 +248,6 @@ void window_init(void)
|
|||||||
void mouse_init(void)
|
void mouse_init(void)
|
||||||
{
|
{
|
||||||
if (ISSET(USE_MOUSE)) {
|
if (ISSET(USE_MOUSE)) {
|
||||||
keypad_on(edit, 1);
|
|
||||||
keypad_on(bottomwin, 1);
|
|
||||||
|
|
||||||
mousemask(BUTTON1_RELEASED, NULL);
|
mousemask(BUTTON1_RELEASED, NULL);
|
||||||
mouseinterval(50);
|
mouseinterval(50);
|
||||||
} else
|
} else
|
||||||
@ -639,7 +633,6 @@ void usage(void)
|
|||||||
print1opt("-H", "--historylog", _("Log & read search/replace string history"));
|
print1opt("-H", "--historylog", _("Log & read search/replace string history"));
|
||||||
print1opt("-I", "--ignorercfiles", _("Don't look at nanorc files"));
|
print1opt("-I", "--ignorercfiles", _("Don't look at nanorc files"));
|
||||||
#endif
|
#endif
|
||||||
print1opt("-K", "--keypad", _("Use alternate keypad routines"));
|
|
||||||
#ifndef NANO_SMALL
|
#ifndef NANO_SMALL
|
||||||
print1opt("-M", "--mac", _("Write file in Mac format"));
|
print1opt("-M", "--mac", _("Write file in Mac format"));
|
||||||
print1opt("-N", "--noconvert", _("Don't convert files from DOS/Mac format"));
|
print1opt("-N", "--noconvert", _("Don't convert files from DOS/Mac format"));
|
||||||
@ -660,6 +653,7 @@ void usage(void)
|
|||||||
#endif
|
#endif
|
||||||
print1opt("-c", "--const", _("Constantly show cursor position"));
|
print1opt("-c", "--const", _("Constantly show cursor position"));
|
||||||
#ifndef NANO_SMALL
|
#ifndef NANO_SMALL
|
||||||
|
print1opt("-d", "--rebinddelete", _("Fix Backspace if it acts like Delete"));
|
||||||
print1opt("-i", "--autoindent", _("Automatically indent new lines"));
|
print1opt("-i", "--autoindent", _("Automatically indent new lines"));
|
||||||
print1opt("-k", "--cut", _("Let ^K cut from cursor to end of line"));
|
print1opt("-k", "--cut", _("Let ^K cut from cursor to end of line"));
|
||||||
#endif
|
#endif
|
||||||
@ -3001,6 +2995,7 @@ int main(int argc, char *argv[])
|
|||||||
const shortcut *s;
|
const shortcut *s;
|
||||||
int keyhandled = 0; /* Have we handled the keystroke yet? */
|
int keyhandled = 0; /* Have we handled the keystroke yet? */
|
||||||
int kbinput = -1; /* Input from keyboard */
|
int kbinput = -1; /* Input from keyboard */
|
||||||
|
int meta;
|
||||||
|
|
||||||
#ifndef NANO_SMALL
|
#ifndef NANO_SMALL
|
||||||
const toggle *t;
|
const toggle *t;
|
||||||
@ -3019,7 +3014,6 @@ int main(int argc, char *argv[])
|
|||||||
{"historylog", 0, 0, 'H'},
|
{"historylog", 0, 0, 'H'},
|
||||||
{"ignorercfiles", 0, 0, 'I'},
|
{"ignorercfiles", 0, 0, 'I'},
|
||||||
#endif
|
#endif
|
||||||
{"keypad", 0, 0, 'K'},
|
|
||||||
#ifndef DISABLE_JUSTIFY
|
#ifndef DISABLE_JUSTIFY
|
||||||
{"quotestr", 1, 0, 'Q'},
|
{"quotestr", 1, 0, 'Q'},
|
||||||
#endif
|
#endif
|
||||||
@ -3032,6 +3026,7 @@ int main(int argc, char *argv[])
|
|||||||
{"syntax", 1, 0, 'Y'},
|
{"syntax", 1, 0, 'Y'},
|
||||||
#endif
|
#endif
|
||||||
{"const", 0, 0, 'c'},
|
{"const", 0, 0, 'c'},
|
||||||
|
{"rebinddelete", 0, 0, 'd'},
|
||||||
{"nofollow", 0, 0, 'l'},
|
{"nofollow", 0, 0, 'l'},
|
||||||
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
|
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
|
||||||
{"mouse", 0, 0, 'm'},
|
{"mouse", 0, 0, 'm'},
|
||||||
@ -3080,11 +3075,11 @@ int main(int argc, char *argv[])
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_GETOPT_LONG
|
#ifdef HAVE_GETOPT_LONG
|
||||||
while ((optchr = getopt_long(argc, argv, "h?BDFHIKMNQ:RST:VY:abcefgijklmo:pr:s:tvwxz",
|
while ((optchr = getopt_long(argc, argv, "h?BDFHIMNQ:RST:VY:abcdefgijklmo:pr:s:tvwxz",
|
||||||
long_options, &option_index)) != -1) {
|
long_options, &option_index)) != -1) {
|
||||||
#else
|
#else
|
||||||
while ((optchr =
|
while ((optchr =
|
||||||
getopt(argc, argv, "h?BDFHIKMNQ:RST:VY:abcefgijklmo:pr:s:tvwxz")) != -1) {
|
getopt(argc, argv, "h?BDFHIMNQ:RST:VY:abcdefgijklmo:pr:s:tvwxz")) != -1) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
switch (optchr) {
|
switch (optchr) {
|
||||||
@ -3118,9 +3113,6 @@ int main(int argc, char *argv[])
|
|||||||
SET(NO_RCFILE);
|
SET(NO_RCFILE);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case 'K':
|
|
||||||
SET(ALT_KEYPAD);
|
|
||||||
break;
|
|
||||||
#ifndef NANO_SMALL
|
#ifndef NANO_SMALL
|
||||||
case 'M':
|
case 'M':
|
||||||
SET(MAC_FILE);
|
SET(MAC_FILE);
|
||||||
@ -3173,6 +3165,9 @@ int main(int argc, char *argv[])
|
|||||||
case 'c':
|
case 'c':
|
||||||
SET(CONSTUPDATE);
|
SET(CONSTUPDATE);
|
||||||
break;
|
break;
|
||||||
|
case 'd':
|
||||||
|
SET(REBIND_DELETE);
|
||||||
|
break;
|
||||||
#ifndef NANO_SMALL
|
#ifndef NANO_SMALL
|
||||||
case 'i':
|
case 'i':
|
||||||
SET(AUTOINDENT);
|
SET(AUTOINDENT);
|
||||||
@ -3389,10 +3384,8 @@ int main(int argc, char *argv[])
|
|||||||
mouse_init();
|
mouse_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!ISSET(ALT_KEYPAD)) {
|
|
||||||
keypad(edit, TRUE);
|
keypad(edit, TRUE);
|
||||||
keypad(bottomwin, TRUE);
|
keypad(bottomwin, TRUE);
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "Main: bottom win\n");
|
fprintf(stderr, "Main: bottom win\n");
|
||||||
@ -3456,160 +3449,12 @@ int main(int argc, char *argv[])
|
|||||||
raw();
|
raw();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
kbinput = wgetch(edit);
|
kbinput = get_kbinput(edit, &meta, ISSET(REBIND_DELETE));
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "AHA! %c (%d)\n", kbinput, kbinput);
|
fprintf(stderr, "AHA! %c (%d)\n", kbinput, kbinput);
|
||||||
#endif
|
#endif
|
||||||
if (kbinput == 27) { /* Grab Alt-key stuff first */
|
if (meta == 1) {
|
||||||
kbinput = wgetch(edit);
|
|
||||||
switch (kbinput) {
|
switch (kbinput) {
|
||||||
/* Alt-O, suddenly very important ;) */
|
|
||||||
case 'O':
|
|
||||||
kbinput = wgetch(edit);
|
|
||||||
/* Shift or Ctrl + Arrows are Alt-O-[2,5,6]-[A,B,C,D] on some terms */
|
|
||||||
if (kbinput == '2' || kbinput == '5' || kbinput == '6')
|
|
||||||
kbinput = wgetch(edit);
|
|
||||||
if ((kbinput <= 'D' && kbinput >= 'A') ||
|
|
||||||
(kbinput <= 'd' && kbinput >= 'a'))
|
|
||||||
kbinput = abcd(kbinput);
|
|
||||||
else if (kbinput <= 'z' && kbinput >= 'j')
|
|
||||||
print_numlock_warning();
|
|
||||||
else if (kbinput <= 'S' && kbinput >= 'P')
|
|
||||||
kbinput = KEY_F(kbinput - 79);
|
|
||||||
#ifdef DEBUG
|
|
||||||
else {
|
|
||||||
fprintf(stderr, "I got Alt-O-%c! (%d)\n",
|
|
||||||
kbinput, kbinput);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case 27:
|
|
||||||
/* If we get Alt-Alt, the next keystroke should be the same as a
|
|
||||||
control sequence */
|
|
||||||
modify_control_seq = 1;
|
|
||||||
keyhandled = 1;
|
|
||||||
break;
|
|
||||||
case '[':
|
|
||||||
kbinput = wgetch(edit);
|
|
||||||
switch (kbinput) {
|
|
||||||
case '1': /* Alt-[-1-[0-5,7-9] = F1-F8 in X at least */
|
|
||||||
kbinput = wgetch(edit);
|
|
||||||
if (kbinput >= '1' && kbinput <= '5') {
|
|
||||||
kbinput = KEY_F(kbinput - 48);
|
|
||||||
wgetch(edit);
|
|
||||||
} else if (kbinput >= '7' && kbinput <= '9') {
|
|
||||||
kbinput = KEY_F(kbinput - 49);
|
|
||||||
wgetch(edit);
|
|
||||||
} else if (kbinput == '~')
|
|
||||||
kbinput = KEY_HOME;
|
|
||||||
#ifdef DEBUG
|
|
||||||
else {
|
|
||||||
fprintf(stderr, "I got Alt-[-1-%c! (%d)\n",
|
|
||||||
kbinput, kbinput);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case '2': /* Alt-[-2-[0,1,3,4] = F9-F12 in many terms */
|
|
||||||
kbinput = wgetch(edit);
|
|
||||||
switch (kbinput) {
|
|
||||||
case '0':
|
|
||||||
kbinput = KEY_F(9);
|
|
||||||
wgetch(edit);
|
|
||||||
break;
|
|
||||||
case '1':
|
|
||||||
kbinput = KEY_F(10);
|
|
||||||
wgetch(edit);
|
|
||||||
break;
|
|
||||||
case '3':
|
|
||||||
kbinput = KEY_F(11);
|
|
||||||
wgetch(edit);
|
|
||||||
break;
|
|
||||||
case '4':
|
|
||||||
kbinput = KEY_F(12);
|
|
||||||
wgetch(edit);
|
|
||||||
break;
|
|
||||||
case '~':
|
|
||||||
kbinput = NANO_INSERTFILE_KEY;
|
|
||||||
break;
|
|
||||||
#ifdef DEBUG
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "I got Alt-[-2-%c! (%d)\n",
|
|
||||||
kbinput, kbinput);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case '3': /* Alt-[-3 = Delete? */
|
|
||||||
kbinput = NANO_DELETE_KEY;
|
|
||||||
wgetch(edit);
|
|
||||||
break;
|
|
||||||
case '4': /* Alt-[-4 = End? */
|
|
||||||
kbinput = NANO_END_KEY;
|
|
||||||
wgetch(edit);
|
|
||||||
break;
|
|
||||||
case '5': /* Alt-[-5 = Page Up */
|
|
||||||
kbinput = KEY_PPAGE;
|
|
||||||
wgetch(edit);
|
|
||||||
break;
|
|
||||||
case 'V': /* Alt-[-V = Page Up in Hurd Console */
|
|
||||||
case 'I': /* Alt-[-I = Page Up - FreeBSD Console */
|
|
||||||
kbinput = KEY_PPAGE;
|
|
||||||
break;
|
|
||||||
case '6': /* Alt-[-6 = Page Down */
|
|
||||||
kbinput = KEY_NPAGE;
|
|
||||||
wgetch(edit);
|
|
||||||
break;
|
|
||||||
case 'U': /* Alt-[-U = Page Down in Hurd Console */
|
|
||||||
case 'G': /* Alt-[-G = Page Down - FreeBSD Console */
|
|
||||||
kbinput = KEY_NPAGE;
|
|
||||||
break;
|
|
||||||
case '7':
|
|
||||||
kbinput = KEY_HOME;
|
|
||||||
wgetch(edit);
|
|
||||||
break;
|
|
||||||
case '8':
|
|
||||||
kbinput = KEY_END;
|
|
||||||
wgetch(edit);
|
|
||||||
break;
|
|
||||||
case '9': /* Alt-[-9 = Delete in Hurd Console */
|
|
||||||
kbinput = KEY_DC;
|
|
||||||
break;
|
|
||||||
case '@': /* Alt-[-@ = Insert in Hurd Console */
|
|
||||||
case 'L': /* Alt-[-L = Insert - FreeBSD Console */
|
|
||||||
kbinput = NANO_INSERTFILE_KEY;
|
|
||||||
break;
|
|
||||||
case '[': /* Alt-[-[-[A-E], F1-F5 in Linux console */
|
|
||||||
kbinput = wgetch(edit);
|
|
||||||
if (kbinput >= 'A' && kbinput <= 'E')
|
|
||||||
kbinput = KEY_F(kbinput - 64);
|
|
||||||
break;
|
|
||||||
case 'A':
|
|
||||||
case 'B':
|
|
||||||
case 'C':
|
|
||||||
case 'D':
|
|
||||||
case 'a':
|
|
||||||
case 'b':
|
|
||||||
case 'c':
|
|
||||||
case 'd':
|
|
||||||
kbinput = abcd(kbinput);
|
|
||||||
break;
|
|
||||||
case 'H':
|
|
||||||
kbinput = KEY_HOME;
|
|
||||||
break;
|
|
||||||
case 'F':
|
|
||||||
case 'Y': /* End Key in Hurd Console */
|
|
||||||
kbinput = KEY_END;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "I got Alt-[-%c! (%d)\n",
|
|
||||||
kbinput, kbinput);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#ifdef ENABLE_MULTIBUFFER
|
#ifdef ENABLE_MULTIBUFFER
|
||||||
case NANO_OPENPREV_KEY:
|
case NANO_OPENPREV_KEY:
|
||||||
case NANO_OPENPREV_ALTKEY:
|
case NANO_OPENPREV_ALTKEY:
|
||||||
@ -3656,23 +3501,6 @@ int main(int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Hack, make insert key do something useful, like insert file */
|
|
||||||
else if (kbinput == KEY_IC)
|
|
||||||
kbinput = NANO_INSERTFILE_KEY;
|
|
||||||
|
|
||||||
/* If modify_control_seq is set, we received an Alt-Alt
|
|
||||||
sequence before this, so we make this key a control sequence
|
|
||||||
by subtracting 32, 64, or 96, depending on its value. */
|
|
||||||
if (!keyhandled && modify_control_seq) {
|
|
||||||
if (kbinput == ' ')
|
|
||||||
kbinput -= 32;
|
|
||||||
else if (kbinput >= 'A' && kbinput < 'a')
|
|
||||||
kbinput -= 64;
|
|
||||||
else if (kbinput >= 'a' && kbinput <= 'z')
|
|
||||||
kbinput -= 96;
|
|
||||||
|
|
||||||
modify_control_seq = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Look through the main shortcut list to see if we've hit a
|
/* Look through the main shortcut list to see if we've hit a
|
||||||
shortcut key */
|
shortcut key */
|
||||||
@ -3707,19 +3535,18 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
#ifdef _POSIX_VDISABLE
|
#ifdef _POSIX_VDISABLE
|
||||||
/* Don't even think about changing this string */
|
/* Don't even think about changing this string */
|
||||||
if (kbinput == 19)
|
if (kbinput == NANO_CONTROL_Q)
|
||||||
statusbar(_("XOFF ignored, mumble mumble."));
|
|
||||||
if (kbinput == 17)
|
|
||||||
statusbar(_("XON ignored, mumble mumble."));
|
statusbar(_("XON ignored, mumble mumble."));
|
||||||
|
if (kbinput == NANO_CONTROL_S)
|
||||||
|
statusbar(_("XOFF ignored, mumble mumble."));
|
||||||
#endif
|
#endif
|
||||||
/* If we're in raw mode or using Alt-Alt-x, we have to catch
|
/* If we're in raw mode or using Alt-Alt-x, we have to catch
|
||||||
Control-S and Control-Q */
|
Control-S and Control-Q */
|
||||||
if (kbinput == 17 || kbinput == 19)
|
if (kbinput == NANO_CONTROL_Q || kbinput == NANO_CONTROL_S)
|
||||||
keyhandled = 1;
|
keyhandled = 1;
|
||||||
|
|
||||||
/* Catch ^Z by hand when triggered also
|
/* Catch ^Z by hand when triggered also */
|
||||||
407 == ^Z in Linux console when keypad() is used? */
|
if (kbinput == NANO_SUSPEND_KEY) {
|
||||||
if (kbinput == 26 || kbinput == 407) {
|
|
||||||
if (ISSET(SUSPEND))
|
if (ISSET(SUSPEND))
|
||||||
do_suspend(0);
|
do_suspend(0);
|
||||||
keyhandled = 1;
|
keyhandled = 1;
|
||||||
@ -3734,18 +3561,10 @@ int main(int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
case -1: /* Stuff that we don't want to do squat */
|
case NANO_CONTROL_3: /* Ctrl-[ (Esc), which should
|
||||||
case 0: /* Erg */
|
* have been handled before we
|
||||||
case 29: /* Ctrl-] */
|
* got here */
|
||||||
case 410: /* Must ignore this, it's sent when we resize */
|
case NANO_CONTROL_5: /* Ctrl-] */
|
||||||
#ifdef PDCURSES
|
|
||||||
case 541: /* ???? */
|
|
||||||
case 542: /* Control and alt in Windows *shrug* */
|
|
||||||
case 543: /* Right ctrl key */
|
|
||||||
case 544:
|
|
||||||
case 545: /* Right alt key */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
6
nano.h
6
nano.h
@ -48,6 +48,7 @@
|
|||||||
#include <slcurses.h>
|
#include <slcurses.h>
|
||||||
#define KEY_IC SL_KEY_IC
|
#define KEY_IC SL_KEY_IC
|
||||||
#define KEY_DC SL_KEY_DELETE
|
#define KEY_DC SL_KEY_DELETE
|
||||||
|
#define KEY_SUSPEND -1
|
||||||
#elif defined(HAVE_NCURSES_H)
|
#elif defined(HAVE_NCURSES_H)
|
||||||
#include <ncurses.h>
|
#include <ncurses.h>
|
||||||
#else /* Uh oh */
|
#else /* Uh oh */
|
||||||
@ -244,7 +245,7 @@ typedef struct historyheadtype {
|
|||||||
#define MAC_FILE (1<<20)
|
#define MAC_FILE (1<<20)
|
||||||
#define SMOOTHSCROLL (1<<21)
|
#define SMOOTHSCROLL (1<<21)
|
||||||
#define DISABLE_CURPOS (1<<22) /* Damn, we still need it */
|
#define DISABLE_CURPOS (1<<22) /* Damn, we still need it */
|
||||||
#define ALT_KEYPAD (1<<23)
|
#define REBIND_DELETE (1<<23)
|
||||||
#define NO_CONVERT (1<<24)
|
#define NO_CONVERT (1<<24)
|
||||||
#define BACKUP_FILE (1<<25)
|
#define BACKUP_FILE (1<<25)
|
||||||
#define NO_RCFILE (1<<26)
|
#define NO_RCFILE (1<<26)
|
||||||
@ -283,11 +284,12 @@ typedef struct historyheadtype {
|
|||||||
#define NANO_CONTROL_X 24
|
#define NANO_CONTROL_X 24
|
||||||
#define NANO_CONTROL_Y 25
|
#define NANO_CONTROL_Y 25
|
||||||
#define NANO_CONTROL_Z 26
|
#define NANO_CONTROL_Z 26
|
||||||
|
#define NANO_CONTROL_3 27
|
||||||
#define NANO_CONTROL_4 28
|
#define NANO_CONTROL_4 28
|
||||||
#define NANO_CONTROL_5 29
|
#define NANO_CONTROL_5 29
|
||||||
#define NANO_CONTROL_6 30
|
#define NANO_CONTROL_6 30
|
||||||
#define NANO_CONTROL_7 31
|
#define NANO_CONTROL_7 31
|
||||||
|
#define NANO_CONTROL_8 127
|
||||||
|
|
||||||
#define NANO_ALT_A 'a'
|
#define NANO_ALT_A 'a'
|
||||||
#define NANO_ALT_B 'b'
|
#define NANO_ALT_B 'b'
|
||||||
|
9
proto.h
9
proto.h
@ -424,6 +424,14 @@ int check_wildcard_match(const char *text, const char *pattern);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Public functions in winio.c */
|
/* Public functions in winio.c */
|
||||||
|
int get_kbinput(WINDOW *win, int *meta, int rebind_delete);
|
||||||
|
char *get_verbatim_kbinput(WINDOW *win, int *kbinput_len);
|
||||||
|
int get_ignored_kbinput(WINDOW *win);
|
||||||
|
int get_accepted_kbinput(WINDOW *win, int kbinput, int *meta,
|
||||||
|
int rebind_delete);
|
||||||
|
int get_ascii_kbinput(WINDOW *win, int kbinput);
|
||||||
|
int get_escape_seq_kbinput(WINDOW *win, int kbinput);
|
||||||
|
int get_skip_tilde_kbinput(WINDOW *win, int errval, int retval);
|
||||||
int do_first_line(void);
|
int do_first_line(void);
|
||||||
int do_last_line(void);
|
int do_last_line(void);
|
||||||
int xpt(const filestruct *fileptr, int index);
|
int xpt(const filestruct *fileptr, int index);
|
||||||
@ -482,7 +490,6 @@ int do_cursorpos(int constant);
|
|||||||
int do_cursorpos_void(void);
|
int do_cursorpos_void(void);
|
||||||
int line_len(const char *ptr);
|
int line_len(const char *ptr);
|
||||||
int do_help(void);
|
int do_help(void);
|
||||||
int keypad_on(WINDOW *win, int newval);
|
|
||||||
void do_replace_highlight(int highlight_flag, const char *word);
|
void do_replace_highlight(int highlight_flag, const char *word);
|
||||||
void fix_editbot(void);
|
void fix_editbot(void);
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
2
rcfile.c
2
rcfile.c
@ -49,7 +49,6 @@ const static rcoption rcopts[] = {
|
|||||||
#ifndef DISABLE_WRAPJUSTIFY
|
#ifndef DISABLE_WRAPJUSTIFY
|
||||||
{"fill", 0},
|
{"fill", 0},
|
||||||
#endif
|
#endif
|
||||||
{"keypad", ALT_KEYPAD},
|
|
||||||
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
|
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
|
||||||
{"mouse", USE_MOUSE},
|
{"mouse", USE_MOUSE},
|
||||||
#endif
|
#endif
|
||||||
@ -68,6 +67,7 @@ const static rcoption rcopts[] = {
|
|||||||
{"operatingdir", 0},
|
{"operatingdir", 0},
|
||||||
#endif
|
#endif
|
||||||
{"preserve", PRESERVE},
|
{"preserve", PRESERVE},
|
||||||
|
{"rebinddelete", REBIND_DELETE},
|
||||||
#ifndef DISABLE_JUSTIFY
|
#ifndef DISABLE_JUSTIFY
|
||||||
{"quotestr", 0},
|
{"quotestr", 0},
|
||||||
#endif
|
#endif
|
||||||
|
445
winio.c
445
winio.c
@ -34,6 +34,295 @@ static int statblank = 0; /* Number of keystrokes left after
|
|||||||
we call statusbar(), before we
|
we call statusbar(), before we
|
||||||
actually blank the statusbar */
|
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, int rebind_delete)
|
||||||
|
{
|
||||||
|
int kbinput, retval;
|
||||||
|
|
||||||
|
kbinput = get_ignored_kbinput(win);
|
||||||
|
retval = get_accepted_kbinput(win, kbinput, meta, rebind_delete);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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)
|
||||||
|
{
|
||||||
|
char *verbatim_kbinput;
|
||||||
|
int kbinput = wgetch(win);
|
||||||
|
|
||||||
|
verbatim_kbinput = charalloc(1);
|
||||||
|
verbatim_kbinput[0] = kbinput;
|
||||||
|
*kbinput_len = 1;
|
||||||
|
|
||||||
|
if (kbinput >= '0' && kbinput <= '2')
|
||||||
|
/* 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);
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
nodelay(win, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "get_verbatim_kbinput(): verbatim_kbinput = %s\n", verbatim_kbinput);
|
||||||
|
#endif
|
||||||
|
return verbatim_kbinput;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Swallow input characters that should be quietly ignored, and return
|
||||||
|
* the first input character that shouldn't be. */
|
||||||
|
int get_ignored_kbinput(WINDOW *win)
|
||||||
|
{
|
||||||
|
int kbinput;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
kbinput = wgetch(win);
|
||||||
|
switch (kbinput) {
|
||||||
|
case ERR:
|
||||||
|
case KEY_RESIZE:
|
||||||
|
#ifdef PDCURSES
|
||||||
|
case KEY_SHIFT_L:
|
||||||
|
case KEY_SHIFT_R:
|
||||||
|
case KEY_CONTROL_L:
|
||||||
|
case KEY_CONTROL_R:
|
||||||
|
case KEY_ALT_L:
|
||||||
|
case KEY_ALT_R:
|
||||||
|
#endif
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "get_ignored_kbinput(): kbinput = %d\n", kbinput);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return kbinput;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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,
|
||||||
|
int rebind_delete)
|
||||||
|
{
|
||||||
|
*meta = 0;
|
||||||
|
|
||||||
|
switch (kbinput) {
|
||||||
|
case NANO_CONTROL_3: /* Escape */
|
||||||
|
switch (kbinput = wgetch(win)) {
|
||||||
|
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 */
|
||||||
|
if (kbinput >= '0' && kbinput <= '2')
|
||||||
|
kbinput = get_ascii_kbinput(win, kbinput);
|
||||||
|
/* Esc Esc [character] == Ctrl-[character];
|
||||||
|
* Ctrl-Space (Ctrl-2) == Ctrl-@ == Ctrl-` */
|
||||||
|
else if (kbinput == ' ' || kbinput == '@' || kbinput == '`')
|
||||||
|
kbinput = NANO_CONTROL_SPACE;
|
||||||
|
/* Ctrl-3 (Ctrl-[, Esc) to Ctrl-7 (Ctrl-_) */
|
||||||
|
else if (kbinput >= '3' && kbinput <= '7')
|
||||||
|
kbinput -= 24;
|
||||||
|
/* Ctrl-8 (Ctrl-?) */
|
||||||
|
else if (kbinput == '8' || kbinput == '?')
|
||||||
|
kbinput = NANO_CONTROL_8;
|
||||||
|
/* Ctrl-A to Ctrl-_ */
|
||||||
|
else if (kbinput >= 'A' && kbinput <= '_')
|
||||||
|
kbinput -= 64;
|
||||||
|
/* Ctrl-A to Ctrl-Z */
|
||||||
|
else if (kbinput >= 'a' && kbinput <= 'z')
|
||||||
|
kbinput -= 96;
|
||||||
|
break;
|
||||||
|
/* Terminal breakage, part 1: We shouldn't get an escape
|
||||||
|
* sequence here for terminals that support Delete, but
|
||||||
|
* we do sometimes on FreeBSD. Thank you, Wouter van
|
||||||
|
* Hemel. */
|
||||||
|
case '[':
|
||||||
|
nodelay(win, TRUE);
|
||||||
|
kbinput = wgetch(win);
|
||||||
|
switch (kbinput) {
|
||||||
|
case ERR:
|
||||||
|
kbinput = '[';
|
||||||
|
*meta = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
kbinput = get_escape_seq_kbinput(win, kbinput);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
nodelay(win, FALSE);
|
||||||
|
break;
|
||||||
|
case '`':
|
||||||
|
/* Esc Space == Esc ` */
|
||||||
|
kbinput = ' ';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* Esc [character] == Meta-[character] */
|
||||||
|
if (isupper(kbinput))
|
||||||
|
kbinput = tolower(kbinput);
|
||||||
|
*meta = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case KEY_DOWN:
|
||||||
|
kbinput = NANO_DOWN_KEY;
|
||||||
|
break;
|
||||||
|
case KEY_UP:
|
||||||
|
kbinput = NANO_UP_KEY;
|
||||||
|
break;
|
||||||
|
case KEY_LEFT:
|
||||||
|
kbinput = NANO_BACK_KEY;
|
||||||
|
break;
|
||||||
|
case KEY_RIGHT:
|
||||||
|
kbinput = NANO_FORWARD_KEY;
|
||||||
|
break;
|
||||||
|
case KEY_HOME:
|
||||||
|
kbinput = NANO_HOME_KEY;
|
||||||
|
break;
|
||||||
|
case KEY_BACKSPACE:
|
||||||
|
kbinput = NANO_BACKSPACE_KEY;
|
||||||
|
break;
|
||||||
|
case KEY_DC:
|
||||||
|
/* Terminal breakage, part 2: We should only get KEY_DC when
|
||||||
|
* hitting Delete, but we get it when hitting Backspace
|
||||||
|
* sometimes on FreeBSD. Thank you, Lee Nelson. */
|
||||||
|
kbinput = (rebind_delete) ? NANO_BACKSPACE_KEY : NANO_DELETE_KEY;
|
||||||
|
break;
|
||||||
|
case KEY_IC:
|
||||||
|
kbinput = NANO_INSERTFILE_KEY;
|
||||||
|
break;
|
||||||
|
case KEY_NPAGE:
|
||||||
|
kbinput = NANO_NEXTPAGE_KEY;
|
||||||
|
break;
|
||||||
|
case KEY_PPAGE:
|
||||||
|
kbinput = NANO_PREVPAGE_KEY;
|
||||||
|
break;
|
||||||
|
case KEY_ENTER:
|
||||||
|
kbinput = NANO_ENTER_KEY;
|
||||||
|
break;
|
||||||
|
case KEY_END:
|
||||||
|
kbinput = NANO_END_KEY;
|
||||||
|
break;
|
||||||
|
case KEY_SUSPEND:
|
||||||
|
kbinput = NANO_SUSPEND_KEY;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "get_accepted_kbinput(): kbinput = %d, meta = %d\n", kbinput, *meta);
|
||||||
|
#endif
|
||||||
|
return kbinput;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Translate a three-digit decimal ASCII code from 000-255 into the
|
||||||
|
* corresponding ASCII character. */
|
||||||
|
int get_ascii_kbinput(WINDOW *win, int kbinput)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
switch (kbinput) {
|
||||||
|
case '0':
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
retval = (kbinput - 48) * 100;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return kbinput;
|
||||||
|
}
|
||||||
|
|
||||||
|
kbinput = wgetch(win);
|
||||||
|
switch (kbinput) {
|
||||||
|
case '0':
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
retval += (kbinput - 48) * 10;
|
||||||
|
break;
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
if (retval < 200) {
|
||||||
|
retval += (kbinput - 48) * 10;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return kbinput;
|
||||||
|
}
|
||||||
|
|
||||||
|
kbinput = wgetch(win);
|
||||||
|
switch (kbinput) {
|
||||||
|
case '0':
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
retval += kbinput - 48;
|
||||||
|
break;
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
if (retval < 250) {
|
||||||
|
retval += kbinput - 48;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return kbinput;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "get_ascii_kbinput(): kbinput = %d\n", kbinput);
|
||||||
|
#endif
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Translate common escape sequences for some keys. These are generated
|
||||||
|
* when the terminal doesn't support those keys. Assume nodelay(win) is
|
||||||
|
* TRUE. */
|
||||||
|
int get_escape_seq_kbinput(WINDOW *win, int kbinput)
|
||||||
|
{
|
||||||
|
switch (kbinput) {
|
||||||
|
case '3':
|
||||||
|
/* Esc [ 3 ~ == kdch1 on many terminals. */
|
||||||
|
kbinput = get_skip_tilde_kbinput(win, kbinput, NANO_DELETE_KEY);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return kbinput;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If there is no next character, return the passed-in error value. If
|
||||||
|
* the next character's a tilde, eat it and return the passed-in
|
||||||
|
* return value. Otherwise, return the next character. Assume
|
||||||
|
* nodelay(win) is TRUE. */
|
||||||
|
int get_skip_tilde_kbinput(WINDOW *win, int errval, int retval)
|
||||||
|
{
|
||||||
|
int kbinput = wgetch(win);
|
||||||
|
switch (kbinput) {
|
||||||
|
case ERR:
|
||||||
|
return errval;
|
||||||
|
case '~':
|
||||||
|
return retval;
|
||||||
|
default:
|
||||||
|
return kbinput;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int do_first_line(void)
|
int do_first_line(void)
|
||||||
{
|
{
|
||||||
current = fileage;
|
current = fileage;
|
||||||
@ -197,6 +486,7 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
int kbinput;
|
int kbinput;
|
||||||
|
int meta;
|
||||||
static int x = -1;
|
static int x = -1;
|
||||||
/* the cursor position in 'answer' */
|
/* the cursor position in 'answer' */
|
||||||
int xend;
|
int xend;
|
||||||
@ -247,7 +537,7 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
|
|||||||
input */
|
input */
|
||||||
wrefresh(edit);
|
wrefresh(edit);
|
||||||
|
|
||||||
while ((kbinput = wgetch(bottomwin)) != 13) {
|
while ((kbinput = get_kbinput(bottomwin, &meta, ISSET(REBIND_DELETE))) != NANO_ENTER_KEY) {
|
||||||
for (t = s; t != NULL; t = t->next) {
|
for (t = s; t != NULL; t = t->next) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "Aha! \'%c\' (%d)\n", kbinput, kbinput);
|
fprintf(stderr, "Aha! \'%c\' (%d)\n", kbinput, kbinput);
|
||||||
@ -273,64 +563,45 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
|
|||||||
tabbed = 0;
|
tabbed = 0;
|
||||||
|
|
||||||
switch (kbinput) {
|
switch (kbinput) {
|
||||||
|
|
||||||
/* Stuff we want to equate with <enter>, ASCII 13 */
|
|
||||||
case 343:
|
|
||||||
ungetch(13); /* Enter on iris-ansi $TERM, sometimes */
|
|
||||||
break;
|
|
||||||
/* Stuff we want to ignore */
|
|
||||||
#ifdef PDCURSES
|
|
||||||
case 541:
|
|
||||||
case 542:
|
|
||||||
case 543: /* Right ctrl again */
|
|
||||||
case 544:
|
|
||||||
case 545: /* Right alt again */
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
|
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
|
||||||
case KEY_MOUSE:
|
case KEY_MOUSE:
|
||||||
do_mouse();
|
do_mouse();
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case NANO_HOME_KEY:
|
case NANO_HOME_KEY:
|
||||||
case KEY_HOME:
|
|
||||||
x = 0;
|
x = 0;
|
||||||
break;
|
break;
|
||||||
case NANO_END_KEY:
|
case NANO_END_KEY:
|
||||||
case KEY_END:
|
|
||||||
x = xend;
|
x = xend;
|
||||||
break;
|
break;
|
||||||
case KEY_RIGHT:
|
|
||||||
case NANO_FORWARD_KEY:
|
case NANO_FORWARD_KEY:
|
||||||
if (x < xend)
|
if (x < xend)
|
||||||
x++;
|
x++;
|
||||||
break;
|
break;
|
||||||
case NANO_CONTROL_D:
|
case NANO_DELETE_KEY:
|
||||||
if (x < xend) {
|
if (x < xend) {
|
||||||
memmove(answer + x, answer + x + 1, xend - x);
|
memmove(answer + x, answer + x + 1, xend - x);
|
||||||
xend--;
|
xend--;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NANO_CONTROL_K:
|
case NANO_CUT_KEY:
|
||||||
case NANO_CONTROL_U:
|
case NANO_UNCUT_KEY:
|
||||||
null_at(&answer, 0);
|
null_at(&answer, 0);
|
||||||
xend = 0;
|
xend = 0;
|
||||||
x = 0;
|
x = 0;
|
||||||
break;
|
break;
|
||||||
case KEY_BACKSPACE:
|
case NANO_BACKSPACE_KEY:
|
||||||
case 127:
|
|
||||||
case NANO_CONTROL_H:
|
|
||||||
if (x > 0) {
|
if (x > 0) {
|
||||||
memmove(answer + x - 1, answer + x, xend - x + 1);
|
memmove(answer + x - 1, answer + x, xend - x + 1);
|
||||||
x--;
|
x--;
|
||||||
xend--;
|
xend--;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NANO_CONTROL_I:
|
case NANO_TAB_KEY:
|
||||||
#ifndef NANO_SMALL
|
#ifndef NANO_SMALL
|
||||||
/* tab history completion */
|
/* tab history completion */
|
||||||
if (history_list != NULL) {
|
if (history_list != NULL) {
|
||||||
if (!complete || last_kbinput != NANO_CONTROL_I) {
|
if (!complete || last_kbinput != NANO_TAB_KEY) {
|
||||||
history_list->current = (historytype *)history_list;
|
history_list->current = (historytype *)history_list;
|
||||||
history_list->len = strlen(answer);
|
history_list->len = strlen(answer);
|
||||||
}
|
}
|
||||||
@ -358,15 +629,12 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case KEY_LEFT:
|
|
||||||
case NANO_BACK_KEY:
|
case NANO_BACK_KEY:
|
||||||
if (x > 0)
|
if (x > 0)
|
||||||
x--;
|
x--;
|
||||||
break;
|
break;
|
||||||
case KEY_UP:
|
|
||||||
case NANO_UP_KEY:
|
case NANO_UP_KEY:
|
||||||
#ifndef NANO_SMALL
|
#ifndef NANO_SMALL
|
||||||
do_upkey:
|
|
||||||
if (history_list != NULL) {
|
if (history_list != NULL) {
|
||||||
|
|
||||||
/* if currentbuf is NULL, or if use_cb is 1, currentbuf
|
/* if currentbuf is NULL, or if use_cb is 1, currentbuf
|
||||||
@ -407,10 +675,8 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case KEY_DOWN:
|
|
||||||
case NANO_DOWN_KEY:
|
case NANO_DOWN_KEY:
|
||||||
#ifndef NANO_SMALL
|
#ifndef NANO_SMALL
|
||||||
do_downkey:
|
|
||||||
if (history_list != NULL) {
|
if (history_list != NULL) {
|
||||||
|
|
||||||
/* get newer search from the history list and save it
|
/* get newer search from the history list and save it
|
||||||
@ -452,71 +718,6 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case KEY_DC:
|
|
||||||
goto do_deletekey;
|
|
||||||
case 27:
|
|
||||||
switch (kbinput = wgetch(edit)) {
|
|
||||||
case 'O':
|
|
||||||
switch (kbinput = wgetch(edit)) {
|
|
||||||
case 'F':
|
|
||||||
x = xend;
|
|
||||||
break;
|
|
||||||
case 'H':
|
|
||||||
x = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case '[':
|
|
||||||
switch (kbinput = wgetch(edit)) {
|
|
||||||
case 'A':
|
|
||||||
#ifndef NANO_SMALL
|
|
||||||
goto do_upkey;
|
|
||||||
#else
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case 'B':
|
|
||||||
#ifndef NANO_SMALL
|
|
||||||
goto do_downkey;
|
|
||||||
#else
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case 'C':
|
|
||||||
if (x < xend)
|
|
||||||
x++;
|
|
||||||
break;
|
|
||||||
case 'D':
|
|
||||||
if (x > 0)
|
|
||||||
x--;
|
|
||||||
break;
|
|
||||||
case 'F':
|
|
||||||
x = xend;
|
|
||||||
break;
|
|
||||||
case 'H':
|
|
||||||
x = 0;
|
|
||||||
break;
|
|
||||||
case '1':
|
|
||||||
case '7':
|
|
||||||
x = 0;
|
|
||||||
goto skip_tilde;
|
|
||||||
case '3':
|
|
||||||
do_deletekey:
|
|
||||||
if (x < xend) {
|
|
||||||
memmove(answer + x, answer + x + 1, xend - x);
|
|
||||||
xend--;
|
|
||||||
}
|
|
||||||
goto skip_tilde;
|
|
||||||
case '4':
|
|
||||||
case '8':
|
|
||||||
x = xend;
|
|
||||||
skip_tilde:
|
|
||||||
nodelay(edit, TRUE);
|
|
||||||
kbinput = wgetch(edit);
|
|
||||||
if (kbinput == '~' || kbinput == ERR)
|
|
||||||
kbinput = -1;
|
|
||||||
nodelay(edit, FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
for (t = s; t != NULL; t = t->next) {
|
for (t = s; t != NULL; t = t->next) {
|
||||||
@ -524,17 +725,14 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
|
|||||||
fprintf(stderr, "Aha! \'%c\' (%d)\n", kbinput,
|
fprintf(stderr, "Aha! \'%c\' (%d)\n", kbinput,
|
||||||
kbinput);
|
kbinput);
|
||||||
#endif
|
#endif
|
||||||
if (kbinput == t->val || kbinput == t->val - 32)
|
if (meta == 1 && (kbinput == t->val || kbinput == t->val - 32))
|
||||||
/* We hit an Alt key. Do like above. We don't
|
/* We hit an Alt key. Do like above. We don't
|
||||||
just ungetch() the letter and let it get
|
just ungetch() the letter and let it get
|
||||||
caught above cause that screws the
|
caught above cause that screws the
|
||||||
keypad... */
|
keypad... */
|
||||||
return t->val;
|
return t->val;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (kbinput < 32)
|
if (kbinput < 32)
|
||||||
break;
|
break;
|
||||||
answer = charealloc(answer, xend + 2);
|
answer = charealloc(answer, xend + 2);
|
||||||
@ -1546,7 +1744,7 @@ int line_len(const char *ptr)
|
|||||||
int do_help(void)
|
int do_help(void)
|
||||||
{
|
{
|
||||||
#ifndef DISABLE_HELP
|
#ifndef DISABLE_HELP
|
||||||
int i, page = 0, kbinput = 0, no_more = 0, kp;
|
int i, page = 0, kbinput = -1, meta, no_more = 0;
|
||||||
int no_help_flag = 0;
|
int no_help_flag = 0;
|
||||||
const shortcut *oldshortcut;
|
const shortcut *oldshortcut;
|
||||||
|
|
||||||
@ -1563,8 +1761,6 @@ int do_help(void)
|
|||||||
|
|
||||||
currshortcut = help_list;
|
currshortcut = help_list;
|
||||||
|
|
||||||
kp = keypad_on(edit, 1);
|
|
||||||
|
|
||||||
if (ISSET(NO_HELP)) {
|
if (ISSET(NO_HELP)) {
|
||||||
|
|
||||||
/* Well, if we're going to do this, we should at least
|
/* Well, if we're going to do this, we should at least
|
||||||
@ -1586,32 +1782,8 @@ int do_help(void)
|
|||||||
do_mouse();
|
do_mouse();
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case 27:
|
|
||||||
kbinput = wgetch(edit);
|
|
||||||
switch(kbinput) {
|
|
||||||
case '[':
|
|
||||||
kbinput = wgetch(edit);
|
|
||||||
switch(kbinput) {
|
|
||||||
case '5': /* Alt-[-5 = Page Up */
|
|
||||||
wgetch(edit);
|
|
||||||
goto do_pageupkey;
|
|
||||||
case 'V': /* Alt-[-V = Page Up in Hurd Console */
|
|
||||||
case 'I': /* Alt-[-I = Page Up - FreeBSD Console */
|
|
||||||
goto do_pageupkey;
|
|
||||||
case '6': /* Alt-[-6 = Page Down */
|
|
||||||
wgetch(edit);
|
|
||||||
goto do_pagedownkey;
|
|
||||||
case 'U': /* Alt-[-U = Page Down in Hurd Console */
|
|
||||||
case 'G': /* Alt-[-G = Page Down - FreeBSD Console */
|
|
||||||
goto do_pagedownkey;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NANO_NEXTPAGE_KEY:
|
case NANO_NEXTPAGE_KEY:
|
||||||
case NANO_NEXTPAGE_FKEY:
|
case NANO_NEXTPAGE_FKEY:
|
||||||
case KEY_NPAGE:
|
|
||||||
do_pagedownkey:
|
|
||||||
if (!no_more) {
|
if (!no_more) {
|
||||||
blank_edit();
|
blank_edit();
|
||||||
page++;
|
page++;
|
||||||
@ -1619,8 +1791,6 @@ int do_help(void)
|
|||||||
break;
|
break;
|
||||||
case NANO_PREVPAGE_KEY:
|
case NANO_PREVPAGE_KEY:
|
||||||
case NANO_PREVPAGE_FKEY:
|
case NANO_PREVPAGE_FKEY:
|
||||||
case KEY_PPAGE:
|
|
||||||
do_pageupkey:
|
|
||||||
if (page > 0) {
|
if (page > 0) {
|
||||||
no_more = 0;
|
no_more = 0;
|
||||||
blank_edit();
|
blank_edit();
|
||||||
@ -1649,8 +1819,7 @@ int do_help(void)
|
|||||||
no_more = 1;
|
no_more = 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} while ((kbinput = wgetch(edit)) != NANO_EXIT_KEY &&
|
} while ((kbinput = get_kbinput(edit, &meta, ISSET(REBIND_DELETE))) != NANO_EXIT_KEY && kbinput != NANO_EXIT_FKEY);
|
||||||
kbinput != NANO_EXIT_FKEY);
|
|
||||||
|
|
||||||
currshortcut = oldshortcut;
|
currshortcut = oldshortcut;
|
||||||
|
|
||||||
@ -1664,7 +1833,6 @@ int do_help(void)
|
|||||||
|
|
||||||
curs_set(1);
|
curs_set(1);
|
||||||
edit_refresh();
|
edit_refresh();
|
||||||
kp = keypad_on(edit, kp);
|
|
||||||
|
|
||||||
/* The help_init() at the beginning allocated help_text, which has
|
/* The help_init() at the beginning allocated help_text, which has
|
||||||
now been written to screen. */
|
now been written to screen. */
|
||||||
@ -1678,19 +1846,6 @@ int do_help(void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int keypad_on(WINDOW *win, int newval)
|
|
||||||
{
|
|
||||||
/* This is taken right from aumix. Don't sue me. */
|
|
||||||
#ifdef HAVE_USEKEYPAD
|
|
||||||
int old = win->_use_keypad;
|
|
||||||
keypad(win, newval);
|
|
||||||
return old;
|
|
||||||
#else
|
|
||||||
keypad(win, newval);
|
|
||||||
return 1;
|
|
||||||
#endif /* HAVE_USEKEYPAD */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Highlight the current word being replaced or spell checked. */
|
/* Highlight the current word being replaced or spell checked. */
|
||||||
void do_replace_highlight(int highlight_flag, const char *word)
|
void do_replace_highlight(int highlight_flag, const char *word)
|
||||||
{
|
{
|
||||||
|
Загрузка…
Ссылка в новой задаче
Block a user