zsh像emacs一样复制和粘贴


10

我注意到zsh在emacs中有很多东西。我可以使用ctrl + space进行选择并选择一个区域。当我停留在zsh中时,可以像在emacs中一样进行复制。在emacs中,我可以使用系统剪贴板(以前需要一些其他配置,但这在emacs中是开箱即用的)。在zsh中,我似乎无法使用Cy从剪贴板粘贴,并且从zsh复制到系统cliipboard也有相同的问题。有没有解决的办法?

Answers:


11

Zsh的内置剪贴板无法与其他应用程序通信。由于它非常易于编写脚本,因此您可以使其与中的几行通信~/.zshrc。您将需要xclipxsel。有关在vi模式下进行概念验证的信息,请参见从剪贴板粘贴到启用vi的zsh或bash shell中。这是emacs模式的相应代码(您可能想要做与其他kill-*小部件类似的操作)。

x-copy-region-as-kill () {
  zle copy-region-as-kill
  print -rn $CUTBUFFER | xsel -i -b
}
zle -N x-copy-region-as-kill
x-kill-region () {
  zle kill-region
  print -rn $CUTBUFFER | xsel -i -b
}
zle -N x-kill-region
x-yank () {
  CUTBUFFER=$(xsel -o -b </dev/null)
  zle yank
}
zle -N x-yank
bindkey -e '\ew' x-copy-region-as-kill
bindkey -e '^W' x-kill-region
bindkey -e '^Y' x-yank

这使用X11剪贴板(通常通过Ctrl+ C/ Ctrl+ 访问V);删除-b使用X11主要选择的选项(选择时自动复制,并使用鼠标中键粘贴)。


如果你使用vi模式,只需更换kill-regionvi-deleteyankvi-put-after等类似的包装vi-yank,和其他人。(我还没有找到一种更集中的方法)
olejorgenb

4

我一直想将Zsh的剪切缓冲区与X剪贴板集成在一起。我尝试了前面提到的http://stchaz.free.fr/mouse.zsh,但是我发现我不喜欢将所有Zsh操作都填充到剪贴板中。例如,有时我会在浏览器中复制某些内容,然后转到shell并编辑命令行,然后粘贴。但是经常编辑命令行-例如删除单词-会修改Zsh剪切缓冲区。不管是好是坏,X只是有一个剪贴板,没有杀死环,因此当Zsh编辑操作覆盖剪贴板时,我想要粘贴的内容丢失了-我无法尽可能地将其粘贴(Cy My)在Zsh或Emacs中执行。

因此,我要做的是创建新的特殊键绑定,以通过zsh与X剪贴板进行交互。事实证明Emacs和Zsh都未使用“ ^ Xw”和“ ^ Xy”,因此我可以通过在两个应用程序中绑定它们来获得一致的接口。这样,正常的编辑操作,剪切缓冲区和终止环就不存在了。如果要复制某些内容到剪贴板,请设置区域并执行“ ^ Xw”(或者如果我已经杀死了该区域并且该区域处于非活动状态,则可以执行“ ^ Xw”来复制剪切缓冲区)。从剪贴板粘贴使用“ ^ Xy”完成。

# define commands to copy and paste x clipboard

# ^Xw - copy region, or cut buffer
# ^Xy - paste x clipboard

# in both cases, modifies CUTBUFFER

copy-to-xclip() {
    [[ "$REGION_ACTIVE" -ne 0 ]] && zle copy-region-as-kill
    print -rn -- $CUTBUFFER | xclip -selection clipboard -i
}

zle -N copy-to-xclip
bindkey "^Xw" copy-to-xclip

paste-xclip() {
    killring=("$CUTBUFFER" "${(@)killring[1,-2]}")
    CUTBUFFER=$(xclip -selection clipboard -o)
    zle yank
}

zle -N paste-xclip
bindkey "^Xy" paste-xclip

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.