【问题标题】:Inserting a tab in Vim through a bind works only one time通过绑定在 Vim 中插入选项卡只能使用一次
【发布时间】:2018-05-01 19:27:48
【问题描述】:

我创建了一个插入模式绑定(打开大括号 + Enter),它在下一行输入一个制表符(4 个空格),之后输入一个右大括号。

inoremap {<Enter> {<Enter><Enter>}<Up><Tab>

例子:

fn foo() {
    // Some code
}

它工作正常,但是当我再次尝试使用绑定时,它不会再插入制表符,只是一个新行和一个括号。

fn bar() {
    if condition {
    loop {
    // Some more code
    }
    }
}

【问题讨论】:

  • 欢迎您!可能您想编辑并添加更清晰的问题?
  • 感谢您告诉我!希望这能让它更清楚。
  • 看起来每次都进入一个标签。一个标签。它只是没有为每个级别的范围添加一个额外的选项卡。通过最初跳过括号后的第一行,vim 假设该行是空白的,并且没有在该行上保留自动缩进制表符,因此当您返回到它并按 Tab 时,它会给您留下一个级别该行的缩进。

标签: vim config indentation key-bindings


【解决方案1】:

您不需要自己插入&lt;Tab&gt;

inoremap {<CR> {<CR>}<C-o>O

O 将在当前行上方打开一个新行,缩进的数量和类型正确。

【讨论】:

  • 提供了一些indent,比如设置了自动缩进
【解决方案2】:

这并不漂亮,但我认为这可能会实现您的目标:

inoremap {&lt;Enter&gt; {&lt;Enter&gt;&lt;Tab&gt;&lt;Enter&gt;}&lt;Esc&gt;&lt;&lt;&lt;Up&gt;A

编辑:我的解决方案之前有一个错字。如果最初不起作用,请重试

【讨论】:

  • 或使用&lt;c-o&gt; 例如inoremap {&lt;cr&gt; {&lt;cr&gt;}&lt;c-o&gt;O
  • 您在此处缺少替代选项中最重要的缩进
  • 好吧,事实证明我什至不需要自己缩进,并且评论中的解决方案有效。
【解决方案3】:

我个人建议改用缩写,这样你就不会有奇怪的延迟。

下面使用“rails.vim”类似RailsExpand函数。放入vimrc文件:

function! RailsExpand(root, good, ...)
  let c = nr2char(getchar(0))
  echom c
  if c == "" || c =~ (a:0 ? a:1 : "\t")
    return a:good
  else
    return a:root . c
  endif
endfunction

iabbrev { <c-r>=RailsExpand('{', "{\<lt>cr>}\<lt>c-o>O\<tab>", '\r')<cr>

就个人而言,我更喜欢扩展 &lt;tab&gt; 而不是 &lt;cr&gt;,以便您可以使用:

iabbrev { <c-r>=RailsExpand('{', "{\<lt>cr>}\<lt>c-o>O\<tab>")<cr>

【讨论】:

    猜你喜欢
    • 2016-02-24
    • 1970-01-01
    • 2016-01-18
    • 2013-03-21
    • 2017-08-29
    • 1970-01-01
    • 2013-10-07
    • 2020-02-15
    • 1970-01-01
    相关资源
    最近更新 更多