在 vim 中,如何将光标向下(或向上)移动到同一列中包含非空白字符的第一行?
例如,在以下文本中:
item1
item2
item3
item4
item5
item6
如果光标在e
in上item1
,则将光标移动到e
in item4
。
如果在m
in item3
,则移至m
in item5
。
仅供参考,我正在寻找一种快速有效的方法来浏览格式化的文本。
(PS:那些是空格而不是制表符。)
答案1
您可以使用以下映射来执行此操作。(可能有一些我没有想到的极端情况)
nnoremap <leader>d m':exec '/\%' . col(".") . 'c\S'<CR>``n
nnoremap <leader>u m':exec '?\%' . col(".") . 'c\S'<CR>``n
重要的部分是:exec '/\%' . col(".") . 'c'
这与当前列匹配。这直接取自:h %c
。然后我添加了一个\S
以匹配非空格。m'
和``
用于存储当前位置并在执行语句周围恢复它。这是必要的,因为使用执行将我们置于行的开头,这可能会导致不稳定的行为(在某些情况下跳过太多行)。执行此操作后,我转到第一个匹配项。向上和向下版本之间的唯一区别是我们搜索向下和向上的n
方向。/
?
如果您想使用虚拟列(即选项卡)来执行此操作,请替换\%c
为\%v
。
答案2
我的JumpToVerticalOccurrence 插件提供]|
并[|
映射即可提供支持[count]
,且不会破坏当前的搜索模式。
答案3
如果您希望对具有定义缩进系统的代码或配置文件进行此操作(假设属于“格式化文本”), jeetsukumaran/vim-indentwise适用于跨缩进块的相对、绝对或块范围移动。