是否有可能在vim周围循环?

时间:2015-01-27 05:17:19

标签: vim

我开始使用[']'在文件中的标记之间跳转,如下所述:

http://vim.wikia.com/wiki/Using_marks

但是,当我到达文件中的最后一个标记时,这些命令不会回到顶部。

我在搜索导航标记时搜索“骑自行车”或“包裹”,但我看到的所有内容都提到了Ctrl-oCtrl-i,这很好,但没有回答我的问题。

使用这些快捷方式时,是否可以设置从上到下或从下到上的选项?

1 个答案:

答案 0 :(得分:2)

您可以创建一个功能来检查您是否已移动,如果没有,则转到文件的开头并再次呼叫]'。像这样:

nnoremap ]' :call CycleMarksForward()<cr>
function! CycleMarksForward()
  let currentPos = getpos(".")
  execute "normal! ]'"
  let newPos = getpos(".")   
  if newPos == currentPos
    execute "normal! gg]'"
  endif
endfunction

[` ]`['您需要做同样的事情,尽管可能有办法提出通用解决方案。


充实:

nnoremap <silent> ]' :call CycleMarks("]'")<cr>
nnoremap <silent> [' :call CycleMarks("['")<cr>
nnoremap <silent> ]` :call CycleMarks("]`")<cr>
nnoremap <silent> [` :call CycleMarks("[`")<cr>
function! CycleMarks(arg)
  let currentPos = getpos(".")
  execute "normal! " . a:arg
  let newPos = getpos(".")
  if newPos == currentPos
    if a:arg == "]'" || a:arg == "]`"
      execute "normal! gg0" . a:arg
    else
      execute "normal! G$" . a:arg
    endif
  endif
endfunction

注意:此解决方案不能很好地处理第一行和最后一行的标记,即向后循环时将跳过最后一行的标记,并且在向前循环时将跳过第一行的标记。