我是C#开发人员,我是使用Vim的新手。我很好奇,你会在.vimrc
文件中放什么,这样当你输入大括号并点击Enter时,就像这样:
public void Foo() {<Enter>
支架被放在一个新线上,插入符号移动到括号的内部,如下所示:
public void Foo()
{
|
}
任何帮助将不胜感激,谢谢!
答案 0 :(得分:2)
您的问题非常接近auto-close plugin issuse with curly brackets
inoremap <expr> <cr> getline(".")[col(".")-2:col(".")-1]=="{}" ? "<cr><esc>O" : "<cr>"
回答了这个问题 - 这与我在lh-brackets中使用的有些不同。
在这里,您似乎没有使用任何包围插件。要搜索的文字变为'\S\s*{$'
,您可以改为插入:<BS><cr>{<cr>}<esc>O
,如果该行只有{<cr>}<esc>O
,则只插入{
。如果光标在{}
范围内,您还应该集成以前的测试。
这变为:
inoremap <expr> <cr>
\ getline(".") =~ '\S\s*{$' ? "<bs><cr>{<cr>}<esc>O"
\ : getline('.') =~ '^\s*{$' ? "<cr>}<esc>O"
\ : getline(".")[col(".")-2:col(".")-1]=="{}" ? "<cr><esc>O"
\ : "<cr>"
答案 1 :(得分:0)
有很多方法可以对此进行编程。作为一个例子,我可能会这样做:
inoremap {<Cr> <Esc>:call AutoBracketDrop()<Cr>a
function! AutoBracketDrop()
if col('.') == col('$') - 1
substitute /\s*$//
exec "normal! A\<Cr>{\<Cr>X\<Cr>}\<Esc>k$x"
else
exec "normal! a{\<Cr>\<Esc>"
endif
endfunction
首先,我添加一个插入映射,它将突破插入并调用AutoBracketDrop
函数,完成后返回插入模式。
该函数只是检查光标列是否与该行的最后一列匹配。如果是这样,我们删除尾随空格并附加测试:
cursor is here>
{
X
}
因为<Cr>
的使用,它应该保持缩进,就像你输入它们一样。我们必须有一个标记X
,否则Vim将从空行中删除空格并继续追加(a
)将松开缩进。这样文本最终结果如下:
cursor was here>
{
X
}
然后我们将光标向上移动一行,删除X
并退出该功能。
如果它位于行的中间,我们只需简单地重新创建用于触发映射的字符。