LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3509|回复: 5

让 xterm 与其它程序间复制粘贴更灵活

[复制链接]
发表于 2007-1-23 21:07:43 | 显示全部楼层 |阅读模式
(当然有人更喜欢 xterm 默认的粘贴方式,这篇记录不过是让大家多一种选择)
现在情况:在 TERM 中选中文字“甲”,需鼠标中键贴入其它程序(如 firefox ),而此时在 firefox 里选中文字“乙”并不 Ctrl-c ,再用鼠标中键贴出,发现贴出“乙”,而“甲”不见了。

需要效果:在 TERM 中选中即可 Ctrl-v 贴入 firefox 一类的程序中,无需鼠标中键。而在  firefox 一类的程序中 Ctrl-c 复制后,鼠标不论再选中什么,在 TERM 中 Shift-Insert 出的依然是 Ctrl-c 的内容

        在 Xwindow 里有一个选中缓冲(PRIMARY)和一个剪贴板(CLIPBOARD)
        几乎除了 TERM 程序以外,没有还在用选中缓冲的程序
        造成 TERM 中选中的,需要鼠标中键才能贴到其它程序里。在贴之前,在其它程序中还不能选中任何东西,一旦选中,选中缓冲就被刷新

        a) xterm 功能强大,本身就带剪贴板功能,如下配置即可
        在 $HOME/.Xresources 里如下写,可让 xterm 的复制进入剪贴板,不再过选中缓中

        *VT100*translations:            #override \n\
                Shift <KeyPress> Insert:insert-selection(CLIPBOARD, CUT_BUFFER1) \n\
                ~Shift~Ctrl<Btn2Up>:    insert-selection(CLIPBOARD, CUT_BUFFER1) \n\
                ~Shift<BtnUp>:          select-end(CLIPBOARD, CUT_BUFFER1)

        前两句是说当 Shift-Insert 与鼠标中键(Btn2UP)效果是贴出剪贴板内容
        第三句是说当 鼠标左键(BtnUP)效果是复制给剪贴板

        这样一来,在 firefox 中任意选中的文字(不 Ctrl-c ),不管是 Shift-Insert 还是鼠标中键都复制不出来了

        *VT100*translations:            #override \n\
                Shift <KeyPress> Insert:insert-selection(CLIPBOARD, CUT_BUFFER1) \n\
                ~Shift~Ctrl<Btn2Up>:    insert-selection(PRIMARY, CUT_BUFFER0) \n\
                ~Shift<BtnUp>:          select-end(CLIPBOARD, CUT_BUFFER1) \n\
                ~Shift<BtnUp>:          select-end(PRIMARY, CUT_BUFFER0)

                这样就让在 firefox 里随意选中的文字,鼠标中键可贴在 TERM 中,而 Ctrl-c 的内容由 Shift-Insert 贴出
                当然配置是灵活的,随自己喜欢了。

        b) rxvt, aterm, mrxvt, rxvt-unicode 系列,需要一点小修改
                这一系列都是基于 rxvt 的,代码相近,下面以 rxvt-unicode 为例:
                (无需会编程,不过是替换游戏,把选中缓冲替换为剪贴板)
       
        原理:把选中缓冲(XA_PRIMARY)换成剪贴板(xa[XA_CLIPBOARD])即可
        vi rxvt-unicode-8.1/src/screen.C
        2895 行:
                  if (selnum == Sel_Primary)
                    sel = xa[XA_CLIPBOARD];
                  else if (selnum == Sel_Secondary)
                    sel = XA_SECONDARY;
                  else
                    sel = XA_PRIMARY;

        3066行:
                  XSetSelectionOwner (dpy, xa[XA_CLIPBOARD], vt, tm);
                  if (XGetSelectionOwner (dpy, xa[XA_CLIPBOARD]) == vt)
还是等高人做出补丁能象 xterm 那样可配置就好了,爱怎么贴就怎么贴
(刘家大少爷-2007-01-23)
发表于 2007-8-3 15:16:37 | 显示全部楼层
真是好贴啊,说的太清楚了。

我说怎么老是感觉shift-insert有时候跟右键粘贴不一致,原来是xterm的shift-insert不是从剪贴板粘贴,而是从选中缓冲粘贴。而firefox等其他软件中的shift-insert都是从剪贴板粘贴。

shift-insert的功能不一致导致了使用上的郁闷,不知道xterm的作者怎么想的,为什么要逆大流呢?
回复 支持 反对

使用道具 举报

发表于 2007-8-4 15:59:47 | 显示全部楼层
以前的X应用程序很多都是从选中缓冲粘贴的。
回复 支持 反对

使用道具 举报

发表于 2007-8-4 16:00:22 | 显示全部楼层
以前的X应用程序很多都是从选中缓冲粘贴的。
回复 支持 反对

使用道具 举报

发表于 2007-8-7 00:49:45 | 显示全部楼层
反正我没用习惯剪贴板,呼
回复 支持 反对

使用道具 举报

发表于 2011-1-28 13:24:58 | 显示全部楼层
有个小小的问题:选中缓冲不宜屏蔽,因为 stardict 之类的翻译软件读取选中缓冲,如果屏蔽的话用stardict 查词有点问题。可以将
~Shift<BtnUp>: select-end(CLIPBOARD, CUT_BUFFER1)
改为
~Shift<BtnUp>: select-end(PRIMARY, CLIPBOARD, CUT_BUFFER1)
解决。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表