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

时间:2010-06-16 19:53:14

标签: vim textmate ruby macvim

有没有简单的方法可以在Vim中的ruby中切换“do / end”和“{}”?

(TextMate使用^{执行此操作。)

3 个答案:

答案 0 :(得分:6)

你必须要么使用searchpair(),要么使用%(只要安装了matchit,并且你在开始/结束时),然后标记这两个位置,测试它是文本还是括号,最后更新两行。

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:这绝对是一个SO问题,因为它结合了ruby上下文和高级vim脚本。

答案 1 :(得分:4)

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

30个字符垫

答案 2 :(得分:0)

有一个splitjoin.vim插件可以很好地完成这项工作(用于拆分/加入的gJ / gS映射)。