zsh 像 emacs 一样复制和粘贴

zsh 像 emacs 一样复制和粘贴

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

答案1

Zsh 有一个内置剪贴板,不与其他应用程序通信。由于它非常易于编写脚本,因此您可以使其与~/.zshrc.你需要剪辑或者谢尔。看从剪贴板粘贴到启用 vi 的 zsh 或 bash shell用于 vi 模式下的概念验证。这是 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 主要选择(选择时自动复制,并使用鼠标中键粘贴)。

答案2

我一直想将 Zsh 的剪切缓冲区与 X 剪贴板集成。我尝试了上述http://stchaz.free.fr/mouse.zsh但我发现我不喜欢将所有 Zsh 操作填充到剪贴板。例如,有时我会在浏览器中复制某些内容,然后转到 shell 并编辑命令行,然后粘贴。但经常编辑命令行(例如删除一个单词)会修改 Zsh 剪切缓冲区。无论好坏,X 只有一个剪贴板,而不是一个杀环,所以当 Zsh 编辑操作覆盖剪贴板时,我想要粘贴的东西就丢失了 - 我无法像我一样猛拉弹出它(Cy My)在 Zsh 或 Emacs 中执行。

因此,我所做的是创建新的特殊键绑定以通过 zsh 与 X 剪贴板进行交互。结果“^Xw”和“^Xy”在 Emacs 和 Zsh 中都未使用,因此我可以通过在两个应用程序中绑定它们来获得一致的接口。这样,正常的编辑操作、剪切缓冲区和终止环就不会受到影响。如果我想将某些内容复制到剪贴板,我可以设置该区域并执行“^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

答案3

您可能想看看http://stchaz.free.fr/mouse.zsh除了添加鼠标支持之外,它还尝试与 X 剪贴板进行交互。

答案4

对于 macOS 用户:以下是如何将 ESC-w(又名 Meta-w 或 Option-w)复制到 macOS 粘贴板以及 zsh 内置剪贴板。

pb-copy-region-as-kill () {
  zle copy-region-as-kill
  print -rn $CUTBUFFER | pbcopy
}
zle -N pb-copy-region-as-kill
bindkey -e '\ew' pb-copy-region-as-kill

为了完整起见:这里还有 Ctrl-u 和 Ctrl-k 的代码

pb-backward-kill-line () {
  zle backward-kill-line
  print -rn $CUTBUFFER | pbcopy
}
zle -N pb-backward-kill-line
bindkey -e '^u' pb-backward-kill-line
pb-kill-line () {
  zle kill-line
  print -rn $CUTBUFFER | pbcopy
}
zle -N pb-kill-line
bindkey -e '^k' pb-kill-line

相关内容