vim-设置自动缩进,用空格或制表符填充前导空格

vim-设置自动缩进,用空格或制表符填充前导空格,vim,auto-indent,tabstop,Vim,Auto Indent,Tabstop,似乎如果我们启用“ai”,vim将用tabstop填充前导空间。 我可以用“et”来填充空格。我不喜欢混合了空格和tabstop的C文件 我的vimrc: set ts=4 et set ai set hlsearch syntax on filetype plugin indent on autocmd FileType make setlocal noexpandtab 然而,在某些情况下,当我点击键盘上的“TAB”时,我确实需要输入tabstop,例如,在makefile和其他一些文件中

似乎如果我们启用“ai”,vim将用tabstop填充前导空间。 我可以用“et”来填充空格。我不喜欢混合了空格和tabstop的C文件

我的vimrc:

set ts=4 et
set ai
set hlsearch
syntax on
filetype plugin indent on
autocmd FileType make setlocal noexpandtab
然而,在某些情况下,当我点击键盘上的“TAB”时,我确实需要输入tabstop,例如,在makefile和其他一些文件中。 “autocmd FileType”命令不好:我无法在vimrc中添加所有文件类型

我想要的很简单

  • 自动缩进以填充前导区域 空间
  • 当点击键盘上的“TAB”时,tabstop 输入,而不是空格(因此没有“et”)

  • 怎么做?

    我是用函数做的。我对它进行了测试,但在某些特定情况下,您可能需要修复一些bug。尝试将此添加到vimrc:

    set et
    
    function! Inserttab()
        let insert = ""
        let line = getline('.')
        let pos = getpos('.')[2]
        let before = ""
        let after = line
        if pos != 1
            let before = line[ 0: pos - 1]  
            let after = line[pos : strlen(line) ]
        endif
        if pos != 1 && substitute(before, "[ \t]", "", "g") != "" 
             let insert = "\t"
        else
             let insert = "    "
        endif
        let line = before . insert . after 
        call setline('.', line)
        call cursor(line('.'), strlen(before . insert))
    endfunction
    
    inoremap <tab> <esc>:call Inserttab()<CR>a
    
    但是我不明白这一点,使用这个版本,您将永远无法从插入模式手动缩进。

    inoremap((getline('.)[:col('.)-2]=~'\S')?(“\\t”):(重复('.,&ts-((virtcol('.)-1)%&ts)))
    
    inoremap <expr> <tab> ((getline('.')[:col('.')-2]=~'\S')?("\<C-v>\t"):(repeat(' ', &ts-((virtcol('.')-1)%&ts))))
    
    如果我阅读正确,它与@Lynch answer的功能相同

    您还可以使用
    :这将插入
    ,而不调用任何映射,并忽略expandtab,除非您出于某种原因重新映射

    如果只想插入选项卡,请执行以下操作

    inoremap <Tab> <C-v><Tab>
    
    inoremap
    
    它将忽略expandtab设置。

    一种方法是

  • :设置sw=4(或任何您想要的)
  • :设置ts=46(或一些大数字)
  • 然后自动缩进将不会插入制表符,除非您达到46个空格,在这种情况下,您可以输入更大的数字


    如果其他人正在使用选项卡,则必须重置ts以同意您正在编辑的文件。另一方面,它会使选项卡立即变得明显,这也是可取的。

    MakefileFileType插件已经在本地取消了expandtab。哦,这真的很难。我认为可能存在一个简单的解决方案。令人恼火的是自动缩进在缩进空间中自动插入制表符。我讨厌这个。如果我禁用自动缩进,只需删除“et”即可达到我的目的^^经过深思熟虑,我喜欢ZyX的inoremap解决方案。另请参阅:有关自动缩进源代码的更全面的讨论。
    inoremap <Tab> <C-v><Tab>