如何使用shift来选择命令行的一部分(就像在许多文本编辑器中一样)?
发布于 2015-06-18 02:17:02
在斯蒂芬近3年前的出色回答的基础上,我添加了更多的绑定,以使行为(几乎)与所有Windows的标准键盘行为完全一致:
使用导航键(箭头、home、end)而不使用shift
Backspace和selection
Del删除选择。使用Ctrl+Shift+Left/Ctrl+Shift+Right
Shift+Home和Shift+End时,激活的删除将扩展到下一个/上一个单词。将选择分别扩展到行首和行尾。Ctrl+Shift+Home和Ctrl+Shift+End也是这样做的。两件事并不完全相同:
与窗口不同,
请注意,默认的mintty行为是绑定Shift+End和Shift+Home以访问回滚缓冲区。这取代了zsh配置;密钥永远不会被传递。为了使这些功能正常工作,您需要在/etc/minttyrc或~/.minttyrc中配置不同的键(或禁用回滚)。参见“用于滚动的修饰符”here --最简单的解决方案是设置ScrollMod=2将其绑定到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构建一个命名引用。它们可能是任何东西。重要的是seq、mode和widget列。
注意2:你几乎可以绑定任何你想要的键,你只需要在你的控制台模拟器中使用的键代码。打开常规控制台(不运行zsh),然后键入、Ctrl+V、,然后输入所需的密钥。它应该发出代码。^[的意思是\E。
发布于 2021-09-20 03:07:49
感谢你的回答,我安心地做了我的脚本,用键盘选择和复制。
如果有人想过滤出更干净的东西,我会很感激的。
它是~/.zshrc文件的一部分,并将其放入主用户文件夹。
alias pbcopy="xclip -selection clipboard"
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
super sup $'\ec' widget::copy-selection
) {
functions[shift-$key]="shift-arrow $widget"
zle -N shift-$key
bindkey ${terminfo[k$kcap]-$seq} shift-$key
}
zle -N widget::copy-selection
# copy selected terminal text to clipboard
function widget::copy-selection {
if ((REGION_ACTIVE)); then
zle copy-region-as-kill
printf "%s" $CUTBUFFER | pbcopy
fi
}我使用de windows+c按钮复制选定的字符。我正在使用ubuntu 20.04和配置的键盘选项来使用像meta一样的win按钮!在此之后,在终结器的首选项中,我将粘贴快捷方式更改为windows+v,jts,因为我认为它像control+x和COntrol+v那样更快
https://stackoverflow.com/questions/5407916
复制相似问题