代码之家  ›  专栏  ›  技术社区  ›  TK.

在Vim中的Ruby中,有什么简单的方法可以切换“do/end”和“”吗?

  •  7
  • TK.  · 技术社区  · 15 年前

    在Vim中的Ruby中,有什么简单的方法可以切换“do/end”和“”吗?

    (textmate用 ^{ )

    3 回复  |  直到 11 年前
        1
  •  6
  •   Luc Hermitte    15 年前

    您必须使用searchPair(),或者使用(只要安装了matchint,并且在begin/end上),然后标记两个位置,测试它是文本还是括号,最后更新这两行。

    nnoremap <buffer> <c-x>{ :call <sid>ToggleBeginOrBracket()<cr>
    
    let s:k_be = [ 'begin', 'end' ]
    function! s:ToggleBeginOrBracket()
      let c = lh#position#char_at_mark('.')
      if c =~ '[{}]'
        " don't use matchit for {,}
        exe 'normal! %s'.s:k_be[1-(c=='}')]."\<esc>``s".s:k_be[(c=='}')]."\<esc>"
      else
        let w = expand('<cword>')
        if w == 'begin'
          " use mathit
          normal %
          exe "normal! ciw}\<esc>``ciw{\<esc>"
        elseif w == 'end'
          " use mathit
          normal %
          exe "normal! ciw{\<esc>``ciw}\<esc>"
        else
          throw 'Cannot toggle block: cursor is not on {, }, begin, nor end'
        endif
      endif
    endfunction
    

    在哪里? lh#position#char_at_mark() 定义 here .

    PS:这是一个非常重要的问题,因为它结合了Ruby上下文和高级VIM脚本。

        2
  •  4
  •   kizzx2    13 年前

    查看此新插件: https://github.com/jgdavey/vim-blockle .

    30焦垫

        3
  •  0
  •   Paweł Gościcki Ywain    11 年前

    有一个 splitjoin.vim 这样做很好的插件(用于拆分/连接的gj/gs映射)。