**注意:我在超级用户上问了同样的问题,但没有得到任何答复。我现在意识到这是一个更适合解决这个特定问题的论坛。*
在 ksh shell 中,删除键无法正常工作在命令行上。当我按删除键时,我会得到一个~。
我如何能:
- 绑定功能“删除光标处的字符” 到删除键盘按钮? (Control-D 的行为就像我期望删除按钮起作用一样,而我使用别名的尝试并不成功,而且可能很天真。)
- 绑定“的功能移动到该行的第一行”到主页键盘按钮? (控件 A 现在执行此操作,但我希望 Home 执行此操作。)
- 绑定“的功能移动到行尾" 到 End 键盘按钮?(Control E 现在执行此操作,但我希望 end 执行此操作。)
最终(?)更新
我偶然发现了一些有用的东西,但我不太明白为什么。这有效:
bind '^[[3'=prefix-2
bind '^[[3~'=delete-char-forward
根据http://www.qnx.com/developers/docs/6.3.2/neutrino/utilities/k/ksh.html#bind,
prefix-2
Key binding: ^X, ^[[
Introduces a 2-character command sequence.
所以我的更新的问题是为什么我需要使用prefix-2
这个?请帮我翻译一下,以便我能理解,这样我就不必再为此打扰大家了。
旧的东西跟随
更新
原来QNX中的ESC是^[
.使用该命令,bind '^[[3~'='delete-char-backward'
我可以让光标用 . 覆盖光标下的字符~
。这至少是一些进步——我现在知道怎么拼写了删除键对于外壳。我在网上看到的大多数内容都说删除键是^?
,但这似乎对我不起作用。另外,我应该提到我是通过 PuTTy 访问它的。
我不明白因为控制D做我想要删除键做的事情。我尝试再次绑定它,eot-or-delete
但没有成功。
这应该很简单吧?
更新2:
bind | grep prefix
^X = prefix-2
^[ = prefix-1
ÿ = prefix-3
^[O = prefix-2
^[[ = prefix-2
bind | grep '[^ -~]'
ÿ = prefix-3
à = beginning-of-line
à¡ = up-history
ठ= backward-char
ঠ= forward-char
ਠ= end-of-line
à© = down-history
ଠ= delete-char-forward
à´ = backward-word
ච= forward-word
更新 3:更多我的设置
环境设置
echo $ENV
/etc/kshrc
BIND 完整输出
bind
^A = beginning-of-line
^B = backward-char
^C = abort
^D = eot-or-delete
^E = end-of-line
^F = forward-char
^G = abort
^H = delete-char-backward
^I = complete
^J = newline
^K = kill-to-eol
^L = redraw
^M = newline
^N = down-history
^O = newline-and-next
^P = up-history
^R = search-history
^T = transpose-chars
^U = kill-line
^V = version
^W = kill-region
^X = prefix-2
^Y = yank
^[ = prefix-1
^\ = no-op
^] = search-character-forward
^^ = quote
^_ = eot
^? = delete-char-backward
ÿ = prefix-3
^[^H = delete-word-backward
^[^X = complete-file
^[^[ = complete
^[^] = search-character-backward
^[ = set-mark-command
^[# = comment
^[* = expand-file
^[. = prev-hist-word
^[0 = set-arg
^[1 = set-arg
^[2 = set-arg
^[3 = set-arg
^[4 = set-arg
^[5 = set-arg
^[6 = set-arg
^[7 = set-arg
^[8 = set-arg
^[9 = set-arg
^[< = beginning-of-history
^[= = complete-list
^[> = end-of-history
^[? = list
^[C = capitalize-word
^[L = downcase-word
^[O = prefix-2
^[U = upcase-word
^[[ = prefix-2
^[_ = prev-hist-word
^[b = backward-word
^[c = capitalize-word
^[d = delete-word-forward
^[f = forward-word
^[g = goto-history
^[h = delete-word-backward
^[l = downcase-word
^[u = upcase-word
^[y = yank-pop
^[^? = delete-word-backward
^X^X = exchange-point-and-mark
^X^Y = list-file
^X^[ = complete-command
^X? = list-command
^XA = up-history
^XB = down-history
^XC = forward-char
^XD = backward-char
^XH = beginning-of-line
^XP = delete-char-forward
^XY = end-of-line
^Xc = forward-word
^Xd = backward-word
^Xw = end-of-line
à = beginning-of-line
à¡ = up-history
ठ= backward-char
ঠ= forward-char
ਠ= end-of-line
à© = down-history
ଠ= delete-char-forward
à´ = backward-word
ච= forward-word
/etc/kshrc
/etc # cat kshrc
case $- in
*i*)
export SHELL_COLOR_BLUE="print -n \\033[0;34m"
export SHELL_COLOR_GREEN="print -n \\033[0;32m"
export SHELL_COLOR_RED="print -n \\033[0;31m"
export SHELL_COLOR_LIGHTGRAY="print -n \\033[0;37m"
export SHELL_COLOR_YELLOW="print -n \\033[1;33m"
export COLOR_BLACK="\\033[0;30m"
export COLOR_BLUE="\\033[0;34m"
export COLOR_GREEN="\\033[0;32m"
export COLOR_CYAN="\\033[0;36m"
export COLOR_RED="\\033[0;31m"
export COLOR_PURPLE="\\033[0;35m"
export COLOR_BROWN="\\033[0;33m"
export COLOR_LIGHTGRAY="\\033[0;37m"
export COLOR_DARKGRAY="\\033[1;30m"
export COLOR_LIGHTBLUE="\\033[1;34m"
export COLOR_LIGHTGREEN="\\033[1;32m"
export COLOR_LIGHTCYAN="\\033[1;36m"
export COLOR_LIGHTRED="\\033[1;31m"
export COLOR_LIGHTPURPLE="\\033[1;35m"
export COLOR_YELLOW="\\033[1;33m"
export COLOR_WHITE="\\033[1;37m"
if [[ `id -u` -eq 0 ]]; then
export PS1=`$SHELL_COLOR_RED`'$(hostname -s):'`$SHELL_COLOR_YELLOW`'$(pwd) # '`$SHELL_COLOR_LIGHTGRAY`
else
export PS1=`$SHELL_COLOR_BLUE`'$(hostname -s):'`$SHELL_COLOR_GREEN`'$(pwd) $ '`$SHELL_COLOR_LIGHTGRAY`
fi
esac
腻子设置:
注释可能重要也可能不重要,但可以提供背景:
外壳是“PD KSH v5.2.14 99/07/13.2”。是的,我无法选择升级...它是一个嵌入式系统。 “获得一个现代的外壳”并不是一个可行的答案。操作系统是QNX Neutrino 6.4.1。
绑定显示以下内容:
bind | grep del
^D = eot-or-delete
^H = delete-char-backward
^? = delete-char-backward
^[^H = delete-word-backward
^[d = delete-word-forward
^[h = delete-word-backward
^[^? = delete-word-backward
^XP = delete-char-forward
ଠ= delete-char-forward
infocmp 显示以下内容:
infocmp # Reconstructed via infocmp from file:
/usr/lib/terminfo/x/xterm xterm|vs100|xterm terminal emulator,
am, km, mir, msgr, xenl, xon,
cols#80, it#8, lines#65, vt@,
acsc=Oa``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
bel=^G, blink=@, bold=\E[1m, clear=\E[H\E[2J, cr=^M,
csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
el=\E[K, el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H, ht=^I,
hts=\EH, ich=\E[%p1%d@, ich1=\E[2~, il=\E[%p1%dL, il1=\E[L,
ind=^J, is1=\E=\E[?1l, kBEG=\ENn, kCPY=\ENs, kCRT=\ENt,
kDL=\ENv, kEXT=\ENw, kFND=\ENx, kHLP=\ENy, kOPT=\ENz,
ka3=\EOs, kb2=\EOr, kbs=^H, kc1=\EOq, kcan=\EOm, kclo=\ENc,
kclr=\ENa, kcmd=\EOu, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
kcuu1=\E[A, kdch1=\E[P, kend=\E[9, kf1=\E[11~, kf10=\E[21~,
kf11=\E[23~, kf12=\E[24~, kf2=\E[12~, kf3=\E[13~,
kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~,
kf9=\E[20~, kfnd=\ENf, khlp=\ENh, khome=\E[8, khts=\ENb,
kich1=\E[2~, kmov=\ENi, kmrk=\ENm, kmsg=\ENe, knp=\E[6~,
kopn=\ENo, kopt=\ENk, kpp=\E[5~, kref=\ENl, kres=\ENp,
krfr=\ENg, krpl=\ENr, krst=\ENj, ksav=\ENq, kslt=\EOM,
ktbc=\ENd, kund=\ENu, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
rmam=\E[?7l, rmkx=\E>, rmso=\E[m,
rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, rs2=@,
sc=\E7,
setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m,
sgr0=\E[m, smacs=^N, smam=\E[?7h, smkx=\E=, smso=\E[7m,
tbc=\E[3g,
stty 显示以下内容:
stty Name: /dev/ttyp0 Type: pseudo Opens: 2
+edit +echok +echonl
+osflow intr=^C quit=^\ erase=^? kill=^U eof=^D start=^Q stop=^S susp=^Z lnext=^V min=01 time=00 pr1=^[ pr2=5B left=44 right=43
up=41 down=42 ins=40 del=50 home=48 end=59
答案1
对于谷歌员工:
呼。对于本来应该很简单的事情来说,这很难。
这简短的解决方案使用以下命令设置删除键(在.kshrc
或任何地方),
bind '^[[3'=prefix-2
bind '^[[3~'=delete-char-forward
并将 PuTTY 终端设置设置为rxvt
而不是Standard
.
真正帮助我完成这项工作的是:http://www.mail-archive.com/[电子邮件受保护]/msg81796.html
ksh 用 home 和 end 键做一些愚蠢的事情。基本上,我无法让它同时区分Home、End 和Delete 之间的区别。无论最后绑定的是什么,所有三个键都可以。更改 PuTTY 为这些密钥发送的内容有很大帮助。
注意:有些人建议,如果您想查看按下某个键时 shell 获取的代码,请键入cat
,按 Enter,然后按该键。对于我的外壳,这不起作用。我得到了~
所有的控制键。我所做的是按Esc
一次,然后按该键。然后控制代码就会出现。使用该控制代码bind
就可以了。
答案2
如果 shell 正在 gnome 终端窗口内运行,然后菜单进入:Edit
| Preferences
|Profiles
并选择一个配置文件,然后选择Compatibility
选项卡,并将 更改Delete key generates
为Automatic
。 (或者,如果失败,请尝试其他选择。)
另外,您还可以输入^v Del
和^v Backspace
,(即 Control-v 后跟删除键,Control-v 后跟退格键)来查找返回的“终端”序列代码。
为了进行检查,请使用showkey
命令为showkey -s
、showkey -k
和/或showkey -a
(即三层),然后按Del
和Backspace
键:
I) 键盘的原始输出
II) tty 驱动程序的输出
III) 提供给 (ansi) 终端的字符串
由此我注意到,当使用 stty(例如 stty1)时,我的 shell 行为与使用 xterm(在图形 X 终端内)时不同。 Del 在 stty1 中正确地向前(右)删除,但在我的 xterm 中向后(左)正确删除。
答案3
现有的两个答案对我来说不起作用,从 Linux (Ubuntu 18.10) bash,通过 SSH 到 Solaris 11.3 bash,使用 gnome 终端。
我发现我需要使用该bind
命令,但有一个解决方法,因为我无法获得本机Delete功能。
所以解决方法是当Delete按下时模拟通过将删除按键映射到→和来进行删除Backspace。
bind '"^[[3~":"^[[C^?"'
要键入该内容,请使用按键:
CTRL-vDelete对于第一部分
和CTRL-v→CTRL-vBackspace第二部分。
(或用于\e
转义,例如"\e[3~"
:)
它并不完美,如果你Delete在行尾,它仍然退格。但这让我不必~
每天无数次地退格这个角色。
答案4
根据man ksh
我的 Debian 10 系统,prefix-1
“引入了 2 个字符的命令序列”和prefix-2
“引入了多字符的命令序列”。本质上,它们告诉 shell“暂时不要处理这个,应该有更长的字符序列 - 等待完整的序列。”
现代 Unix/Linux 终端会话通常运行在终端模拟器:它们本质上是模拟某种类型的(扩展版本)电脑终端通过串行端口连接。对于许多终端,键盘按键和发送到计算机的字符之间的映射并不是严格一对一的:因为键盘上的所有各种非字符按键没有标准化的 ASCII 控制字符,所以某些按键会发送多个字符。字符序列。功能键、箭头键、Home、End、Insert、Delete、PgUp和PgDn属于该组。
键Esc表示为^[
,换句话说就是Control+ [。当您查看 ASCII 代码表时,您会发现该Control键实质上是从与其组合的常规字符的值中减去 64(即翻转一位)。 So^[
只是一个 ASCII 控制字符,具有特殊名称“ESC”。
您的bind | grep prefix
输出表明^[
已被识别为prefix-1
和^[[
as prefix-2
。
该Delete密钥实际上发送了一个相当于 的序列Esc [ 3 ~。
因此 shell 必须一次解析一个字符/字节,如下所示:
- 收到Esc:也称为
^[
“匹配”prefix-1
,因此至少再等待一个字符并将其与它结合起来 - 收到[:与前一个前缀字符相结合,它是
^[[
匹配的prefix-2
,因此请等待更多并继续组合字符。 - receive 3:与之前的前缀组合,它又
^[[3
是prefix-2
,所以继续等待并组合。 - 收到~:现在生成的组合
^[[3~
现在与 的绑定匹配delete-char-forward
。