移动到块代码的中间

时间:2013-03-28 12:54:21

标签: c++ vim vi

使用Vim我试图将光标移动到代码块的中间,但我无法弄清楚如何执行此操作:

//cursor is for instance here.

{
    //or here

    //some code
    // .... **** move cursor here ****
    //some more code 

}

最后的想法是有一个保存当前位置的快捷方式,将光标移动到代码块的中间,将当前行设置到屏幕中间(使用快捷键“zz”),然后移动回到保存的位置。

我更喜欢内置的vim功能,但插件也可以。

编辑:这是针对c ++的,所以我希望它用于方括号{}。

3 个答案:

答案 0 :(得分:4)

我给了它一个(快速和肮脏)去:

function! Middleize()

  " use ]M to jump to either the end of the current method if we are in it
  " or the start of the next method if we are above the method
  normal! ]M

  " we record the current line number
  let first_line = line('.')

  " we go to the other end of the method
  normal! %

  " we record the current line number
  let second_line = line('.')

  " we started either from the top or from the bottom of the method
  " so we have to take that into account when calculating the number
  " of the line we want to jump to
  if first_line < second_line
    let middle_line = first_line + ((second_line - first_line) / 2)
  else
    let middle_line = ((first_line - second_line) / 2) + second_line
  endif

  " let's go!
  execute "normal! " . middle_line . "Gzz"
endfunction

nnoremap <F5> :call Middleize()<CR>

答案 1 :(得分:1)

更多通用解决方案但可能有用 - easy-motion插件允许您以极高的精度跳过整个地方。

例如:

initial state

<Leader><Leader>w(默认) - “word motion

word motion enabled

g

cursor in the middle

然后跳回来,你只是向后做同样的事情(在这种情况下,<Leader><Leader>b g

这不会将当前行设置为屏幕中间,但您可以:set scrolloff=9999让屏幕中间跟随光标。

答案 2 :(得分:0)

这不会给你你想要的东西,但它会在屏幕上显示该功能的文本(假设它不会太长)。

  1. m a - 在当前光标位置设置标记。
  2. 反复按} (向前跳一段)直到可以看到所需的代码。
  3. ` a - 返回您设定的标记。
  4. vim术语中的“段落”是一组连续的非空行。这是代码块的一个很好的近似值。另请注意,您可以使用任何字母作为mark命令,因此最多可以同时激活其中52个。