如果我们启用'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中添加所有文件类型。
我想要的是简单的:
- 自动缩进填充前导区域空间;
- 当按键盘上的'TAB'时,制表符停止输入,而不是空格(所以没有'et')
怎么做?
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设置
我使用了一个函数。我对它进行了测试,但可能在某些特殊情况下,您将不得不修复一些错误。尝试将此添加到您的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个空格而不是两个,因为该值是硬编码的。
我也不太熟悉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
但是我看不出有什么意义,在这个版本中,你将永远无法从插入模式手动缩进
方法之一是
- :设置sw=4
- :set ts=46(或更大的数字)
自动缩进将不会插入制表符,除非您达到46个空格,在这种情况下,您可以放入更大的数字。
如果其他人正在使用制表符,那么你必须重置ts以同意你正在编辑的文件。另一方面,它将使制表符立即明显,这也是可取的。