【问题标题】:Vim smart insert semicolonVim 智能插入分号
【发布时间】:2011-11-03 11:42:21
【问题描述】:

是否有像 Eclipse 中那样可以处理智能分号插入的 Vim 插件?

示例(管道字符是插入光标):

foobar(|)

我输入一个分号:

foobar();|

同样:

foobar("blah|")

我输入一个分号:

foobar("blah");|

如果我想在原始光标位置使用分号,我在智能重新定位后按退格键:

foobar("hello|")
foobar("hello");|
foobar("hello;|")

【问题讨论】:

  • 如果你想在你的字符串文字中真正有一个分号怎么办?
  • 在 Eclipse 中,在智能分号插入后按退格键会将分号放在原始光标位置。
  • 理想的解决方案:使用 Python。那你就不用担心分号了 ;-)
  • @ChrisMorgan 对于我可怜的大脑来说,在 Python 和 Java/C++/JavaScript 之间切换有点像在 Mac 和 Windows 之间切换。我可以用同样的方式做基本相同的事情,但有足够的差异让我偏头痛。

标签: vim


【解决方案1】:

我使用这个映射:

inoremap <leader>; <C-o>A;

不是;,因为我经常在不止一种情况下使用分号。

  • &lt;C-o&gt; 用于输入单个普通模式命令。
  • A; 表示“在行尾添加;”。

【讨论】:

  • @dansomething:哦,是的!从那个答案开始,我在~/.vimrc 中多次修改了该行。这是当前的化身: inoremap ; m`A;``
  • 有了你的映射,vim 等待每一个 按键的第二个字符。
  • @Koshimitsu 这是标准行为,只有在您自己暂停时才会注意到。
  • @TARDISMaker,我没有那个映射了。你说的是我评论里的那个吗? &lt;C-o&gt; 为单个命令离开插入模式。 m` 创建上下文标记。 &lt;C-o&gt; 再次。 A; 在行尾附加一个分号。 &lt;C-o&gt; 再次。最后 `` 跳回我们之前设置的标记。
  • 坦率地说,我宁愿使用不会触发插入模式的东西,比如功能键(我永远不会记得)或 ctrl 快捷键
【解决方案2】:

我想做同样的事情,我整晚都在工作,大量的代码,但最后,我得到了一个简单的解决方案。

inoremap ;<cr> <end>;<cr>

如果我在大括号中,我想在末尾添加一个分号或一个点,像这样

foo({
  |
})

我按;;&lt;cr&gt;..&lt;cr&gt; 来执行此操作

inoremap ;<cr> <end>;<cr>
inoremap .<cr> <end>.
inoremap ;;<cr> <down><end>;<cr>
inoremap ..<cr> <down><end>.

【讨论】:

    【解决方案3】:

    你应该试试Cosco.vim插件。

    【讨论】:

    • 谢谢你!这真是救命啊!
    【解决方案4】:

    我使用以下函数和映射在行尾插入分号并删除剩余空格:

    imap <leader>. <C-R>=Semicolonfun()<CR>
    fun! Semicolonfun() "{{{
      call setline(line('.'), substitute(getline('.'), '\s*$', ';', ''))
      return "\<End>"
    endfunction "}}}
    

    所以如果你有类似的东西:

    log.warning("you miss the |identifier")
    

    按下 。要么 ,。如果你重新映射领导者,你会得到以下结果:

    log.warning("you miss the identifier");|
    

    【讨论】:

      【解决方案5】:

      对于 vscode vim 用户:

      "vim.insertModeKeyBindings": [
            {
              "before": [";", ";"],
              "after": ["<Esc>","A",";"]
            },
          ],
      

      我受到romainl's answer above 的启发,但&lt;C-o&gt; 似乎在vocode vim 中存在切换问题,所以只需使用&lt;Esc&gt; 即可。

      【讨论】:

        【解决方案6】:
        inoremap <expr> ;<cr> getline('.')[-1:] == ';' ? '\<Nop>' : '<End>;<CR>'
        

        上面的代码会检查行尾是否有;

        如果;不存在,则添加;,否则什么也不做。

        【讨论】:

          【解决方案7】:
          " ftplugin/c/c_snippet.vim
          inoremap <expr> <buffer> ; getline('.')[col('.')-1:-1]=~')$' ? '<right>;' : ';'
          

          如果您的 sn-ps 引擎将其扩展为该版本,for 不会出现问题

          for (...|) {
             <+code+>
          }<++>
          

          如果左括号在换行符上,它会搞砸。

          您可以轻松地将正则表达式更改为'"\=)\+$' 来回答您最初的问题。

          inoremap <expr> <buffer> ; getline('.')[col('.')-1:-1]=~'"\=)\+$' ? '<end>;' : ';'
          

          但是,我认为这不是一个好主意。在这种情况下,&lt;bs&gt; 的映射将是:

          inoremap <expr> <buffer> <bs> getline('.')[:col('.')-2] =~ '.*")\+;$' ? '<bs><c-o>F";' : '<bs>'
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-25
            • 1970-01-01
            • 1970-01-01
            • 2015-08-12
            • 2011-03-04
            相关资源
            最近更新 更多