3

似乎如果我们启用 'ai',vim 会用制表符填充前导空格。我可以用'et'让它填充空间。我不喜欢混有空格和制表位的 C 文件。

我的 vimrc:

set ts=4 et
set ai
set hlsearch
syntax on
filetype plugin indent on
autocmd FileType make setlocal noexpandtab

但是,在某些情况下,当我在键盘上点击“TAB”时,我确实需要输入制表符,例如,在 makefile 和其他一些情况下。'autocmd FileType' 命令不好:我不能在 vimrc 中添加所有文件类型。

我想要的很简单

  1. 自动缩进以用空格填充前导区域;
  2. 当在键盘上点击“TAB”时,制表符输入,而不是空格(所以没有“et”)

怎么做?

4

3 回答 3

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 设置。

于 2011-05-04T04:39:41.947 回答
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

基本上,它确实将您在可视模式下的键重新映射到函数 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

但我不明白这一点,使用此版本,您将永远无法从插入模式手动缩进。

于 2011-05-04T04:27:18.560 回答
0

一种方法是

  1. :set sw=4 (或任何你想要的)
  2. :set ts=46 (或一些大数字)

然后 autoindent 将不会插入制表符,除非您达到 46 个空格,在这种情况下您可以输入更大的数字。

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

于 2014-02-19T00:17:24.800 回答