即使使用 `set expandtab` 在 vim 中获取制表符而不是空格

Getting tabs in vim instead of spaces even with `set expandtab`

我通过 vi tabtest 创建文件“tabtest”,然后键入:

a
tab
b
newline  
c
tab
d  
CTRL-C
:
wq  

我的 `.vimrc 中有 set expandtab。但是我仍然在文件中获取制表符而不是空格。

(base) balter@ab-rstudio:~$ cat -A tabtest
a^Ib$
^Ic^Id$
(base) balter@ab-rstudio:~$ cat .vimrc
let python_highlight_all = 1

set undodir=${HOME}/.vim/undo/
set backupdir=${HOME}/.vim/backup/
set directory=~/.vim/swp/
set writebackup
set noswapfile

set autoindent
set showmatch
set mouse=a
syntax on

set tabstop=4
set softtabstop=0
set shiftwidth=4
set textwidth=79
set expandtab
set smarttab
set autoindent
set fileformat=unix

set backspace=indent,eol,start
set whichwrap+=<,>,h,l,[,]

set laststatus=2
set statusline+=%F

colorscheme murphy

set paste

工具定制的黄金法则之一是只将您理解的内容放入您的配置中。了解这一点的第一步是阅读(不是略读)您计划添加的任何选项或命令的文档,然后,利用新发现的知识,思考这样做的利弊。

:help 'paste' 是一个非常强大的选项,具有 许多 明确记录的副作用,例如:

When the 'paste' option is switched on (also when it was already on):
        [...]
        - 'expandtab' is reset
        [...]

永远不要在 vimrc 中设置该选项,因为所有这些令人讨厌的副作用都是可取的 仅当使用 terminal/system 的粘贴工具时 但非常不受欢迎 其余时间 。删除它。

通常情况如下:

  1. 用户尝试使用终端的“粘贴”功能粘贴内容,结果出现乱码,
  2. 用户在 Internet 上查找它,了解 paste 选项,并且从不费心阅读其文档,
  3. 用户很快就厌倦了那种 :set paste<CR><whatever>:set nopaste<CR> 舞蹈,并决定将 set paste 添加到他们的 vimrc 中,这样它就一直开着,
  4. 用户注意到缩进或插入模式映射的问题,但无法将它们与他们将 set paste 添加到他们的 vimrc 的绝妙想法联系起来......因为他们不知道该选项的实际作用,
  5. 用户再次 上网,这提醒他们及时阅读文档会让他们意识到 set paste [=33] 的陷阱=]and 将他们引导到 :help 'pastetoggle',这很好地解决了重复性问题,而无需将 set paste 添加到他们的 vimrc
  6. 希望用户开悟。

但是,当然,真正的解决方案是获得一个适当的 Vim 和剪贴板支持,但那是另一个被打死的故事。