看来如果我们启用'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中添加每个文件类型。
我想要的只是简单:
怎么做?
答案 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)
一种方法是
然后autoindent不会插入标签,除非你达到46个空格,在这种情况下你可以输入更高的数字。
如果只有其他人正在使用标签,那么只需要拖动它,然后您必须重置ts以同意您正在编辑的文件。另一方面,它会使标签立即显而易见,这也是可取的。