【问题标题】:Get Vim to open new blocks like Sublime Text 2让 Vim 打开像 Sublime Text 2 这样的新块
【发布时间】:2012-11-21 09:45:34
【问题描述】:

在 sublime text 2 中:

BLOCK { <Return>

它生成(管道是光标):

BLOCK {
  |
}

我怎样才能让 Vim 以这种方式工作?

我打开了autoindent,关闭了smartindent,因为使用smartindent,它会在返回时执行此操作:

BLOCK {
 |}

为了更清楚,我专门寻找 2 个返回,向上移动一行,然后进入(具体为 2 个软标签)。我已经让它自动匹配字符,如{([ 等。

【问题讨论】:

  • imap {<cr> {<cr>}<c-o>O;根据您的插件,您可能需要使用inoremap
  • @Kevin 所做的只是等待一秒钟,然后在{ 之后放置一个}。至少在一个空白文件、没有扩展名和一个 .js 文件中对我来说没有新行或任何东西
  • 你在{之后点击了Enter吗?多年来,它对我来说非常有效。
  • @Kevin 哦,我期待它自动完成。谢谢!这可能是它!我在 O 之后添加了两个空格,它似乎完全按照我的意愿工作。您能否将此作为答案,以便我可以将其标记并使其成为“正确”答案,除非有人有更好的答案,但这似乎是完美的。

标签: vim sublimetext2


【解决方案1】:

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

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

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

【讨论】:

  • OP 可能没有理由更喜欢 imap 而不是 inoremap 所以应该选择 inoremap,除非有充分的理由不这样做。
【解决方案2】:

以前是 TextMate,现在是 ST2。

你面前基本上有两条路。

  • “愚蠢”的道路

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

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

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

  • “智能”方法

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

【讨论】:

    【解决方案3】:

    我对 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 是特定于缓冲区的,因此该映射仅适用于您在运行它时所在的缓冲区。要将其应用于所有缓冲区,请删除 &lt;buffer&gt;

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

    要让缩进按您想要的方式工作,请打开“自动缩进”和'smartindent' 设置。

    : set autoindent smartindent
    

    要默认开启,请添加

    set autoindent smartindent
    

    ~/.vimrc

    【讨论】:

    • 智能缩进不这样做。它实际上使情况变得更糟。它会创建如下块:糟糕,让我编辑我的 OP。
    • 好吧,我让它用不同的选项自动创建匹配的{。问题是创建 两个 返回并将光标放在带有选项卡/软选项卡的块之间。
    • 谢谢,但我不需要插入自动匹配字符。我的 Vim 设置已经这样做了。我正在专门寻找自动返回和标签。
    • 很奇怪...在 JS 文件中它不起作用。在我的 vimrc 文件中,这是可行的。 noremap { {&lt;return&gt;&lt;return&gt;}&lt;up&gt;&lt;tab&gt;。我也试过imap
    • 在其他文件中使用它会发生什么?
    【解决方案4】:

    我使用以下地图:

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

    所以我没有使用{&lt;CR&gt;,而是使用这个映射。除此之外,我还使用了 romainl 提到的插件,DelimitMate 用于其他带大括号的映射。

    【讨论】:

      【解决方案5】:

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

      let g:delimitMate_expand_cr = 1
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-18
        • 1970-01-01
        • 2012-03-21
        • 2018-09-02
        • 2013-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多