1

在崇高的文本 2 中,当您:

BLOCK { <Return>

它生成(管道是光标):

BLOCK {
  |
}

我怎样才能让 Vim 表现得这样?

我有autoindent开和smartindent关,因为smartindent它在返回时这样做:

BLOCK {
 |}

更清楚地说,我特别在寻找 2 个返回,向上移动一行,并在(具体为 2 个软标签)中添加标签。我已经让它自动匹配字符,如,{等。([

4

5 回答 5

3

一个简单的映射将适用于大多数目的:

imap {<cr> {<cr>}<c-o>O

根据插件的不同,一些用户可能需要inoremap而不是imap.

于 2012-12-03T21:46:54.500 回答
2

之前是 TextMate,现在是 ST2。

你面前基本上有两条路。

  • “愚蠢”的道路

    可以想出这种方法的几十种变体:您只需创建一个映射来执行实现目标所需的一系列按键:

    inoremap {<CR> {<cr><cr>}<C-o>k<tab>
    

    我称它为“愚蠢”,但这并不意味着你会愚蠢地使用它:它技术含量低,没有依赖关系,易于定制,并且可以映射到任何你喜欢的东西。

  • “聪明”的方法

    此方法涉及使用插件。我使用DelimitMate,但还有很多其他的,选择你的毒药。

于 2012-12-03T21:38:59.123 回答
1

我对 vim 插件做了一些快速挖掘(这通常是这类问题的解决方案)。我认为我没有找到您想要的:有一些接近的插件,但没有在右大括号之前插入额外的换行符。

可以做类似的事情

imap { {<return><return>}<up><tab>

但是,如果您使用在其他情况下使用大括号的语言工作,这将变得很尴尬。您可以改为对换行做出反应:

inoremap <return> <return><return>}<up><tab>

当然,这将在每个输入的换行符上触发,而不仅仅是在左大括号后面的那些。要让它检查大括号是否是当前行的最后一个字符,您可以:

  • 有一个看起来像的函数(在 ~/.vimrc 或 ~/.vim/plugin 的某个地方)

    function! CloseBraceIfOpened()
      if getline(".")[-1:] == '{'
        " insert a space and then delete it to preserve autoindent level
        exec "normal o "
        normal x
        normal o}
        normal k
      else
        normal o
      endif
    endfunction
    
  • 也做

    inoremap <buffer> <enter> <esc>:call CloseBraceIfOpened()<enter>A
    

请注意,这imap是特定于缓冲区的,因此映射仅适用于您在运行它时所在的缓冲区。要将其应用于所有缓冲区,请删除<buffer>.

如果你真的有野心/特别,你可以在函数中做测试,看看当前行中的代码是否真的打开了一个块。

要使缩进按您想要的方式工作,请打开“自动缩进”和“智能缩进”设置。

: set autoindent smartindent

要默认启用它,请添加

set autoindent smartindent

~/.vimrc.

于 2012-12-03T20:57:12.853 回答
0

我使用以下地图:

inoremap {{ {<CR><CR>}<ESC>kcc

所以{<CR>我没有使用这个映射。除此之外,我还使用 romainl 提到的插件,DelimitMate 用于其他带大括号的映射。

于 2012-12-04T00:13:27.750 回答
0

我有同样的问题,delimitMate 解决了它。安装后,您可以通过以下方式启用它:

let g:delimitMate_expand_cr = 1

有很多技巧可以提供 SublimeText 体验。因为我感到沮丧,所以我创建了一个项目,该项目在单个 vim 发行版中包含所有这些功能(无需安装/编译外部插件/工具)。

您可以从这里查看:https ://github.com/fatih/subvim

于 2013-04-06T14:47:34.140 回答