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

时间:2011-05-04 03:00:20

标签: vim auto-indent tabstop

看来如果我们启用'ai',vim会用tabstop填充前导空格。 我可以用'et'填充空间。我不喜欢混合了space和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中添加每个文件类型。

我想要的只是简单

  1. 自动填充领先区域 空间;
  2. 在键盘上点击'TAB'时,tabstop 输入,而不是空间(所以没有'et')
  3. 怎么做?

3 个答案:

答案 0 :(得分:1)

inoremap <expr> <tab> ((getline('.')[:col('.')-2]=~'\S')?("\<C-v>\t"):(repeat(' ', &ts-((virtcol('.')-1)%&ts))))

如果我正确阅读它,它与@Lynch答案相同。

您还可以使用<C-v><Tab>:这将插入<Tab>而不调用任何映射并忽略expandtab,除非您因某种原因重新映射<C-v><C-v><Tab>

如果您只想插入标签

inoremap <Tab> <C-v><Tab>

它会忽略expandtab设置。

答案 1 :(得分:0)

我是用函数做的。我测试了它,但也许在某些特殊情况下你将不得不修复一些错误。尝试将此添加到您的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

Basicaly它会将您在视觉模式下的密钥重新映射到Inserttab()函数。另请注意,如果将ts更改为4以外的值,则仍会输出4个空格而不是2个,因为该值是硬编码的。

我对vim脚本也不太熟悉,但我认为所有使用的变量都是全局的,这是一件坏事。

我忘了提到“看到”白色空格你可以使用set list。您可以使用set nolist禁用此功能。同样在正常模式下,您可以使用ga查看有关光标所在字符的信息。

修改 我意识到你可能想在行的开头插入制表符。我的脚本在其他任何地方的开头和标签处插入空格。

如果你真的想要每次点击Tab键时都有一个标签,你只需使用它:

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
    let insert = "\t"
    let line = before . insert . after 
    call setline('.', line)
    call cursor(line('.'), strlen(before . insert))
endfunction

inoremap <tab> <esc>:call Inserttab()<CR>a

但是我没有看到这一点,在这个版本中你永远无法从插入模式手动缩进。

答案 2 :(得分:0)

一种方法是

  1. :设置sw = 4(或任何你想要的)
  2. :设置ts = 46(或一些大数字)
  3. 然后autoindent不会插入标签,除非你达到46个空格,在这种情况下你可以输入更高的数字。

    如果只有其他人正在使用标签,那么只需要拖动它,然后您必须重置ts以同意您正在编辑的文件。另一方面,它会使标签立即显而易见,这也是可取的。