Keyboard-Shortcuts
Emacs 模式下的 KSH 鍵映射:ctrl + 方向鍵
我是 KSH 的新手,必須在我的工作中使用它。版本是:
sh (AT&T Research) 93u+ 2012-08-01
在 RHEL 上。我以前使用過 tcsh 並使用它的 bindkey 工具為我提供了一些很好的命令行操作快捷方式。我在 KSH 中找到了“keybind”函式的程式碼,並用它來按我想要的方式進行 home、end 和 delete 工作:
keybind $'\eOH' $'\001' keybind $'\eOF' $'\005' keybind $'\e[F' $'\005' keybind $'\e[3~' $'\004'
我實際上不確定為什麼我有兩個對應於“結束”,但我知道。無論如何,棘手的部分是我希望 ctrl+左/右箭頭跳過一個單詞,而不是使用 Mf 或 Mb。當我嘗試獲取 ctrl-left 箭頭的程式碼時,它顯示:
^ [[1; 5D
但我似乎無法在 keybind 命令中使用它。由於分號,它看起來幾乎像一個複合擊鍵。我之前也沒有看到過這個問題,所以任何幫助都將不勝感激。
謝謝,馬特
ksh 手冊頁中記錄的 KEYBD 陷阱針對以轉義開頭的傳入字元序列呼叫。這個序列的結束沒有描述,但似乎
;
將結束它。假設您的 keybind 函式與本文中給出的一樣,那麼您的綁定將失敗,因為首先呼叫了陷阱程式碼 for
\e[1;
,然後是 for5
andD
。一種解決方案是更改陷阱程式碼以記住初始序列,並在以後使用它,如下所示:
# original code from http://www.bolthole.com/solaris/ksh-oddthings.html typeset -A Keytable # trap 'eval "${Keytable[${.sh.edchar}]}"' KEYBD function keybind # key action { typeset key=$(print -f "%q" "$2") case $# in 2) Keytable[$1]=' .sh.edchar=${.sh.edmode}'"$key" ;; 1) unset Keytable[$1] ;; *) print -u2 "Usage: $0 key [action]" ;; esac } # new function to handle ";" causing end of sequence # https://unix.stackexchange.com/a/425980/119298 function myfn { typeset -S state case "$state${.sh.edchar}" in $'\e[1;') state=${.sh.edchar} .sh.edchar= return ;; $'\e[1;5') state="$state${.sh.edchar}" .sh.edchar= return ;; $'\e[1;5'?) state= .sh.edchar=$'\e[1;5'"${.sh.edchar}" ;; esac eval "${Keytable[${.sh.edchar}]}" } trap myfn KEYBD keybind $'\e[1;5D' $'\eb' keybind $'\e[1;5C' $'\ef'