如何在Vim中将开口花括号移动到新行?

时间:2016-02-29 19:53:13

标签: vim

我是C#开发人员,我是使用Vim的新手。我很好奇,你会在.vimrc文件中放什么,这样当你输入大括号并点击Enter时,就像这样:

public void Foo() {<Enter>

支架被放在一个新线上,插入符号移动到括号的内部,如下所示:

public void Foo()
{
    |
}

任何帮助将不胜感激,谢谢!

2 个答案:

答案 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并退出该功能。

如果它位于行的中间,我们只需简单地重新创建用于触发映射的字符。