gpt4 book ai didi

shell - zsh zle 移位选择

转载 作者:行者123 更新时间:2023-12-01 17:35:09 24 4
gpt4 key购买 nike

如何使用 Shift 来选择命令行的一部分(就像在许多文本编辑器中一样)?

最佳答案

扩展了 Stephane 大约 3 年前的出色答案,我添加了更多绑定(bind),以使行为(几乎)完全与 Windows 的所有标准键盘行为一致:

  • 使用导航键(箭头、home、end)而不使用 Shift 时会清除选择
  • BackspaceDel 删除事件选择
  • 使用 Ctrl+Shift+Left/Ctrl+Shift+Right 时,选择范围会扩展到下一个/上一个单词
  • Shift+HomeShift+End 分别将选择范围扩展到行首和行尾。 Ctrl+Shift+HomeCtrl+Shift+End 执行相同操作。

有两件事不完全相同:

  • 与窗口不同,将选择范围扩展到下一个单词会包含尾随空格。这个问题可以解决,但我并不介意。
  • 当有事件选择时键入不会将其删除并将其替换为您键入的字符。这似乎需要更多的工作来重新映射整个键盘。不值得我这么麻烦。

请注意,默认的 mintty 行为是绑定(bind) Shift+End 和 Shift+Home 来访问向后滚动缓冲区。这取代了 zsh 配置; key 永远不会被传递。为了使这些功能正常工作,您需要在 /etc/minttyrc~/.minttyrc 中配置不同的键(或禁用向后滚动)。请参阅“滚动修饰符”here - 最简单的解决方案就是设置 ScrollMod=2 将其绑定(bind)到 Alt 而不是 Shift

所以一切:

~/.minttyrc

ScrollMod=2

~/.zshrc

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
}

这涵盖了我使用过的几种不同键盘配置的键码。

注意:“key”列中的值没有任何意义,它们只是用于为 zle 构建命名引用。它们可以是任何东西。重要的是 seqmodewidget 列。

注释 2: 您可以绑定(bind)几乎任何您想要的键,您只需要控制台模拟器中使用的键代码即可。打开常规控制台(不运行 zsh)并输入 Ctrl+V,然后输入所需的键。它应该发出代码。 ^[ 表示 \E

关于shell - zsh zle 移位选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5407916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com