计算机系菜鸟一个..  初次开独立博客,请多多指教!


最近用上了Terminator,平时比较懒,喜欢用拖拽文件到终端的方式来获取一个文件的路径。
其他terminal要么不能用,要么挺好,而这个Terminator却偏偏在最后出了问题。文件名末尾给自动换行了。如下:
screen

因为输入没结束就换行的话终端会进入继续输入的状态。而此时没法回到上一行编辑,所以删都没法删。
只能回车,出错,然后向上箭头调出原来的命令来删掉多余的换行。

检查了一下代码,发现是拖放文件处理的代码问题。
还好lib大都是py文件,可以直接编辑,否则就要重新编译了。
找到terminatorlib所在目录(ubuntu 使用apt-get 默认在/usr/share/terminator/terminatorlib),直接编辑terminal.py
如下部分:

   def on_drag_data_received(self, widget, drag_context, x, y, selection_data,
            _info, _time, data):
        """Something has been dragged into the terminal. Handle it as either a
        URL or another terminal."""
        dbg('drag data received of type: %s' % selection_data.type)
        if gtk.targets_include_text(drag_context.targets) or \
           gtk.targets_include_uri(drag_context.targets):
            # copy text to destination
            txt = selection_data.data.strip(' ')
            if txt[0:7] == 'file://':
                txt = "'%s'" % urllib.unquote(txt[7:])
            else:
                txt = txt.split('\n')[0]
            for term in self.terminator.get_target_terms(self):
                term.feed(txt)
            return

可以看出这里如果获取到文件则去掉”file://”前缀,两旁加两个单引号。如果是其他,比如另一个terminator窗口,则取’\n’前面的部分另外处理。
不知道是否是我系统是中文,所以则拖拽文件进去的时候获取到的路径末尾肯定会有一个”\r\n”,而终端接受到就直接将其变成两行了。英文机器可能只有一个’\n’吧

我的做法是直接在获取到地址的时候不管如何,直接从\r\n开始,反正多个文件拖拽本来也不支持,用处也不大。
即将这里:

            # copy text to destination
            txt = selection_data.data.strip(' ')
            if txt[0:7] == 'file://':
                txt = "'%s'" % urllib.unquote(txt[7:])
            else:
                txt = txt.split('\n')[0]
            for term in self.terminator.get_target_terms(self):
                term.feed(txt)

改成:

 
            # copy text to destination
            txt = selection_data.data.strip(' ')
            txt = txt.split('\n')[0]
            txt = txt.replace('\r','')
            if txt[0:7] == 'file://':
                txt = "'%s'" % urllib.unquote(txt[7:])
            for term in self.terminator.get_target_terms(self):
                term.feed(txt)

如果硬要支持多文件,那就弄成每个文件之间加个空格的形式吧。

            # copy text to destination
            txt = selection_data.data.strip(' ')
            if txt[0:7] == 'file://':
                txtsplit = txt.split('file://')
                txt = ''
                for filepath in txtsplit[1:]:
                    txt = txt + "'%s' " % urllib.unquote(filepath)
                txt = txt[0:-1]
                txt = txt.replace('\n','')
                txt = txt.replace('\r','')
            else:
                txt = txt.split('\n')[0]
                txt = txt.replace('\r','')
            for term in self.terminator.get_target_terms(self):
                term.feed(txt)
            return