Ste*_*las 12
shift-arrow() {
((REGION_ACTIVE)) || zle set-mark-command
zle $1
}
shift-left() shift-arrow backward-char
shift-right() shift-arrow forward-char
shift-up() shift-arrow up-line-or-history
shift-down() shift-arrow down-line-or-history
zle -N shift-left
zle -N shift-right
zle -N shift-up
zle -N shift-down
bindkey $terminfo[kLFT] shift-left
bindkey $terminfo[kRIT] shift-right
bindkey $terminfo[kri] shift-up
bindkey $terminfo[kind] shift-down
Run Code Online (Sandbox Code Playgroud)
这假定你的终端在发送不同的转义序列Shift-Arrows从一个在发送Arrow和你的terminfo数据库正确填入相应kLFT和Krit的能力,以及你使用emacs风格键绑定.
或者,稍微分解代码:
shift-arrow() {
((REGION_ACTIVE)) || zle set-mark-command
zle $1
}
for key kcap seq widget (
left LFT $'\e[1;2D' backward-char
right RIT $'\e[1;2C' forward-char
up ri $'\e[1;2A' up-line-or-history
down ind $'\e[1;2B' down-line-or-history
) {
functions[shift-$key]="shift-arrow $widget"
zle -N shift-$key
bindkey ${terminfo[k$kcap]-$seq} shift-$key
}
Run Code Online (Sandbox Code Playgroud)
上面是terminfo数据库没有信息的情况下的硬编码序列(使用xterm序列).
Jam*_*rgy 12
从近3年前扩展Stephane的优秀答案,我添加了一些更多的绑定,使行为(几乎)与Windows的所有标准键盘行为完全一致:
Backspace并Del删除活动选择Ctrl+Shift+Left/ 时,选择范围扩展到下一个/上一个单词Ctrl+Shift+RightShift+Home并将Shift+End选择分别扩展到行的开头和结尾.Ctrl+Shift+Home并Ctrl+Shift+End做同样的事情.两件事情并不完全相同:
请注意,默认的mintty行为是绑定Shift+End和Shift+Home访问回滚缓冲区.这取代了zsh配置; 钥匙永远不会通过.为了使这些工作正常,您需要在/etc/minttyrc或中配置不同的密钥(或禁用回滚)~/.minttyrc.请参阅"修改为滚动" 在这里 -最简单的解决方案正好被设置ScrollMod=2绑定它Alt代替Shift.
所以一切:
ScrollMod=2
Run Code Online (Sandbox Code Playgroud)
r-delregion() {
if ((REGION_ACTIVE)) then
zle kill-region
else
local widget_name=$1
shift
zle $widget_name -- $@
fi
}
r-deselect() {
((REGION_ACTIVE = 0))
local widget_name=$1
shift
zle $widget_name -- $@
}
r-select() {
((REGION_ACTIVE)) || zle set-mark-command
local widget_name=$1
shift
zle $widget_name -- $@
}
for key kcap seq mode widget (
sleft kLFT $'\e[1;2D' select backward-char
sright kRIT $'\e[1;2C' select forward-char
sup kri $'\e[1;2A' select up-line-or-history
sdown kind $'\e[1;2B' select down-line-or-history
send kEND $'\E[1;2F' select end-of-line
send2 x $'\E[4;2~' select end-of-line
shome kHOM $'\E[1;2H' select beginning-of-line
shome2 x $'\E[1;2~' select beginning-of-line
left kcub1 $'\EOD' deselect backward-char
right kcuf1 $'\EOC' deselect forward-char
end kend $'\EOF' deselect end-of-line
end2 x $'\E4~' deselect end-of-line
home khome $'\EOH' deselect beginning-of-line
home2 x $'\E1~' deselect beginning-of-line
csleft x $'\E[1;6D' select backward-word
csright x $'\E[1;6C' select forward-word
csend x $'\E[1;6F' select end-of-line
cshome x $'\E[1;6H' select beginning-of-line
cleft x $'\E[1;5D' deselect backward-word
cright x $'\E[1;5C' deselect forward-word
del kdch1 $'\E[3~' delregion delete-char
bs x $'^?' delregion backward-delete-char
) {
eval "key-$key() {
r-$mode $widget \$@
}"
zle -N key-$key
bindkey ${terminfo[$kcap]-$seq} key-$key
}
Run Code Online (Sandbox Code Playgroud)
这涵盖了我使用的几种不同键盘配置的键码.
注意: "key"列中的值没有任何意义,它们仅用于为zle构建命名引用.它们可以是任何东西.什么是重要的是seq,mode和widget列.
注意2:您几乎可以绑定任何所需的键,只需要控制台模拟器中使用的键码即可.打开常规控制台(不运行zsh)并键入Ctrl + V,然后键入所需的键.它应该发出代码.^[手段\E.
Akh*_*rou 12
扩展了 Jamie Trewgy 的答案。
\n包括以下功能:
\ncmd+a:选择整个命令行提示文本cmd+x:剪切(复制和删除)当前命令行选择到剪贴板cmd+c:将当前命令行选择复制到剪贴板cmd+v:粘贴剪贴板选择ctrl+u:向后删除直到行首cmd+z:撤消cmd+shift+z: 重做shift-left:选择左边的字符shift-right:选择右边的字符shift-up:向上选择行shift-down:向下选择直播cmd-shift-left:选择直到行首cmd-shift-right:选择直到行尾alt-shift-left:选择左侧的单词alt-shift-right:选择右侧的单词ctrl-shift-left:选择直到行首ctrl-shift-right:选择直到行尾ctrl-shift-a:选择直到行首ctrl-shift-e:选择直到行尾left/right, alt-left/right, cmd/ctrl-left/right,上esc+esc。Delete:在, ctrl+d,上按预期工作backspace.zshrc# for my own convenience I explicitly set the signals\n# that my terminal sends to the shell as variables.\n# you might have different signals. you can see what\n# signal each of your keys sends by running `$> cat`\n# and pressing keys (you\'ll be able to see most keys)\n# also some of the signals sent might be set in your \n# terminal emulator application/program\n# configurations/preferences. finally some terminals\n# have a feature that shows you what signals are sent\n# per key press.\n#\n# for context, at the time of writing these variables are\n# set for the kitty terminal program, i.e these signals \n# are mostly ones sent by default by this terminal.\nexport KEY_ALT_F=\'\xc6\x92\'\nexport KEY_ALT_B=\'\xe2\x88\xab\'\nexport KEY_ALT_D=\'\xe2\x88\x82\'\nexport KEY_CTRL_U=$\'\\x15\' # ^U\nexport KEY_CMD_BACKSPACE=$\'^[b\' # arbitrary; added via kitty config (send_text)\nexport KEY_CMD_Z=^[[122;9u\nexport KEY_SHIFT_CMD_Z=^[[122;10u\nexport KEY_CTRL_R=$\'\\x12\' # ^R\nexport KEY_CMD_C=^[[99;9u\nexport KEY_CMD_X=^[[120;9u\nexport KEY_CMD_V=^[[118;9u\nexport KEY_CMD_A=^[[97;9u\nexport KEY_CTRL_L=$\'\\x0c\' # ^L\nexport KEY_LEFT=${terminfo[kcub1]:-$\'^[[D\'}\nexport KEY_RIGHT=${terminfo[kcuf1]:-$\'^[[C\'}\nexport KEY_SHIFT_UP=${terminfo[kri]:-$\'^[[1;2A\'}\nexport KEY_SHIFT_DOWN=${terminfo[kind]:-$\'^[[1;2B\'}\nexport KEY_SHIFT_RIGHT=${terminfo[kRIT]:-$\'^[[1;2C\'}\nexport KEY_SHIFT_LEFT=${terminfo[kLFT]:-$\'^[[1;2D\'}\nexport KEY_ALT_LEFT=$\'^[[1;3D\'\nexport KEY_ALT_RIGHT=$\'^[[1;3C\'\nexport KEY_SHIFT_ALT_LEFT=$\'^[[1;4D\'\nexport KEY_SHIFT_ALT_RIGHT=$\'^[[1;4C\'\nexport KEY_CMD_LEFT=$\'^[[1;9D\'\nexport KEY_CMD_RIGHT=$\'^[[1;9C\'\nexport KEY_SHIFT_CMD_LEFT=$\'^[[1;10D\'\nexport KEY_SHIFT_CMD_RIGHT=$\'^[[1;10C\'\nexport KEY_CTRL_A=$\'\\x01\' # ^A\nexport KEY_CTRL_E=$\'\\x05\' # ^E\nexport KEY_SHIFT_CTRL_A=$\'^[[97;6u\'\nexport KEY_SHIFT_CTRL_E=$\'^[[101;6u\'\nexport KEY_SHIFT_CTRL_LEFT=$\'^[[1;6D\'\nexport KEY_SHIFT_CTRL_RIGHT=$\'^[[1;6C\'\nexport KEY_CTRL_D=$\'\\x04\' # ^D\n\n# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n\n# copy selected terminal text to clipboard\nzle -N widget::copy-selection\nfunction widget::copy-selection {\n if ((REGION_ACTIVE)); then\n zle copy-region-as-kill\n printf "%s" $CUTBUFFER | pbcopy\n fi\n}\n\n# cut selected terminal text to clipboard\nzle -N widget::cut-selection\nfunction widget::cut-selection() {\n if ((REGION_ACTIVE)) then\n zle kill-region\n printf "%s" $CUTBUFFER | pbcopy\n fi\n}\n\n# paste clipboard contents\nzle -N widget::paste\nfunction widget::paste() {\n ((REGION_ACTIVE)) && zle kill-region\n RBUFFER="$(pbpaste)${RBUFFER}"\n CURSOR=$(( CURSOR + $(echo -n "$(pbpaste)" | wc -m | bc) ))\n}\n\n# select entire prompt\nzle -N widget::select-all\nfunction widget::select-all() {\n local buflen=$(echo -n "$BUFFER" | wc -m | bc)\n CURSOR=$buflen # if this is messing up try: CURSOR=9999999\n zle set-mark-command\n while [[ $CURSOR > 0 ]]; do\n zle beginning-of-line\n done\n}\n\n# scrolls the screen up, in effect clearing it\nzle -N widget::scroll-and-clear-screen\nfunction widget::scroll-and-clear-screen() {\n printf "\\n%.0s" {1..$LINES}\n zle clear-screen\n}\n\nfunction widget::util-select() {\n ((REGION_ACTIVE)) || zle set-mark-command\n local widget_name=$1\n shift\n zle $widget_name -- $@\n}\n\nfunction widget::util-unselect() {\n REGION_ACTIVE=0\n local widget_name=$1\n shift\n zle $widget_name -- $@\n}\n\nfunction widget::util-delselect() {\n if ((REGION_ACTIVE)) then\n zle kill-region\n else\n local widget_name=$1\n shift\n zle $widget_name -- $@\n fi\n}\n\nfunction widget::util-insertchar() {\n ((REGION_ACTIVE)) && zle kill-region\n RBUFFER="${1}${RBUFFER}"\n zle forward-char\n}\n\n# | key sequence | command\n# --------------------- | ------------------------------- | -------------\n\nbindkey $KEY_ALT_F forward-word\nbindkey $KEY_ALT_B backward-word\nbindkey $KEY_ALT_D kill-word\nbindkey $KEY_CTRL_U backward-kill-line\nbindkey $KEY_CMD_BACKSPACE backward-kill-line\nbindkey $KEY_CMD_Z undo\nbindkey $KEY_SHIFT_CMD_Z redo\nbindkey $KEY_CTRL_R history-incremental-search-backward\nbindkey $KEY_CMD_C widget::copy-selection\nbindkey $KEY_CMD_X widget::cut-selection\nbindkey $KEY_CMD_V widget::paste\nbindkey $KEY_CMD_A widget::select-all\nbindkey $KEY_CTRL_L widget::scroll-and-clear-screen\n\nfor keyname kcap seq mode widget (\n\n left kcub1 $KEY_LEFT unselect backward-char\n right kcuf1 $KEY_RIGHT unselect forward-char\n\n shift-up kri $KEY_SHIFT_UP select up-line-or-history\n shift-down kind $KEY_SHIFT_DOWN select down-line-or-history\n shift-right kRIT $KEY_SHIFT_RIGHT select forward-char\n shift-left kLFT $KEY_SHIFT_LEFT select backward-char\n\n alt-right x $KEY_ALT_RIGHT unselect forward-word\n alt-left x $KEY_ALT_LEFT unselect backward-word\n shift-alt-right x $KEY_SHIFT_ALT_RIGHT select forward-word\n shift-alt-left x $KEY_SHIFT_ALT_LEFT select backward-word\n\n cmd-right x $KEY_CMD_RIGHT unselect end-of-line\n cmd-left x $KEY_CMD_LEFT unselect beginning-of-line\n shift-cmd-right x $KEY_SHIFT_CMD_RIGHT select end-of-line\n shift-cmd-left x $KEY_SHIFT_CMD_LEFT select beginning-of-line\n\n ctrl-e x $KEY_CTRL_E unselect end-of-line\n ctrl-a x $KEY_CTRL_A unselect beginning-of-line\n shift-ctrl-e x $KEY_SHIFT_CTRL_E select end-of-line\n shift-ctrl-a x $KEY_SHIFT_CTRL_A select beginning-of-line\n shift-ctrl-right x $KEY_SHIFT_CTRL_RIGHT select end-of-line\n shift-ctrl-left x $KEY_SHIFT_CTRL_LEFT select beginning-of-line\n\n del x $KEY_CTRL_D delselect delete-char\n\n a x \'a\' insertchar \'a\'\n b x \'b\' insertchar \'b\'\n c x \'c\' insertchar \'c\'\n d x \'d\' insertchar \'d\'\n e x \'e\' insertchar \'e\'\n f x \'f\' insertchar \'f\'\n g x \'g\' insertchar \'g\'\n h x \'h\' insertchar \'h\'\n i x \'i\' insertchar \'i\'\n j x \'j\' insertchar \'j\'\n k x \'k\' insertchar \'k\'\n l x \'l\' insertchar \'l\'\n m x \'m\' insertchar \'m\'\n n x \'n\' insertchar \'n\'\n o x \'o\' insertchar \'o\'\n p x \'p\' insertchar \'p\'\n q x \'q\' insertchar \'q\'\n r x \'r\' insertchar \'r\'\n s x \'s\' insertchar \'s\'\n t x \'t\' insertchar \'t\'\n u x \'u\' insertchar \'u\'\n v x \'v\' insertchar \'v\'\n w x \'w\' insertchar \'w\'\n x x \'x\' insertchar \'x\'\n y x \'y\' insertchar \'y\'\n z x \'z\' insertchar \'z\'\n A x \'A\' insertchar \'A\'\n B x \'B\' insertchar \'B\'\n C x \'C\' insertchar \'C\'\n D x \'D\' insertchar \'D\'\n E x \'E\' insertchar \'E\'\n F x \'F\' insertchar \'F\'\n G x \'G\' insertchar \'G\'\n H x \'H\' insertchar \'H\'\n I x \'I\' insertchar \'I\'\n J x \'J\' insertchar \'J\'\n K x \'K\' insertchar \'K\'\n L x \'L\' insertchar \'L\'\n M x \'M\' insertchar \'M\'\n N x \'N\' insertchar \'N\'\n O x \'O\' insertchar \'O\'\n P x \'P\' insertchar \'P\'\n Q x \'Q\' insertchar \'Q\'\n R x \'R\' insertchar \'R\'\n S x \'S\' insertchar \'S\'\n T x \'T\' insertchar \'T\'\n U x \'U\' insertchar \'U\'\n V x \'V\' insertchar \'V\'\n W x \'W\' insertchar \'W\'\n X x \'X\' insertchar \'X\'\n Y x \'Y\' insertchar \'Y\'\n Z x \'Z\' insertchar \'Z\'\n 0 x \'0\' insertchar \'0\'\n 1 x \'1\' insertchar \'1\'\n 2 x \'2\' insertchar \'2\'\n 3 x \'3\' insertchar \'3\'\n 4 x \'4\' insertchar \'4\'\n 5 x \'5\' insertchar \'5\'\n 6 x \'6\' insertchar \'6\'\n 7 x \'7\' insertchar \'7\'\n 8 x \'8\' insertchar \'8\'\n 9 x \'9\' insertchar \'9\'\n\n exclamation-mark x \'!\' insertchar \'!\'\n hash-sign x \'\\#\' insertchar \'\\#\'\n dollar-sign x \'$\' insertchar \'$\'\n percent-sign x \'%\' insertchar \'%\'\n ampersand-sign x \'\\&\' insertchar \'\\&\'\n star x \'\\*\' insertchar \'\\*\'\n plus x \'+\' insertchar \'+\'\n comma x \',\' insertchar \',\'\n dot x \'.\' insertchar \'.\'\n forwardslash x \'\\\\\' insertchar \'\\\\\'\n backslash x \'/\' insertchar \'/\'\n colon x \':\' insertchar \':\'\n semi-colon x \'\\;\' insertchar \'\\;\'\n left-angle-bracket x \'\\<\' insertchar \'\\<\'\n right-angle-bracket x \'\\>\' insertchar \'\\>\'\n equal-sign x \'=\' insertchar \'=\'\n question-mark x \'\\?\' insertchar \'\\?\'\n left-square-bracket x \'[\' insertchar \'[\'\n right-square-bracket x \']\' insertchar \']\'\n hat-sign x \'^\' insertchar \'^\'\n underscore x \'_\' insertchar \'_\'\n left-brace x \'{\' insertchar \'{\'\n right-brace x \'\\}\' insertchar \'\\}\'\n left-parenthesis x \'\\(\' insertchar \'\\(\'\n right-parenthesis x \'\\)\' insertchar \'\\)\'\n pipe x \'\\|\' insertchar \'\\|\'\n tilde x \'\\~\' insertchar \'\\~\'\n at-sign x \'@\' insertchar \'@\'\n dash x \'\\-\' insertchar \'\\-\'\n double-quote x \'\\"\' insertchar \'\\"\'\n single-quote x "\\\'" insertchar "\\\'"\n backtick x \'\\`\' insertchar \'\\`\'\n whitespace x \'\\ \' insertchar \'\\ \'\n) {\n eval "function widget::key-$keyname() {\n widget::util-$mode $widget \\$@\n }"\n zle -N widget::key-$keyname\n bindkey $seq widget::key-$keyname\n}\n\n# suggested by "e.nikolov", fixes autosuggest completion being \n# overriden by keybindings: to have [zsh] autosuggest [plugin\n# feature] complete visible suggestions, you can assign an array\n# of shell functions to the `ZSH_AUTOSUGGEST_ACCEPT_WIDGETS` \n# variable. when these functions are triggered, they will also \n# complete any visible suggestion. Example:\nexport ZSH_AUTOSUGGEST_ACCEPT_WIDGETS=(\n widget::key-right\n widget::key-shift-right\n widget::key-cmd-right\n widget::key-shift-cmd-right\n)\nRun Code Online (Sandbox Code Playgroud)\n有些人可能也会发现这些很有用,尽管我上面没有包含它们,只需将它们添加到 for 循环数组中即可:
\n标签
\n tab x $\'\\x09\' insertchar \'\\ \'\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n
\n- 请注意,制表符补全将会失败
\n
其他
\n send kEND $\'\\E[1;2F\' select end-of-line\n send2 x $\'\\E[4;2~\' select end-of-line\n\n shome kHOM $\'\\E[1;2H\' select beginning-of-line\n shome2 x $\'\\E[1;2~\' select beginning-of-line\n\n end kend $\'\\EOF\' deselect end-of-line\n end2 x $\'\\E4~\' deselect end-of-line\n\n home khome $\'\\EOH\' deselect beginning-of-line\n home2 x $\'\\E1~\' deselect beginning-of-line\n\n csend x $\'\\E[1;6F\' select end-of-line\n cshome x $\'\\E[1;6H\' select beginning-of-line\n\n cleft x $\'\\E[1;5D\' deselect backward-word\n cright x $\'\\E[1;5C\' deselect forward-word\n\n del kdch1 $\'\\E[3~\' delregion delete-char\nRun Code Online (Sandbox Code Playgroud)\n\n\n旧的但可能对某些人仍然有用
\n
首先在终端应用程序(在我的例子中为 iTerm2)上配置某些键盘按键序列,以发送 shell 程序特定的信号。上述代码中使用的绑定是:
\n\xe2\x9e\xa4 iTerm2\n \xe2\x9e\xa4 Preferences\n \xe2\x9e\xa4 Keys\n \xe2\x9e\xa4 Key Bindings:\nRun Code Online (Sandbox Code Playgroud)\n| 按键顺序 | 按键绑定 |
|---|---|
cmd+shift+left | 发送转义序列:a |
cmd+shift+right | 发送转义序列:e |
ctrl+shift+a | 发送转义序列:a |
ctrl+shift+e | 发送转义序列:e |
cmd+left | 发送十六进制代码:\\x01 |
cmd+right | 发送十六进制代码:\\x05 |
cmd+a | 发送转义序列:\xc3\xa5 |
cmd+c | 发送转义序列:\xc3\xa7 |
cmd+v | 发送转义序列:\xe2\x88\x9a |
cmd+x | 发送转义序列:\xe2\x89\x88 |
cmd+z | 发送转义序列:\xce\xa9 |
cmd+shift+z | 发送转义序列:\xc2\xb8 |
此步骤将终端键绑定到 shell 信号,即告诉终端程序/应用程序 (iTerm2)zsh在按下某些键盘按键序列时向 shell 程序 ( ) 发送什么信号。根据您的终端程序和偏好,您可以根据需要绑定按键,或使用默认信号。
keyboard --> cmd+z --> iTerm2 --> ^[\xce\xa9 --> zsh --> undo (widget)\nRun Code Online (Sandbox Code Playgroud)\n然后上面的脚本将接收到的信号绑定到 shell 函数,称为小部件。即我们告诉 shell 程序,在接收到指定信号(按键序列)时运行指定的小部件。
\n因此,在命令行上,按下键盘按键序列后,终端会向 shell 发送适当的信号,然后 shell 调用相应的小部件(函数)。在本例中,我们告诉 shell 绑定的函数是编辑命令行本身的函数,就好像它是一个文件一样。
\n上面定义的小部件使用zsh内置zle(zsh 行编辑器)模块 API。更多信息可以查看官方文档:ZSH \xe2\x9e\xa4 18 Zsh Line Editor,以及官方指南:ZSH \xe2\x9e\xa4 Chapter 4: The Z-Shell Line Editor。
\n\n\n
\n- \n
一个巧妙的技巧可以查看 shell 正在运行接收到哪些信号
\ncat然后按键:Run Code Online (Sandbox Code Playgroud)\n\xe2\x9d\xaf cat\n^[[1;2D^[[1;2C^[\xce\xa9^[\xe2\x89\x88^[\xc3\xa7\n这是按下后的输出:
\nshift-left、shift-right、cmd+z、cmd+x和cmd+c后的输出。某些键可能不会出现。在这种情况下,请检查您的终端配置,该密钥可能绑定到某些终端功能(例如
\ncmd+n可能会打开一个新的终端窗格,cmd+t可能会打开一个新的终端选项卡)。另请参阅
\nterminfo(5)查找某些键的另一种方法。
如果您使用 iTerm2,更改cmd+v绑定的内容可能会使粘贴到命令行以外的任何内容上的行为有所不同,并且需要重新映射该特定程序(例如,在诸如 之类的程序的搜索提示中less)。如果您想避免这种情况,请不要更改 iTerm2 的映射cmd+v,并注释掉/删除widget::paste.
esc可能会与oh-my-zsh\ 的sudo插件发生冲突并给出奇怪的行为。您可以注释掉/删除esc数组中的行,或建议修复。
right与 冲突zsh-autosuggestion,即它不会接受该建议。您可以从数组中注释掉
此页面上的所有解决方案要么不完整,要么过于侵入性,因此它们会对其他插件(例如 zsh-autosuggestions 或 zsh-syntax-highlighting)产生负面干扰。因此,我想出了一种效果更好的不同方法。
https://github.com/jirutka/zsh-shift-select/
该插件不会覆盖任何现有的小部件,并且仅绑定移位键。它创建一个新的 Shift 选择键映射,当调用 Shift 选择(使用任何定义的 Shift 键)时自动激活该键映射,并在 Shift 选择中未定义的任何键上停用(当前键映射切换回主键)键映射。由于这种方法,它不会干扰其他插件(例如,它可以与 zsh-autosuggestions 一起使用,无需任何更改)。
| 归档时间: |
|
| 查看次数: |
3077 次 |
| 最近记录: |