通过绑定在 Vim 中插入制表符只能执行一次
Inserting a tab in Vim through a bind works only one time
我做了一个插入模式绑定(左大括号 + Enter),它在下一行输入一个制表符(4 个空格),然后是一个右大括号。
inoremap {<Enter> {<Enter><Enter>}<Up><Tab>
例子:
fn foo() {
// Some code
}
它工作正常,但是当我再次尝试使用绑定时它不会再插入制表符,只是一个新行和一个括号。
fn bar() {
if condition {
loop {
// Some more code
}
}
}
它并不漂亮,但我认为这可能会实现您的目标:
inoremap {<Enter> {<Enter><Tab><Enter>}<Esc><<<Up>A
编辑:我的解决方案之前有一个错字。如果最初不起作用,请重试
我个人建议改用缩写,这样就不会出现奇怪的延迟。
下面使用"rails.vim" like RailsExpand
函数。放入 vimrc
文件:
function! RailsExpand(root, good, ...)
let c = nr2char(getchar(0))
echom c
if c == "" || c =~ (a:0 ? a:1 : "\t")
return a:good
else
return a:root . c
endif
endfunction
iabbrev { <c-r>=RailsExpand('{', "{\<lt>cr>}\<lt>c-o>O\<tab>", '\r')<cr>
就我个人而言,我更喜欢在 <tab>
而不是 <cr>
上进行扩展,因此您可以使用:
iabbrev { <c-r>=RailsExpand('{', "{\<lt>cr>}\<lt>c-o>O\<tab>")<cr>
您不需要自己插入 <Tab>
:
inoremap {<CR> {<CR>}<C-o>O
O
将在当前行上方新开一行,缩进的数量和类型正确。
我做了一个插入模式绑定(左大括号 + Enter),它在下一行输入一个制表符(4 个空格),然后是一个右大括号。
inoremap {<Enter> {<Enter><Enter>}<Up><Tab>
例子:
fn foo() {
// Some code
}
它工作正常,但是当我再次尝试使用绑定时它不会再插入制表符,只是一个新行和一个括号。
fn bar() {
if condition {
loop {
// Some more code
}
}
}
它并不漂亮,但我认为这可能会实现您的目标:
inoremap {<Enter> {<Enter><Tab><Enter>}<Esc><<<Up>A
编辑:我的解决方案之前有一个错字。如果最初不起作用,请重试
我个人建议改用缩写,这样就不会出现奇怪的延迟。
下面使用"rails.vim" like RailsExpand
函数。放入 vimrc
文件:
function! RailsExpand(root, good, ...)
let c = nr2char(getchar(0))
echom c
if c == "" || c =~ (a:0 ? a:1 : "\t")
return a:good
else
return a:root . c
endif
endfunction
iabbrev { <c-r>=RailsExpand('{', "{\<lt>cr>}\<lt>c-o>O\<tab>", '\r')<cr>
就我个人而言,我更喜欢在 <tab>
而不是 <cr>
上进行扩展,因此您可以使用:
iabbrev { <c-r>=RailsExpand('{', "{\<lt>cr>}\<lt>c-o>O\<tab>")<cr>
您不需要自己插入 <Tab>
:
inoremap {<CR> {<CR>}<C-o>O
O
将在当前行上方新开一行,缩进的数量和类型正确。