Vim正常模式将标签显示为1个字符宽,未与左边距对齐

时间:2017-10-08 18:58:02

标签: go vim indentation gofmt

enter image description here 这是我的光标进入正常模式的最左边。

enter image description here 这就是它在插入模式下的外观。

我有以下文件类型设置

au BufNewFile,BufRead *.py
     \ set tabstop=4 |
     \ set softtabstop=4 |
     \ set shiftwidth=4 |
     \ set textwidth=79 |
     \ set expandtab |
     \ set autoindent |
     \ set fileformat=unix |

 au BufNewFile,BufRead *.js, *.html, *.css
     \ set tabstop=2 |
     \ set softtabstop=2 |
     \ set shiftwidth=2 |

 au BufNewFile,BufRead *.go
     \ set tabstop=4 |
     \ set softtabstop=4 |
     \ set shiftwidth=4 |
     \ set noexpandtab |
     \ set smarttab
  

这通常发生在.go个文件中,因为我猜我有noexpandtab。但光标在正常模式下不会进入-0列,这让我感到非常震惊。

1 个答案:

答案 0 :(得分:2)

你看到的是正常的Vim行为。在以<Tab>字符开头的行上,光标在上显示字符;当一个标签占据(默认8个)屏幕单元时,Vim将光标放在字符的末尾(对于双宽字符,Vim也是字符的两倍,但是8字符宽的光标可能看起来很糟糕,可能不会在正常模式中技术上可以在终端中)。在插入模式中,光标位于字符之间,因此您可以将光标定位在(例如gI)之前和(I)标签之前。

疗法

最好接受这种行为;如果你真的不能忍受,这里有一些改变行为的选择。不幸的是,每个都有警告和缺点:

  • 使用:set list,Vim可以根据需要将光标放在前面。但是你也会看到突出显示的空白。您可以使用'listchars'选项来减少视觉噪音,但之后您将失去这个有用的功能。
  • 使用:set virtualedit=all,您可以将光标定位在选项卡内的任何位置。在它的中间开始编辑会将标签字符分解为前后空格。此外,您可以将光标放在物理文本后面的任何位置。
  • 使用:autocmd s,您可以在读取缓冲区时将制表符转换为空格,然后再写入。 (见:help retab-example