在Vim中自动插入一个闭合括号,并将光标放置在括号之间。

4

我发现了一些关于这个问题的帖子,但它们已经三年前的内容了。有没有什么插件可以推荐给Vim用户,使得当我输入{时,它会执行以下操作:

{
::cursor here::
}

另一个有用的事情是拥有:
if(::cursor here::)

在输入 if 后面,请按照以下步骤进行操作。

我对那个插件很好奇(最好是通用的)。目前我习惯于输入 {<Enter>}<^O>O 来达到同样的效果。 - MBO
这与Bash有什么关系? - Dennis Williamson
6个回答

3

我使用 delimiteMate.vim。它以可配置且不烦人的方式处理此问题。


2

请查看可高度自定义的插件snipMate。有一段很好的演示视频展示了该插件的功能。

例如,在C语言中使用snipMate插件。

if<Tab>

would produce:

if (::cursor:1::) {
    ::cursor:2::
}

第一个 <Tab> 将光标定位在 ::cursor:1::,第二个 <Tab> 将光标移至 ::cursor:2::。

如果 snipMate 中没有类似的功能,那么可以很容易地添加一个。


非常有用。不过在设置触发器时似乎存在一些问题(无需使用for语句或类似语句)。你有成功做到这一点的经验吗,还是只使用提供的代码片段? - stormist
我通常使用默认的代码片段,但我尝试添加了一个“{”的片段,它可以正常工作。我将这个片段http://vim.pastey.net/132128添加到~/.vim/snippets/sh.snippets(Shell脚本片段)中。 - shoban

1
我使用以下代码(php-templates):
function! EatChar()
    let l:char=getchar(0)
    return ''
endfunction

inoreabbrev function_ function <ESC>maa()<CR>{<CR><CR>}<ESC>`aa<C-O>:call EatChar()<CR>
inoreabbrev if_ if (<ESC>maa)<CR>{<CR><CR>}<ESC>`aa<C-O>:call EatChar()<CR>
inoreabbrev ifelse_ if (<ESC>maa)<CR>{<CR><CR>}<CR>else<CR>{<CR><CR>}<ESC>`aa<C-O>:call EatChar()<CR>
inoreabbrev for_ for (<ESC>maa; ; )<CR>{<CR><CR>}<ESC>`aa<C-O>:call EatChar()<CR>
inoreabbrev foreach_ foreach (<ESC>maa as $key=>$value)<CR>{<CR><CR>}<ESC>`aa<C-O>:call EatChar()<CR>
inoreabbrev while_ while (<ESC>maa)<CR>{<CR><CR>}<ESC>`aa<C-O>:call EatChar()<CR>
inoreabbrev <? <?php <ESC>maa ?><ESC>`aa<C-O>:call EatChar()<CR>

1

这篇文章展示了一个简单的解决方案,并提供了一些更为强大的链接。

以下是该页面的部分解决方案:

inoremap {      {}<Left>
inoremap {<CR>  {<CR>}<Esc>O
inoremap {{     {
inoremap {}     {}

1

有许多插件和ftplugins可以完成这项工作。大多数情况下,新的插件并不比旧的更好,因为它们经常在考虑奇怪的情况时重新发明轮子。

在“旧”的东西中,我有:

  • 我的代码括号系统,它简化了旨在插入平衡的括号字符对的映射定义。
  • 以及相关函数,旨在简化定义进化(*)代码片段(通常是控制语句)的任务。我有C++的使用示例。

(*) 在注释/字符串上下文中防止映射/缩写的扩展,提供了几种C控制语句的周围形式,并且还支持一些样式选项(在C控制语句的情况下;它们很容易转换为其他语言)


0

如果您不需要各种文本片段插件的全部功能(或者不想弄清如何配置它们以满足您的需求),并且只有几个简单的模板,那么您可以为每个模板创建一个映射。例如:

:nmap <leader>b o{<cr>}<esc>O

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接