Keyboard-Shortcuts

Emacs 模式下的 KSH 鍵映射:ctrl + 方向鍵

  • February 22, 2018

我是 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;,然後是 for 5and D

一種解決方案是更改陷阱程式碼以記住初始序列,並在以後使用它,如下所示:

# 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'

引用自:https://unix.stackexchange.com/questions/425951