在Vim中,是否有一种简单的方法来切换Ruby中的“do/end”和“{}”?

7
有没有一种简单的方法在Vim中切换Ruby中的“do/end”和“{}”?(TextMate使用^{}实现此功能。)
3个回答

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()的定义在这里

PS:这绝对是一个SO问题,因为它结合了Ruby上下文和高级Vim脚本。


没必要使用复杂的解决方案,只需要使用matchit.vim就可以了。 :) - graywh
Matchit并不能解决OP的请求。(即使没有涉及vim,它仍然涉及开发工具的调整,用于开发目的) - Luc Hermitte

4

1

有一个splitjoin.vim插件可以很好地完成这个任务(使用gJ/gS映射来分割/合并)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接