在行编辑模式下less
,左右箭头键可前后移动光标。我希望将它们与控制键一起使用来按单词导航,正如 所承诺的那样man less
。
^LEFTARROW [ ESC-b or ESC-LEFTARROW ]
(That is, CONTROL and LEFTARROW simultaneously.) Move the cursor one word to the left.
^RIGHTARROW [ ESC-w or ESC-RIGHTARROW ]
(That is, CONTROL and RIGHTARROW simultaneously.) Move the cursor one word to the right.
不幸的是,这似乎不适用于我的终端。 (Fedora 28 上的 Tilix 1.8.3、VTE 0.52、GTK 3.22.30)。相反,按 Control-left 会打印一些我不认识的内容。在下面的示例中,我键入alpha beta
并立即按下 Control-Left。这添加ESC[1;5D
到行中。
这里是否存在一些配置错误?在其他应用程序中(例如vim
)Control-Left 和 Control-Right 按预期按单词导航。
FWIW,Ctrl + 左/右箭头键问题,可能相关方向键输入less
答案1
尝试Alt+w
并Alt+b
w将用于向前搜索和乙将用于向后。
答案2
因为你没有使用 OS/2
我是认真的。
OS/2 输入处理代码在less
有一个“特殊键”将⎈ Control+←和⎈ Control+→和弦映射到其内部SK_CTL_LEFT_ARROW
和SK_CTL_RIGHT_ARROW
事件。
Unix 代码根本没有等效的映射。它依赖于 termcap,而 termcap 在这方面的缺陷是出了名的。
doco中方括号内的内容是正确的,括号内的内容是错误的。你必须使用⎋ Escape B、⎋ Escape F、⎋ Escape ←(原文如此!)和⎋ Escape →(原文如此!)序列(注意不是和弦),直到有人做得更好less
。请提交报告。
(在某些终端仿真器中,您可以配置修饰键以使 an⎋ Escape为前缀。并非所有终端仿真器和终端都如此,特别是在此处模拟其输入控制序列的终端(相反,在CSI 序列),重要的是从less
终端接收␛
的 第一个字符less
本身没有这样的修饰符的概念。)
进一步阅读
答案3
less
是一个术语帽应用程序,使用 termcap 接口获取它“知道”的有关给定终端的所有信息。 除非它的开发者介绍了一些硬编码的行为(就像在极少数程序中所做的那样,我不会提及),less
将不提供对这些组合键的支持,因为它们不是标准功能(例如,请参阅 术语帽ncurses' 中列出的功能列术语信息(5)),并且没有2- 分配给他们的角色名称(参见终端数据库有关扩展的摘要)。
顺便说一下,参考我的答案快速浏览一下 less 的源代码,我没有看到任何对应于左/右的东西单词移动(除非这是左/右移位的预期含义A_LSHIFT
和A_RSHIFT
)。 git 责备说这些以及手册页关于“word”的评论可以追溯到 2007 年(版本 394)。这些看起来更有前途(从 2016 年开始):
SK(SK_CTL_RIGHT_ARROW),0, A_RRSHIFT,
SK(SK_CTL_LEFT_ARROW),0, A_LLSHIFT
但签入评论只说
commit e5c195113d1666ac506ea3f65545d436d96fe099
Author: Mark Nudelman <[email protected]>
Date: Sat Oct 22 15:25:44 2016 +0000
New commands ESC-{ and ESC-} to shift to start/end of displayed lines.
阅读代码(在命令.c)对于转移,我没有看到任何与以下结论不同的内容:less
滚动经过列(单个字符)而不是字,但OP的评论指出了这些:
ESC,SK(SK_LEFT_ARROW),0, EC_W_LEFT, /* ESC LEFTARROW */
SK(SK_CTL_LEFT_ARROW),0, EC_W_LEFT, /* CTRL-LEFTARROW */
ESC,'w',0, EC_W_RIGHT, /* ESC w */
ESC,SK(SK_RIGHT_ARROW),0, EC_W_RIGHT, /* ESC RIGHTARROW */
SK(SK_CTL_RIGHT_ARROW),0, EC_W_RIGHT, /* CTRL-RIGHTARROW */
哪个使用space作为“单词”的分隔符。也许当开发人员进行这些更改时,他想到了模仿 vi,它可以做到这两点(尽管 vi 的字的划分方式不同)。
*Escapeleft-arrow使用表中的这些行提供建议等:
ESC,SK(SK_LEFT_ARROW),0, EC_W_LEFT, /* ESC LEFTARROW */
ESC,SK(SK_RIGHT_ARROW),0, EC_W_RIGHT, /* ESC RIGHTARROW */
然而,当前的程序不包含任何作业使用那些SK_CTL_RIGHT_ARROW
或SK_CTL_LEFT_ARROW
符号。这将在少键,例如,在这个案例陈述(或者至少在附近):
switch (*++p)
{
case 'u': ch = SK_UP_ARROW; break;
case 'd': ch = SK_DOWN_ARROW; break;
case 'r': ch = SK_RIGHT_ARROW; break;
case 'l': ch = SK_LEFT_ARROW; break;
case 'U': ch = SK_PAGE_UP; break;
case 'D': ch = SK_PAGE_DOWN; break;
case 'h': ch = SK_HOME; break;
case 'e': ch = SK_END; break;
case 'x': ch = SK_DELETE; break;
default:
error("illegal char after \\k", NULL_PARG);
*pp = p+1;
return ("");
}
如果代码中没有分配,这些只是硬编码的,不可配置的。
MSDOS / OS/2 配置与 Unix 配置不同,它有一个(硬编码的)表关键代码:
#if MSDOS_COMPILER || OS2
static char k_right[] = { '\340', PCK_RIGHT, 0 };
static char k_left[] = { '\340', PCK_LEFT, 0 };
static char k_ctl_right[] = { '\340', PCK_CTL_RIGHT, 0 };
static char k_ctl_left[] = { '\340', PCK_CTL_LEFT, 0 };
并规定在案例陈述:
#if MSDOS_COMPILER || OS2
case SK_INSERT:
s = k_insert;
break;
case SK_CTL_LEFT_ARROW:
s = k_ctl_left;
break;
case SK_CTL_RIGHT_ARROW:
s = k_ctl_right;
break;
(注意:仍然没有分配,因此这些情况未被使用),而在 termcap 配置中,这些符号根本不被使用。 (termcap 是“可扩展的”,如果您不厌其烦地发明 2 个字符的助记符供您自己使用,并进行较少的修改来实现这些情况,它就会满足您的要求)。
重温 lesskey 的手册页,它是这样说的:
一个动作之后可能会出现一个“额外的”细绳。当在运行 less 时输入这样的命令时,将执行该操作,然后解析额外的字符串,就像在 less 中输入它一样。在某些情况下可以使用此功能来扩展命令的功能。例如,请参阅“{”和“:t”以下示例中的命令。这 额外的 字符串有特殊含义“辞职”动作:当 less 退出时,额外字符串的第一个字符用作其退出状态。
这意味着你可以做这样的事情:
\e[1;5D noaction \e\e[D
\e[1;5C noaction \e\e[C
映射到额外的字符串它使用预定义的字移。
答案4
我最终成功地做到了这一点。 (我联系了less
作者,他的回复指出我让事情变得比他们需要的更复杂了。)
这是lesskey
我最终使用的配置文件。
#! /usr/bin/env lesskey
#line-edit
\e[1;5D word-left
\e[1;5C word-right
\e[3;5~ word-delete
在此文件上运行 lesskey 并启动一个新实例Ctrl-←,并按Ctrl-→(空格分隔?)单词导航,然后Ctrl-Delete向右删除到当前单词的末尾。我想这个解决方案的缺点是它被硬编码为我的终端模拟器生成的特定转义序列;其他答案解释了为什么通用的“控制+箭头键”机制是不可能的。