mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Add support for more keyboard shortcuts (#410)
Add extra key bindings to the emacs and vi modes This patch adds the following key bindings to the emacs and vi editing modes: - Support for Home key sequences ^[[1~ and ^[[7~ as well as End key sequences ^[[4~ and ^[[8~. - Support for arrow key sequences ^[OA, ^[OB, ^[OC and ^[OD. - Support for the following keyboard shortcuts (if the platform supports the expected escape sequence): - Ctrl-Left Arrow: Go back one word - Alt-Left Arrow: Go back one word (Not supported on Haiku) - Ctrl-Right Arrow: Go forward one word - Alt-Right Arrow: Go forward one word (Not supported on Haiku) - Ctrl-G: Cancel reverse search - Ctrl-Delete: Delete next word (Not supported on Haiku) - Added a key binding for the Insert key, which differs in the emacs and vi editing modes: - In emacs mode, Insert escapes the next character. - In vi mode, Insert will switch the editor to insert mode (like in vim). src/cmd/ksh93/edit/{emacs,vi}.c: - Add support for the <M-Left> and <M-Right> sequences. Like in bash and mksh, these shortcuts move the cursor one word backward or forward (like the <Ctrl-Left> and <Ctrl-Right> shortcuts). - Only attempt to process these shortcuts if the escape sequence begins with $'\E[1;'. src/cmd/ksh93/edit/vi.c: - If the shell isn't doing a reverse search, insert the bell character when Ctrl+G is input. - Add the Ctrl-Delete shortcut as an alias of 'dw'. Calling ed_ungetchar twice does not work for 'dw', so Ctrl-Delete was implemented by using a vp->del_word variable. Co-authored-by: Martijn Dekker <martijn@inlv.org>
This commit is contained in:
parent
9c313c7fe3
commit
9a5af738ef
6 changed files with 334 additions and 8 deletions
9
ANNOUNCE
9
ANNOUNCE
|
@ -56,6 +56,15 @@ New features in built-in commands:
|
||||||
Note that to use these options the operating system must support the
|
Note that to use these options the operating system must support the
|
||||||
corresponding resource limit.
|
corresponding resource limit.
|
||||||
|
|
||||||
|
New command line editor features:
|
||||||
|
|
||||||
|
- Various keys on extended PC keyboards are now handled as expected in the
|
||||||
|
emacs and vi built-in line editors: Ctrl or Alt + left or right arrow (go
|
||||||
|
back or forward one word), Ctrl+G (cancel reverse search), Ctrl+Delete
|
||||||
|
(delete next word). In addition, the Insert key now escapes the next
|
||||||
|
character in emacs and enters insert mode in vi, and the arrow keys are
|
||||||
|
recognized on more terminals.
|
||||||
|
|
||||||
New features in shell options:
|
New features in shell options:
|
||||||
|
|
||||||
- The new --histreedit and --histverify options modify history expansion
|
- The new --histreedit and --histverify options modify history expansion
|
||||||
|
|
19
NEWS
19
NEWS
|
@ -3,6 +3,25 @@ For full details, see the git log at: https://github.com/ksh93/ksh/tree/1.0
|
||||||
|
|
||||||
Any uppercase BUG_* names are modernish shell bug IDs.
|
Any uppercase BUG_* names are modernish shell bug IDs.
|
||||||
|
|
||||||
|
2022-01-31:
|
||||||
|
|
||||||
|
- Improved keyboard support for the vi and emacs built-in line editors:
|
||||||
|
- Added support for Home key sequences ^[[1~ and ^[[7~ as well as End key
|
||||||
|
sequences ^[[4~ and ^[[8~.
|
||||||
|
- Added support for arrow key sequences ^[OA, ^[OB, ^[OC and ^[OD.
|
||||||
|
- Added support for the following keyboard shortcuts (if the platform
|
||||||
|
supports the expected escape sequence):
|
||||||
|
- Ctrl-Left Arrow: Go back one word
|
||||||
|
- Alt-Left Arrow: Go back one word (Not supported on Haiku)
|
||||||
|
- Ctrl-Right Arrow: Go forward one word
|
||||||
|
- Alt-Right Arrow: Go forward one word (Not supported on Haiku)
|
||||||
|
- Ctrl-G: Cancel reverse search
|
||||||
|
- Ctrl-Delete: Delete next word (Not supported on Haiku)
|
||||||
|
- Added a keybind for the Insert key, which differs in the emacs and vi
|
||||||
|
editing modes:
|
||||||
|
- In emacs mode, Insert escapes the next character.
|
||||||
|
- In vi mode, Insert will switch the editor to insert mode (like in vim).
|
||||||
|
|
||||||
2022-01-28:
|
2022-01-28:
|
||||||
|
|
||||||
- Fixed longstanding job control breakage that occurred on the interactive
|
- Fixed longstanding job control breakage that occurred on the interactive
|
||||||
|
|
|
@ -780,7 +780,7 @@ static void putstring(Emacs_t* ep,register char *sp)
|
||||||
static int escape(register Emacs_t* ep,register genchar *out,int count)
|
static int escape(register Emacs_t* ep,register genchar *out,int count)
|
||||||
{
|
{
|
||||||
register int i,value;
|
register int i,value;
|
||||||
int digit,ch;
|
int digit,ch,c,d;
|
||||||
digit = 0;
|
digit = 0;
|
||||||
value = 0;
|
value = 0;
|
||||||
while ((i=ed_getchar(ep->ed,0)),digit(i))
|
while ((i=ed_getchar(ep->ed,0)),digit(i))
|
||||||
|
@ -827,6 +827,7 @@ static int escape(register Emacs_t* ep,register genchar *out,int count)
|
||||||
case 'd': /* M-d == delete word */
|
case 'd': /* M-d == delete word */
|
||||||
case 'c': /* M-c == uppercase */
|
case 'c': /* M-c == uppercase */
|
||||||
case 'f': /* M-f == move cursor forward one word */
|
case 'f': /* M-f == move cursor forward one word */
|
||||||
|
forward:
|
||||||
{
|
{
|
||||||
i = cur;
|
i = cur;
|
||||||
while(value-- && i<eol)
|
while(value-- && i<eol)
|
||||||
|
@ -883,6 +884,7 @@ static int escape(register Emacs_t* ep,register genchar *out,int count)
|
||||||
case DELETE :
|
case DELETE :
|
||||||
case '\b':
|
case '\b':
|
||||||
case 'h': /* M-h == delete the previous word */
|
case 'h': /* M-h == delete the previous word */
|
||||||
|
backward:
|
||||||
{
|
{
|
||||||
i = cur;
|
i = cur;
|
||||||
while(value-- && i>0)
|
while(value-- && i>0)
|
||||||
|
@ -1079,6 +1081,7 @@ static int escape(register Emacs_t* ep,register genchar *out,int count)
|
||||||
return(-1);
|
return(-1);
|
||||||
#endif
|
#endif
|
||||||
case '[': /* feature not in book */
|
case '[': /* feature not in book */
|
||||||
|
case 'O': /* after running top <ESC>O instead of <ESC>[ */
|
||||||
switch(i=ed_getchar(ep->ed,1))
|
switch(i=ed_getchar(ep->ed,1))
|
||||||
{
|
{
|
||||||
case 'A':
|
case 'A':
|
||||||
|
@ -1131,8 +1134,53 @@ static int escape(register Emacs_t* ep,register genchar *out,int count)
|
||||||
/* VT220 End key */
|
/* VT220 End key */
|
||||||
ed_ungetchar(ep->ed,cntl('E'));
|
ed_ungetchar(ep->ed,cntl('E'));
|
||||||
return(-1);
|
return(-1);
|
||||||
|
case '1':
|
||||||
|
case '7':
|
||||||
|
/*
|
||||||
|
* ed_getchar() can only be run once on each character
|
||||||
|
* and shouldn't be used on non-existent characters.
|
||||||
|
*/
|
||||||
|
ch = ed_getchar(ep->ed,1);
|
||||||
|
if(ch == '~')
|
||||||
|
{ /* Home key */
|
||||||
|
ed_ungetchar(ep->ed,cntl('A'));
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
else if(i == '1' && ch == ';')
|
||||||
|
{
|
||||||
|
c = ed_getchar(ep->ed,1);
|
||||||
|
if(c == '3' || c == '5' || c == '9') /* 3 == Alt, 5 == Ctrl, 9 == iTerm2 Alt */
|
||||||
|
{
|
||||||
|
d = ed_getchar(ep->ed,1);
|
||||||
|
switch(d)
|
||||||
|
{
|
||||||
|
case 'D': /* Ctrl/Alt-Left arrow (go back one word) */
|
||||||
|
ch = 'b';
|
||||||
|
goto backward;
|
||||||
|
case 'C': /* Ctrl/Alt-Right arrow (go forward one word) */
|
||||||
|
ch = 'f';
|
||||||
|
goto forward;
|
||||||
|
}
|
||||||
|
ed_ungetchar(ep->ed,d);
|
||||||
|
}
|
||||||
|
ed_ungetchar(ep->ed,c);
|
||||||
|
}
|
||||||
|
ed_ungetchar(ep->ed,ch);
|
||||||
|
ed_ungetchar(ep->ed,i);
|
||||||
|
return(-1);
|
||||||
|
case '2': /* Insert key */
|
||||||
|
ch = ed_getchar(ep->ed,1);
|
||||||
|
if(ch == '~')
|
||||||
|
{
|
||||||
|
ed_ungetchar(ep->ed, cntl('V'));
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
ed_ungetchar(ep->ed,ch);
|
||||||
|
ed_ungetchar(ep->ed,i);
|
||||||
|
return(-1);
|
||||||
case '3':
|
case '3':
|
||||||
if((ch=ed_getchar(ep->ed,1))=='~')
|
ch = ed_getchar(ep->ed,1);
|
||||||
|
if(ch == '~')
|
||||||
{ /*
|
{ /*
|
||||||
* VT220 forward-delete key.
|
* VT220 forward-delete key.
|
||||||
* Since ERASECHAR and EOFCHAR are usually both mapped to ^D, we
|
* Since ERASECHAR and EOFCHAR are usually both mapped to ^D, we
|
||||||
|
@ -1143,6 +1191,47 @@ static int escape(register Emacs_t* ep,register genchar *out,int count)
|
||||||
ed_ungetchar(ep->ed,ERASECHAR);
|
ed_ungetchar(ep->ed,ERASECHAR);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
else if(ch == ';')
|
||||||
|
{
|
||||||
|
c = ed_getchar(ep->ed,1);
|
||||||
|
if(c == '5')
|
||||||
|
{
|
||||||
|
d = ed_getchar(ep->ed,1);
|
||||||
|
if(d == '~')
|
||||||
|
{
|
||||||
|
/* Ctrl-Delete (delete next word) */
|
||||||
|
ch = 'd';
|
||||||
|
goto forward;
|
||||||
|
}
|
||||||
|
ed_ungetchar(ep->ed,d);
|
||||||
|
}
|
||||||
|
ed_ungetchar(ep->ed,c);
|
||||||
|
}
|
||||||
|
ed_ungetchar(ep->ed,ch);
|
||||||
|
ed_ungetchar(ep->ed,i);
|
||||||
|
return(-1);
|
||||||
|
case '5': /* Haiku terminal Ctrl-Arrow key */
|
||||||
|
ch = ed_getchar(ep->ed,1);
|
||||||
|
switch(ch)
|
||||||
|
{
|
||||||
|
case 'D': /* Ctrl-Left arrow (go back one word) */
|
||||||
|
ch = 'b';
|
||||||
|
goto backward;
|
||||||
|
case 'C': /* Ctrl-Right arrow (go forward one word) */
|
||||||
|
ch = 'f';
|
||||||
|
goto forward;
|
||||||
|
}
|
||||||
|
ed_ungetchar(ep->ed,ch);
|
||||||
|
ed_ungetchar(ep->ed,i);
|
||||||
|
return(-1);
|
||||||
|
case '4':
|
||||||
|
case '8': /* rxvt */
|
||||||
|
ch = ed_getchar(ep->ed,1);
|
||||||
|
if(ch == '~')
|
||||||
|
{
|
||||||
|
ed_ungetchar(ep->ed,cntl('E')); /* End key */
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
ed_ungetchar(ep->ed,ch);
|
ed_ungetchar(ep->ed,ch);
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
default:
|
default:
|
||||||
|
@ -1288,7 +1377,7 @@ static void search(Emacs_t* ep,genchar *out,int direction)
|
||||||
goto restore;
|
goto restore;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(i == ep->ed->e_intr) /* end reverse search */
|
if(i == ep->ed->e_intr || i == cntl('G')) /* end reverse search */
|
||||||
goto restore;
|
goto restore;
|
||||||
if (i==usrkill)
|
if (i==usrkill)
|
||||||
{
|
{
|
||||||
|
|
|
@ -112,6 +112,7 @@ typedef struct _vi_
|
||||||
int U_saved; /* original virtual saved */
|
int U_saved; /* original virtual saved */
|
||||||
genchar *U_space; /* used for U command */
|
genchar *U_space; /* used for U command */
|
||||||
genchar *u_space; /* used for u command */
|
genchar *u_space; /* used for u command */
|
||||||
|
unsigned char del_word; /* used for Ctrl-Delete */
|
||||||
#ifdef FIORDCHK
|
#ifdef FIORDCHK
|
||||||
clock_t typeahead; /* typeahead occurred */
|
clock_t typeahead; /* typeahead occurred */
|
||||||
#else
|
#else
|
||||||
|
@ -753,7 +754,7 @@ static int cntlmode(Vi_t *vp)
|
||||||
if(mvcursor(vp,c))
|
if(mvcursor(vp,c))
|
||||||
{
|
{
|
||||||
sync_cursor(vp);
|
sync_cursor(vp);
|
||||||
if( c != '[' )
|
if( c != '[' && c != 'O' )
|
||||||
vp->repeat = 1;
|
vp->repeat = 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1036,7 +1037,7 @@ static int cntlmode(Vi_t *vp)
|
||||||
if(lookahead)
|
if(lookahead)
|
||||||
{
|
{
|
||||||
ed_ungetchar(vp->ed,c=ed_getchar(vp->ed,1));
|
ed_ungetchar(vp->ed,c=ed_getchar(vp->ed,1));
|
||||||
if(c=='[')
|
if(c=='[' || c=='O')
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
|
@ -1430,6 +1431,10 @@ static void getline(register Vi_t* vp,register int mode)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case cntl('G'):
|
||||||
|
if(mode!=SEARCH)
|
||||||
|
goto fallback;
|
||||||
|
/* FALLTHROUGH */
|
||||||
case UINTR:
|
case UINTR:
|
||||||
first_virt = 0;
|
first_virt = 0;
|
||||||
cdelete(vp,cur_virt+1, BAD);
|
cdelete(vp,cur_virt+1, BAD);
|
||||||
|
@ -1550,6 +1555,7 @@ static void getline(register Vi_t* vp,register int mode)
|
||||||
}
|
}
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
default:
|
default:
|
||||||
|
fallback:
|
||||||
if( mode == REPLACE )
|
if( mode == REPLACE )
|
||||||
{
|
{
|
||||||
if( cur_virt < last_virt )
|
if( cur_virt < last_virt )
|
||||||
|
@ -1583,7 +1589,7 @@ static void getline(register Vi_t* vp,register int mode)
|
||||||
|
|
||||||
static int mvcursor(register Vi_t* vp,register int motion)
|
static int mvcursor(register Vi_t* vp,register int motion)
|
||||||
{
|
{
|
||||||
register int count;
|
register int count, c, d;
|
||||||
register int tcur_virt;
|
register int tcur_virt;
|
||||||
register int incr = -1;
|
register int incr = -1;
|
||||||
register int bound = 0;
|
register int bound = 0;
|
||||||
|
@ -1612,7 +1618,8 @@ static int mvcursor(register Vi_t* vp,register int motion)
|
||||||
tcur_virt = last_virt;
|
tcur_virt = last_virt;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '[':
|
case '[': /* feature not in book */
|
||||||
|
case 'O': /* after running top <ESC>O instead of <ESC>[ */
|
||||||
switch(motion=ed_getchar(vp->ed,-1))
|
switch(motion=ed_getchar(vp->ed,-1))
|
||||||
{
|
{
|
||||||
case 'A':
|
case 'A':
|
||||||
|
@ -1659,6 +1666,47 @@ static int mvcursor(register Vi_t* vp,register int motion)
|
||||||
/* VT220 End key */
|
/* VT220 End key */
|
||||||
ed_ungetchar(vp->ed,'$');
|
ed_ungetchar(vp->ed,'$');
|
||||||
return(1);
|
return(1);
|
||||||
|
case '1':
|
||||||
|
case '7':
|
||||||
|
bound = ed_getchar(vp->ed,-1);
|
||||||
|
if(bound=='~')
|
||||||
|
{ /* Home key */
|
||||||
|
ed_ungetchar(vp->ed,'0');
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
else if(motion=='1' && bound==';')
|
||||||
|
{
|
||||||
|
c = ed_getchar(vp->ed,-1);
|
||||||
|
if(c == '3' || c == '5' || c == '9') /* 3 == Alt, 5 == Ctrl, 9 == iTerm2 Alt */
|
||||||
|
{
|
||||||
|
d = ed_getchar(vp->ed,-1);
|
||||||
|
switch(d)
|
||||||
|
{
|
||||||
|
case 'D': /* Ctrl/Alt-Left arrow (go back one word) */
|
||||||
|
ed_ungetchar(vp->ed, 'b');
|
||||||
|
return(1);
|
||||||
|
case 'C': /* Ctrl/Alt-Right arrow (go forward one word) */
|
||||||
|
ed_ungetchar(vp->ed, 'w');
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
ed_ungetchar(vp->ed,d);
|
||||||
|
}
|
||||||
|
ed_ungetchar(vp->ed,c);
|
||||||
|
}
|
||||||
|
ed_ungetchar(vp->ed,bound);
|
||||||
|
ed_ungetchar(vp->ed,motion);
|
||||||
|
return(0);
|
||||||
|
case '2':
|
||||||
|
bound = ed_getchar(vp->ed,-1);
|
||||||
|
if(bound=='~')
|
||||||
|
{
|
||||||
|
/* VT220 insert key */
|
||||||
|
ed_ungetchar(vp->ed,'i');
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
ed_ungetchar(vp->ed,bound);
|
||||||
|
ed_ungetchar(vp->ed,motion);
|
||||||
|
return(0);
|
||||||
case '3':
|
case '3':
|
||||||
bound = ed_getchar(vp->ed,-1);
|
bound = ed_getchar(vp->ed,-1);
|
||||||
if(bound=='~')
|
if(bound=='~')
|
||||||
|
@ -1667,6 +1715,48 @@ static int mvcursor(register Vi_t* vp,register int motion)
|
||||||
ed_ungetchar(vp->ed,'x');
|
ed_ungetchar(vp->ed,'x');
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
else if(bound==';')
|
||||||
|
{
|
||||||
|
c = ed_getchar(vp->ed,-1);
|
||||||
|
if(c == '5')
|
||||||
|
{
|
||||||
|
d = ed_getchar(vp->ed,-1);
|
||||||
|
if(d == '~')
|
||||||
|
{
|
||||||
|
/* Ctrl-Delete */
|
||||||
|
vp->del_word = 1;
|
||||||
|
ed_ungetchar(vp->ed,'d');
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
ed_ungetchar(vp->ed,d);
|
||||||
|
}
|
||||||
|
ed_ungetchar(vp->ed,c);
|
||||||
|
}
|
||||||
|
ed_ungetchar(vp->ed,bound);
|
||||||
|
ed_ungetchar(vp->ed,motion);
|
||||||
|
return(0);
|
||||||
|
case '5': /* Haiku terminal Ctrl-Arrow key */
|
||||||
|
bound = ed_getchar(vp->ed,-1);
|
||||||
|
switch(bound)
|
||||||
|
{
|
||||||
|
case 'D': /* Ctrl-Left arrow (go back one word) */
|
||||||
|
ed_ungetchar(vp->ed, 'b');
|
||||||
|
return(1);
|
||||||
|
case 'C': /* Ctrl-Right arrow (go forward one word) */
|
||||||
|
ed_ungetchar(vp->ed, 'w');
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
ed_ungetchar(vp->ed,bound);
|
||||||
|
ed_ungetchar(vp->ed,motion);
|
||||||
|
return(0);
|
||||||
|
case '4':
|
||||||
|
case '8':
|
||||||
|
bound = ed_getchar(vp->ed,-1);
|
||||||
|
if(bound=='~')
|
||||||
|
{ /* End key */
|
||||||
|
ed_ungetchar(vp->ed,'$');
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
ed_ungetchar(vp->ed,bound);
|
ed_ungetchar(vp->ed,bound);
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
default:
|
default:
|
||||||
|
@ -2602,6 +2692,11 @@ chgeol:
|
||||||
case 'd': /** delete **/
|
case 'd': /** delete **/
|
||||||
if( mode )
|
if( mode )
|
||||||
c = vp->lastmotion;
|
c = vp->lastmotion;
|
||||||
|
else if( vp->del_word )
|
||||||
|
{
|
||||||
|
vp->del_word = 0;
|
||||||
|
c = 'w';
|
||||||
|
}
|
||||||
else
|
else
|
||||||
c = getcount(vp,ed_getchar(vp->ed,-1));
|
c = getcount(vp,ed_getchar(vp->ed,-1));
|
||||||
deleol:
|
deleol:
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
#define SH_RELEASE_FORK "93u+m" /* only change if you develop a new ksh93 fork */
|
#define SH_RELEASE_FORK "93u+m" /* only change if you develop a new ksh93 fork */
|
||||||
#define SH_RELEASE_SVER "1.0.0-beta.2" /* semantic version number: https://semver.org */
|
#define SH_RELEASE_SVER "1.0.0-beta.2" /* semantic version number: https://semver.org */
|
||||||
#define SH_RELEASE_DATE "2022-01-28" /* must be in this format for $((.sh.version)) */
|
#define SH_RELEASE_DATE "2022-01-31" /* must be in this format for $((.sh.version)) */
|
||||||
#define SH_RELEASE_CPYR "(c) 2020-2022 Contributors to ksh " SH_RELEASE_FORK
|
#define SH_RELEASE_CPYR "(c) 2020-2022 Contributors to ksh " SH_RELEASE_FORK
|
||||||
|
|
||||||
/* Scripts sometimes field-split ${.sh.version}, so don't change amount of whitespace. */
|
/* Scripts sometimes field-split ${.sh.version}, so don't change amount of whitespace. */
|
||||||
|
|
|
@ -4922,6 +4922,15 @@ Move cursor forward one word.
|
||||||
editor's idea of a word is a string of characters
|
editor's idea of a word is a string of characters
|
||||||
consisting of only letters, digits and underscores.)
|
consisting of only letters, digits and underscores.)
|
||||||
.TP 10
|
.TP 10
|
||||||
|
.BI M-[1;3C
|
||||||
|
(Alt-Right arrow) Same as \fBM-f\fR.
|
||||||
|
.TP 10
|
||||||
|
.BI M-[1;5C
|
||||||
|
(Ctrl-Right arrow) Same as \fBM-f\fR.
|
||||||
|
.TP 10
|
||||||
|
.BI M-[1;9C
|
||||||
|
(iTerm2 Alt-Right arrow) Same as \fBM-f\fR.
|
||||||
|
.TP 10
|
||||||
.BI ^B
|
.BI ^B
|
||||||
Move cursor backward (left) one character.
|
Move cursor backward (left) one character.
|
||||||
.TP 10
|
.TP 10
|
||||||
|
@ -4931,21 +4940,60 @@ Move cursor backward (left) one character.
|
||||||
.BI M-b
|
.BI M-b
|
||||||
Move cursor backward one word.
|
Move cursor backward one word.
|
||||||
.TP 10
|
.TP 10
|
||||||
|
.BI M-[1;3D
|
||||||
|
(Alt-Left arrow) Same as \fBM-b\fR.
|
||||||
|
.TP 10
|
||||||
|
.BI M-[1;5D
|
||||||
|
(Ctrl-Left arrow) Same as \fBM-b\fR.
|
||||||
|
.TP 10
|
||||||
|
.BI M-[1;9D
|
||||||
|
(iTerm2 Alt-Left arrow) Same as \fBM-b\fR.
|
||||||
|
.TP 10
|
||||||
.BI ^A
|
.BI ^A
|
||||||
Move cursor to start of line.
|
Move cursor to start of line.
|
||||||
.TP 10
|
.TP 10
|
||||||
.BI M-[H
|
.BI M-[H
|
||||||
(Home) Same as \fB^A\fR.
|
(Home) Same as \fB^A\fR.
|
||||||
.TP 10
|
.TP 10
|
||||||
|
.BI M-[1~
|
||||||
|
Same as \fB^A\fR.
|
||||||
|
.TP 10
|
||||||
|
.BI M-[7~
|
||||||
|
Same as \fB^A\fR.
|
||||||
|
.TP 10
|
||||||
.BI ^E
|
.BI ^E
|
||||||
Move cursor to end of line.
|
Move cursor to end of line.
|
||||||
.TP 10
|
.TP 10
|
||||||
.BI M-[F
|
.BI M-[F
|
||||||
(End) Same as \fB^E\fR.
|
(End) Same as \fB^E\fR.
|
||||||
.TP 10
|
.TP 10
|
||||||
|
.BI M-[4~
|
||||||
|
Same as \fB^E\fR.
|
||||||
|
.TP 10
|
||||||
|
.BI M-[8~
|
||||||
|
Same as \fB^E\fR.
|
||||||
|
.TP 10
|
||||||
.BI M-[Y
|
.BI M-[Y
|
||||||
Same as \fB^E\fR.
|
Same as \fB^E\fR.
|
||||||
.TP 10
|
.TP 10
|
||||||
|
.BI M-OA
|
||||||
|
(Up Arrow) Same as \fBM-[A\fR.
|
||||||
|
.TP 10
|
||||||
|
.BI M-OB
|
||||||
|
(Down Arrow) Same as \fBM-[B\fR.
|
||||||
|
.TP 10
|
||||||
|
.BI M-OC
|
||||||
|
(Right Arrow) Same as \fBM-[C\fR.
|
||||||
|
.TP 10
|
||||||
|
.BI M-OD
|
||||||
|
(Left Arrow) Same as \fBM-[D\fR.
|
||||||
|
.TP 10
|
||||||
|
.BI M-O5C
|
||||||
|
(Ctrl-Right Arrow) Same as \fBM-f\fR.
|
||||||
|
.TP 10
|
||||||
|
.BI M-O5D
|
||||||
|
(Ctrl-Left Arrow) Same as \fBM-b\fR.
|
||||||
|
.TP 10
|
||||||
.BI ^] char
|
.BI ^] char
|
||||||
Move cursor forward to character
|
Move cursor forward to character
|
||||||
.I char
|
.I char
|
||||||
|
@ -4987,6 +5035,9 @@ Delete current character.
|
||||||
.BI M-d
|
.BI M-d
|
||||||
Delete current word.
|
Delete current word.
|
||||||
.TP 10
|
.TP 10
|
||||||
|
.BI M-[3;5~
|
||||||
|
(Ctrl-Delete) Same as \fBM-d\fR.
|
||||||
|
.TP 10
|
||||||
.BI M-^H
|
.BI M-^H
|
||||||
(Meta-backspace) Delete previous word.
|
(Meta-backspace) Delete previous word.
|
||||||
.TP 10
|
.TP 10
|
||||||
|
@ -5130,6 +5181,9 @@ is accessed.
|
||||||
In this case a parameter of zero
|
In this case a parameter of zero
|
||||||
reverses the direction of the search.
|
reverses the direction of the search.
|
||||||
.TP 10
|
.TP 10
|
||||||
|
.B ^G
|
||||||
|
Exit reverse search mode.
|
||||||
|
.TP 10
|
||||||
.B ^O
|
.B ^O
|
||||||
Operate \- Execute the current line and fetch
|
Operate \- Execute the current line and fetch
|
||||||
the next line relative to current line from the
|
the next line relative to current line from the
|
||||||
|
@ -5247,6 +5301,9 @@ which is not subject to any shell option.
|
||||||
.B M-^V
|
.B M-^V
|
||||||
Display version of the shell.
|
Display version of the shell.
|
||||||
.TP 10
|
.TP 10
|
||||||
|
.BI M-[2~
|
||||||
|
(Insert) Escape the next character.
|
||||||
|
.TP 10
|
||||||
.B M-#
|
.B M-#
|
||||||
If the line does not begin with a
|
If the line does not begin with a
|
||||||
.BR # ,
|
.BR # ,
|
||||||
|
@ -5437,6 +5494,54 @@ Cursor to start of line.
|
||||||
.B ^[[H
|
.B ^[[H
|
||||||
(Home) Same as \f30\fP.
|
(Home) Same as \f30\fP.
|
||||||
.TP 10
|
.TP 10
|
||||||
|
.B ^[[1~
|
||||||
|
Same as \f30\fP.
|
||||||
|
.TP 10
|
||||||
|
.B ^[[7~
|
||||||
|
Same as \f30\fP.
|
||||||
|
.TP 10
|
||||||
|
.B ^[[1;3D
|
||||||
|
(Alt-Left arrow) Same as \f3b\fP.
|
||||||
|
.TP 10
|
||||||
|
.B ^[[1;5D
|
||||||
|
(Ctrl-Left arrow) Same as \f3b\fP.
|
||||||
|
.TP 10
|
||||||
|
.B ^[[1;9D
|
||||||
|
(iTerm2 Alt-Left arrow) Same as \f3b\fP.
|
||||||
|
.TP 10
|
||||||
|
.B ^[[1;3C
|
||||||
|
(Alt-Right arrow) Same as \f3w\fP.
|
||||||
|
.TP 10
|
||||||
|
.B ^[[1;5C
|
||||||
|
(Ctrl-Right arrow) Same as \f3w\fP.
|
||||||
|
.TP 10
|
||||||
|
.B ^[[1;9C
|
||||||
|
(iTerm2 Alt-Right arrow) Same as \f3w\fP.
|
||||||
|
.TP 10
|
||||||
|
.B ^[[2~
|
||||||
|
(Insert) Same as \f3i\fP.
|
||||||
|
.TP 10
|
||||||
|
.B ^[[3;5~
|
||||||
|
(Ctrl-Delete) Same as \f3dw\fP.
|
||||||
|
.TP 10
|
||||||
|
.B ^[OA
|
||||||
|
(Up Arrow) Same as \f3^[[A\fP.
|
||||||
|
.TP 10
|
||||||
|
.B ^[OB
|
||||||
|
(Down Arrow) Same as \f3^[[B\fP.
|
||||||
|
.TP 10
|
||||||
|
.B ^[OC
|
||||||
|
(Right Arrow) Same as \f3^[[C\fP.
|
||||||
|
.TP 10
|
||||||
|
.B ^[OD
|
||||||
|
(Left Arrow) Same as \f3^[[D\fP.
|
||||||
|
.TP 10
|
||||||
|
.B ^[O5C
|
||||||
|
(Ctrl-Right Arrow) Same as \f3w\fP.
|
||||||
|
.TP 10
|
||||||
|
.B ^[O5D
|
||||||
|
(Ctrl-Left Arrow) Same as \f3b\fP.
|
||||||
|
.TP 10
|
||||||
.B ^
|
.B ^
|
||||||
Cursor to first non-blank character in line.
|
Cursor to first non-blank character in line.
|
||||||
.TP 10
|
.TP 10
|
||||||
|
@ -5446,9 +5551,18 @@ Cursor to end of line.
|
||||||
.B ^[[F
|
.B ^[[F
|
||||||
(End) Same as \f3$\fP.
|
(End) Same as \f3$\fP.
|
||||||
.TP 10
|
.TP 10
|
||||||
|
.B ^[[4~
|
||||||
|
Same as \f3$\fP.
|
||||||
|
.TP 10
|
||||||
|
.B ^[[8~
|
||||||
|
Same as \f3$\fP.
|
||||||
|
.TP 10
|
||||||
.B ^[[Y
|
.B ^[[Y
|
||||||
Same as \f3$\fP.
|
Same as \f3$\fP.
|
||||||
.TP 10
|
.TP 10
|
||||||
|
.B ^G
|
||||||
|
Exit reverse search mode.
|
||||||
|
.TP 10
|
||||||
.B %
|
.B %
|
||||||
Moves to balancing
|
Moves to balancing
|
||||||
.BR ( ,
|
.BR ( ,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue