当前位置:  开发笔记 > 编程语言 > 正文

集成readline的kill-ring和X11剪贴板

如何解决《集成readline的kill-ring和X11剪贴板》经验,为你挑选了3个好方法。

在我看来.zshrc,我使用以下代码片段来集成shell的剪贴板和我的主要X11剪贴板.由于这种集成,我可以在emacs,firefox和终端上剪切和粘贴文本,而无需使用鼠标.

kill-line() { zle .kill-line ; echo -n $CUTBUFFER | xclip -i }
zle -N kill-line # bound on C-k

yank() { LBUFFER=$LBUFFER$(xclip -o) }
zle -N yank # bound on C-y

注意:我也在mac os x上使用这个技巧(使用pbcopy/pbpaste而不是xclip)并且由于Synergy,我的两台计算机共享一个剪贴板.整齐.但它不适用于readline.我发现自己经常使用readline,例如在(i)python,gdb,ncftp ......

所以我的问题就出现了:有没有办法将readline的剪贴板与世界其他地方集成?

当然,我在.inputrc这里想到一些巫术,但任何见解/想法都会受到欢迎.



1> ephemient..:

Bash 4.0引入了一些新功能:

新闻

分配给带有' bind -x' 的键序列的命令现在在执行的命令的环境中设置两个新变量: READLINE_LINE_BUFFERREADLINE_POINT.该命令可以分别通过修改READLINE_LINE_BUFFER和更改当前的readline行和光标位置READLINE_POINT.

NEWS文件似乎不准确; READLINE_LINE(不_BUFFER)是其他地方记录的,实际上是有效的.

以下将模拟Bash现有的Ctrl+(U| K| Y)行为但影响X选择,但我使用Meta/ Esc因为我不喜欢覆盖现有功能.

_xdiscard() {
    echo -n "${READLINE_LINE:0:$READLINE_POINT}" | xclip
    READLINE_LINE="${READLINE_LINE:$READLINE_POINT}"
    READLINE_POINT=0
}
_xkill() {
    echo -n "${READLINE_LINE:$READLINE_POINT}" | xclip
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}"
}
_xyank() {
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$(xclip -o)${READLINE_LINE:$READLINE_POINT}"
}
bind -m emacs -x '"\eu": _xdiscard'
bind -m emacs -x '"\ek": _xkill'
bind -m emacs -x '"\ey": _xyank'

我仍然喜欢screen更多,但这更好地回答了你的问题 - 只要你关心的唯一的readline应用程序是Bash.



2> ephemient..:

就个人而言,我在GNU屏幕内运行所有内容.这为所有基于终端的程序提供了大量功能,而不仅仅是基于readline的程序.它有自己的粘贴缓冲区,它们在当前会话中的所有屏幕之间共享,并且可以读/写交换文件(可配置bufferfile).

使用Ctrl+ A,, [< 运动 > Space,< 运动 > 进行屏幕选择;

复制到粘贴缓冲区Enter;

粘贴Ctrl+ A, ];

Ctrl+ A,替换为交换文件的内容<;

Ctrl+ A,写到交换文件>.

然后你需要的只是小助手来同步/tmp/screen-exchange和X选择.像这样简单的东西可行.

# ~/.screenrc (or entered at C-a : command prompt)
bind '{' exec sh -c 'xclip -o>~/.screen_exchange'
bind '}' exec sh -c 'xclip -i ~/.screen_exchange'

当然,一些更好的绑定和宏会使生活更轻松(这需要C-a { C-a < C-a ]将X选择粘贴到终端),但这完全取决于你.



3> Wei Hu..:

我想_xyank()基于ephemient的答案提出以下功能:

_xyank() {
    CLIP=$(xclip -o)
    COUNT=$(echo -n "$CLIP" | wc -c)
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}${CLIP}${READLINE_LINE:$READLINE_POINT}"
    READLINE_POINT=$(($READLINE_POINT + $COUNT))
}

这样做是将光标移动到被拉动的文本的末尾,使其与其他内置命令更加一致.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有