0

问题

在以下示例中:

  1. 为什么在第一行中,\t插入了 a 但只显示 4-col 空白?不应该8按照tabstop吗?
  2. 为什么<TAB>第一行和第五行的两次命中结果不同?(一个是09,另一个是20202020

.vimrc

set noexpandtab
set tabstop=8                             
set shiftwidth=4                                    
set softtabstop=4

文本

我通过首先插入 8 个空行然后在每行的开头键入来创建以下文本,这样就没有shiftwidth生成。(通过点击插入下面的每个 4 列空白<TAB>):

1tab    done
2tabs        done
3tabs            done
4tabs                done
    1tab
        2tabs
            3tabs
                4tabs

十六进制表示

然后我做了:%!xxd,这就是我得到的(带有一些尾随换行符):

0000000: 3174 6162 0964 6f6e 650a 3274 6162 7309  1tab.done.2tabs.                                                                                                        
0000010: 2020 2020 646f 6e65 0a33 7461 6273 0909      done.3tabs..                                                                                                        
0000020: 646f 6e65 0a34 7461 6273 0909 2020 2020  done.4tabs..                                                                                                            
0000030: 646f 6e65 0a20 2020 2031 7461 620a 0932  done.    1tab..2                                                                                                        
0000040: 7461 6273 0a09 2020 2020 3374 6162 730a  tabs..    3tabs.                                                                                                        
0000050: 0909 3474 6162 730a 0a0a 0a0a 0a0a 0a0a  ..4tabs.........

相关讨论

这里有一些很好的答案,但我仍然不明白在这种特殊情况下发生了什么。

4

2 回答 2

1
  1. softtabstop旨在以这种方式使用,它会使您的标签显示一定的长度,即使它们确实是tabstop

    'softtabstop' 'sts' 数字(默认 0)

    ...

    这有助于将“ts”设置保持在其标准值 8,同时能够像设置为“sts”一样进行编辑。但是,像“x”这样的命令仍然适用于实际字符。

  2. 至于在开头插入空格的奇怪行为,我相信它与smarttab默认情况下打开并转换而不是在行首插入制表符有关。

    'smarttab' 'sta' 布尔型(默认开启) 全局

    启用时,行前的 <Tab> 根据 'shiftwidth' 插入空白。'tabstop' 或 'softtabstop' 用于其他地方。A 将在行首删除一个 'shiftwidth' 值的空间。

于 2015-12-16T16:18:12.197 回答
0

IGI-111 正确回答了您的第一个问题,尽管可能不够清楚。

  1. 为什么在第一行中,\t插入了 a 但只显示 4-col 空白?不应该8按照tabstop吗?

请记住,TAB 不会插入固定数量的空白,而是将位置推进到某个数字的下一个倍数(如果从零开始编号)。

您所说的“即使它们确实是长度 tabstop”是什么意思?

他一定是说,当打印到您的终端时,TAB 字符会导致光标位置前进到 (8) 的下一个倍数,tabstop同时按下前进到(4) 的下一个倍数。如果下一个 of不是 的倍数,则必须使用空格 (0x20)。Tabvimsofttabstopsofttabstoptabstopvim

  1. 为什么<TAB>第一行和第五行的两次命中结果不同?(一个是09,另一个是20202020

那是因为在第一行中您Tab在键入 后点击1tab,即您在位置 4 并前进到位置 8,这是 的倍数tabstop,TAB (0x09) 完成了这项工作,而在第五行中您Tab在开始时点击位置 0 并前进到位置 4,它不是 的倍数tabstop,需要空格。

于 2017-10-25T13:04:22.607 回答