让Vim打开像Sublime Text 2这样的新模块

时间:2012-12-03 20:54:18

标签: vim sublimetext2

在崇高的文字2中,当你:

BLOCK { <Return>

它生成(管道是光标的地方):

BLOCK {
  |
}

如何让Vim以这种方式行事?

我已启用autoindentsmartindent已关闭,因为smartindent会在返回时执行此操作:

BLOCK {
 |}

更清楚的是,我特意寻找2个返回,向上移动一行,并在(2个软选项卡中具体)标签。我已经自动匹配了{([等字符。

5 个答案:

答案 0 :(得分:3)

简单的映射可用于大多数目的:

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

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

答案 1 :(得分:2)

在使用TextMate之前,现在是ST2。

你之前基本上有两条路径。

  • “哑”路径

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

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

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

  • “智能”方法

    此方法涉及使用插件。我使用DelimitMate,但有many others,选择你的毒药。

答案 2 :(得分:1)

我为vim插件做了一些快速挖掘(这通常是解决这类问题的方法)。我认为我没有找到你想要的东西:有a few addons that come close,但没有任何东西在结束括号之前插入额外的换行符。

可以做类似

的事情
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>

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

要让缩进按照您希望的方式工作,请启用“自动加入”和'smartindent'设置。

: set autoindent smartindent

要默认启用它,请添加

set autoindent smartindent

~/.vimrc

答案 3 :(得分:0)

我使用以下地图:

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

所以不使用{<CR>而是使用此映射。除此之外,我还使用romainl提到的插件,DelimitMate用于其他带括号的映射。

答案 4 :(得分:0)

我有同样的问题,delimitMate解决了它。安装后,您可以使用以下命令启用它:

let g:delimitMate_expand_cr = 1

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

您可以在此处查看:https://github.com/fatih/subvim