less, diff 等命令把结果直接输出到终端时会把 tab 转换为空格,有办法阻止这些命令做转换吗?

2023-10-08 15:14:59 +08:00
 wniming

不仅这里命令,用 vim 打开文本,如果我想直接在终端软件(比如 gnome-terminal)里复制代码,tab 也会变为空格。

我非常不理解这些这些程序为什么要怎么做,cat 命令就不会做转换。

1553 次点击
所在节点    Linux
21 条回复
kneo
2023-10-08 15:22:02 +08:00
有没有可能是你终端的问题?
rrfeng
2023-10-08 15:23:34 +08:00
因为 tab 是 control character
cy18
2023-10-08 15:26:55 +08:00
用>重定向输出没问题,还是 tab 。
终端内部处理应该也还是 tab ,但是输出到 GUI 渲染出来应该就是空格了。
wniming
2023-10-08 15:27:25 +08:00
wniming
2023-10-08 15:27:47 +08:00
@rrfeng 具体一些
wniming
2023-10-08 15:29:30 +08:00
@cy18 为啥 gui 要把 tab 渲染空格? cat 输出的 tab 就不会渲染成空格。
cy18
2023-10-08 15:38:35 +08:00
@wniming #6 什么叫 cat 输出的 tab 就不会渲染成空格?
在 1.txt 里面输几个 tab 。
cat 1.txt ,终端上显示的就是空格,cat 1.txt> 2.txt ,2.txt 里面就是 tab 。
less 跟 diff 也一样,less 1.txt > 3.txt ,3.txt 里面还是 tab 没变
cy18
2023-10-08 15:40:17 +08:00
@wniming #6 你用的什么终端软件?可能我的终端不支持。
wniming
2023-10-08 15:42:38 +08:00
@cy18 你不信的话看一下我 4 楼的回复里给出的第二个链接,人家问的问题跟我一样

你用鼠标双击选中 cat 和 less 输出的空白区域就知道啥意思了。
wniming
2023-10-08 15:43:52 +08:00
@cy18 gnome-terminal, xfce4-terminal, xterm 表现都完全一样,你用的是 linux 系统么?
cy18
2023-10-08 15:59:32 +08:00
@wniming #10 不是,抱歉,打扰了,告辞
rrfeng
2023-10-08 15:59:55 +08:00
man less 找到 character set 一节就可以看到。

因为 less 是可交互的,tab 有特殊意义的。

more 也不会,你把 git pager 设置成 more 就行了。

为什么非要用 less 呢?
wniming
2023-10-08 16:04:18 +08:00
@rrfeng less 是很常用的命令吧,比如用 less 在 terminal 里看代码,看到某一段想用鼠标直接拷贝出来粘贴到别处,vim 也一样。
rrfeng
2023-10-08 16:19:05 +08:00
是很常用,但是它设计上就是会用 space 代替 tab ,接受这个设定就行了。
libook
2023-10-08 16:42:16 +08:00
https://man7.org/linux/man-pages/man1/less.1.html#NATIONAL_CHARACTER_SETS
手册上说 TAB 属于 control characters ,不能被直接显示。

因为 less 指令的输出最终还是从终端上显示出来的,而 control characters 在会被终端进行特殊处理,可能会导致最终显示的结果部分不受 less 指令的控制。

类似的还有 ANSI 颜色,负责上色的并不是输出文本的指令,而是指令将颜色符号原样传给终端,终端在进行上色处理,所以你调整颜色方案是在终端上调,而不是在 shell 或者指令上面调。
hugulas
2023-10-08 20:14:52 +08:00
gpt 答案: 我验证了 less -R, 你试试

-R or --RAW-CONTROL-CHARS
Like -r, but only ANSI "color" escape sequences and OSC 8 hyperlink sequences are output in "raw" form. Unlike -r, the screen appearance is maintained correctly, provided that there are no escape sequences in the file other than
these types of escape sequences. Color escape sequences are only supported when the color is changed within one line, not across lines. In other words, the beginning of each line is assumed to be normal (non-colored),
regardless of any escape sequences in previous lines. For the purpose of keeping track of screen appearance, these escape sequences are assumed to not move the cursor.

OSC 8 hyperlinks are sequences of the form:

ESC ] 8 ; ... \7

The terminating sequence may be either a BEL character (\7) or the two-character sequence "ESC \".

ANSI color escape sequences are sequences of the form:

ESC [ ... m

where the "..." is zero or more color specification characters. You can make less think that characters other than "m" can end ANSI color escape sequences by setting the environment variable LESSANSIENDCHARS to the list of
characters which can end a color escape sequence. And you can make less think that characters other than the standard ones may appear between the ESC and the m by setting the environment variable LESSANSIMIDCHARS to the list of
characters which can appear.


这个问题可能是由终端软件的显示设置引起的,而不是由具体的命令本身引起的。许多终端软件默认将制表符( Tab )转换为空格以实现对齐的效果。

不过,你可以尝试按照下面的方法进行调整,使终端软件不对制表符进行转换:

对于 less 命令,你可以尝试在终端中使用 -R 或 --RAW-CONTROL-CHARS 选项来显示控制字符,包括制表符。示例命令如下:
less -R <file>
对于 vim ,你可以编辑其配置文件 ~/.vimrc (如果不存在,可以创建一个),将下面的内容添加到文件中:
set paste
然后保存并退出,并重新启动 vim ,它将开启“粘贴模式”,在此模式下粘贴的文本将保留制表符。

无论是 less 还是 vim ,它们的行为都受到终端软件的限制。所以,你还可以尝试以下方法来修改终端软件的显示设置:

对于 GNOME Terminal:打开终端后,点击菜单栏的“编辑”选项,然后选择“首选项”。在“首选项”对话框中,导航到“选项”选项卡,取消勾选“将制表符转换为空格”选项。然后点击“关闭”按钮保存更改。

对于其他终端软件(例如 Konsole 、Terminator 等):请参考其各自的文档或设置菜单,查找类似的选项以禁止制表符转换为空格。

希望这些方法能够帮助你在终端中保留制表符的原始格式。
wniming
2023-10-08 20:37:23 +08:00
@hugulas 都不管用
comingnine
2023-10-09 01:34:28 +08:00
输出到终端时和输出到文件时好像是设计为不一样啊
comingnine
2023-10-09 01:37:34 +08:00
制表符跳不少呢,原样输出的话,屏幕会放不开么,会因为这个而不原样输出么
zhuisui
2023-10-09 09:55:28 +08:00
cat 也会渲染成空格呀,用 --show-tabs 会改为渲染成 ^I

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/979876

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX