当我使用 X11 鼠标选择在两个终端窗口之间复制和粘贴文本时,制表符通常会(但并非总是)转换为空格。这似乎取决于所涉及的终端应用程序及其内部运行的程序。
这是我通过实验发现的:
- 这完全取决于源(复制)端正在运行什么。无论正在运行什么,目标(粘贴)端都会粘贴标签,只要源保留了标签即可。
- 仅
gnome-terminal
在源端保留标签。xterm
并且konsole
不保留。 - 仅当使用 输出文件时,制表符才会保留
cat
。其他应用程序(例如less
、vim
、emacs
或 )nano
不保留制表符。
这该如何解释?这些错误是konsole
和中的错误吗xterm
?或者它们可以配置不同吗?是否可以less
配置和以保留输出中的制表符?
答案1
是的,你的观察是正确的。当你复制粘贴时,目标会从源获取数据。当显示制表符时,xterm
(和konsole
)显然会将它们自己转换为空格(如果终端内运行的应用程序尚未执行此操作)。因此,当请求所选文本时,它们只需提供空格。
我甚至依稀记得几年前一位 xterm 维护者曾这样回应,声称非常困难修理...
我不知道,如何 gnome-terminal
做了正确的事情,但我很高兴他们这样做:)另一种选择是使用gvim
(图形版本vim
) - 而不是vim
在终端应用程序中运行 - 您可以安全地复制粘贴从gvim,不会丢失标签。
答案2
这有时会成为一个问题,尤其是Makefiles
需要标签的程序。不幸的是,不同程序的问题并不相关。每个程序可能都有非常不同的解决方案。
对于 vim,您必须在文件中执行:set noexpandtab
或放置。如果您只希望设置某些文件类型,则可以在您的文件中执行自动命令,我的文件中有以下内容:set noexpandtab
~/.vimrc
noexpandtab
~/.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 个空格,并对vim
shell 脚本和 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.
您注意到的并不是错误。“这是一项功能。”唯一的问题是您需要知道如何将其关闭。