在 X11 中的终端窗口之间复制和粘贴标签

在 X11 中的终端窗口之间复制和粘贴标签

当我使用 X11 鼠标选择在两个终端窗口之间复制和粘贴文本时,制表符通常会(但并非总是)转换为空格。这似乎取决于所涉及的终端应用程序及其内部运行的程序。

这是我通过实验发现的:

  • 这完全取决于源(复制)端正在运行什么。无论正在运行什么,目标(粘贴)端都会粘贴标签,只要源保留了标签即可。
  • gnome-terminal在源端保留标签。 xterm并且konsole不保留。
  • 仅当使用 输出文件时,制表符才会保留cat。其他应用程序(例如lessvimemacs或 )nano不保留制表符。

这该如何解释?这些错误是konsole和中的错误吗xterm?或者它们可以配置不同吗?是否可以less配置和以保留输出中的制表符?

答案1

是的,你的观察是正确的。当你复制粘贴时,目标会从源获取数据。当显示制表符时,xterm(和konsole)显然会将它们自己转换为空格(如果终端内运行的应用程序尚未执行此操作)。因此,当请求所选文本时,它们只需提供空格。

我甚至依稀记得几年前一位 xterm 维护者曾这样回应,声称非常困难修理...

我不知道,如何 gnome-terminal做了正确的事情,但我很高兴他们这样做:)另一种选择是使用gvim(图形版本vim) - 而不是vim在终端应用程序中运行 - 您可以安全地复制粘贴gvim,不会丢失标签。

答案2

这有时会成为一个问题,尤其是Makefiles需要标签的程序。不幸的是,不同程序的问题并不相关。每个程序可能都有非常不同的解决方案。

对于 vim,您必须在文件中执行:set noexpandtab或放置。如果您只希望设置某些文件类型,则可以在您的文件中执行自动命令,我的文件中有以下内容:set noexpandtab~/.vimrcnoexpandtab~/.vimrc

"indenting defaults: 4 spaces for an indent
set shiftwidth=4
set softtabstop=4
set expandtab

"exceptions to indenting for specific languages and files--------
"for shell scripts: 2 spaces for an indent
autocmd filetype sh setlocal shiftwidth=2
autocmd filetype sh setlocal softtabstop=2

"for Makefiles: use tabs for indents
autocmd filetype make setlocal tabstop=8
autocmd filetype make setlocal noexpandtab

这将设置制表符的默认值为 4 个空格,并对vimshell 脚本和 Makefile 进行例外处理。

对于其他程序,例如less,请尝试查看它们的手册页。它们可能有您需要的配置文件、环境变量或命令行选项。查看 less 手册页:

-xn,... or --tabs=n,...
       Sets tab stops.  If only one n is specified, tab stops  are  set
       at  multiples  of n.  If multiple values separated by commas are
       specified, tab stops are set at those positions, and  then  con-
       tinue  with  the  same  spacing  as  the last two.  For example,
       -x9,17 will set tabs at positions  9,  17,  25,  33,  etc.   The
       default for n is 8.

您注意到的并不是错误。“这是一项功能。”唯一的问题是您需要知道如何将其关闭。

相关内容