在带有缩进代码的非常长的文件中,将光标直接移到界定缩进的光标上方或下方的一行文本可能会有所帮助。

(一种方法可以通过缩进折叠方法,通过折叠当前的缩进级别,这会将限定缩进级别的行折叠到距离光标仅jk处,但是,我发现无法进行缩进折叠的情况我感兴趣的缩进。)

这里有一个示例,光标用下划线_标记(在class Bazzclass Qux的定义之间的第二个字符列处),但是想象一下module内的段落或行是未知或可变的:最后一行光标下方的o?请注意,垂直列包含空格,但在module Bar定义之间的第二列中也没有字符。

评论

相关内容:Vim技巧Wiki上的“移动到具有相同缩进的下一行/上一行”vim.wikia.com/wiki/Move_to_next/…

按g,然后按方向键可能会避免出现制表符并跨线移动

@alxndr链接中的解决方案效果很好,除非在空白空间维护不佳的情况下(例如,有些随机行仅包含空白空间),而您想忽略空白空间。如果有人担心这种情况,下面的superjer解决方案会更好。

#1 楼




function FloatUp()
    while line(".") > 1
                \ && (strlen(getline(".")) < col(".")
                \ || getline(".")[col(".") - 1] =~ '\s')
        norm k
    endwhile
endfunction


您可以nnoremap gU :call FloatUp()<CR>gU为“向上”),然后用gU调用。

这是一个说明:


只要norm k条件成立,代码就会反复向上移动光标(带有while)。
如果这不是第一行(while),则line(".") > 1条件成立)和

此行太短(可能为空);或
当前列(getline("."))上的当前行([col(".") - 1])字符为空白(=~ '\s';即,匹配空白模式)。




评论


这似乎完美(快速),并且很容易将其修改为FloatDown函数。进入我的.vimrc,谢谢! github.com/alxndr/dotfiles/commit/0e25a302

– alxndr
15年2月4日在17:54

刚刚发现,该解决方案在视觉模式下并不完全有效(取决于哪种视觉模式,行为会略有不同,它要么停留在同一位置,要么只移动一行)。关于发生了什么的任何指示?

– alxndr
2015年6月26日在2:30



#2 楼

我喜欢使用搜索来查找这些东西,因为在这种情况下,Vim的正则表达式有很多东西可以搜索,例如特定的虚拟列号:

nnoremap cd /\%<C-R>=virtcol(".")<CR>v\S<CR>

nnoremap cu ?\%<C-R>=virtcol(".")<CR>v\S<CR>

使用cd下降和cu上升。我想在这里“上下”。我几乎100%确信这些默认情况下为无操作。或选择您自己的映射。

无论您使用制表符还是空格或同时使用这两个选项,这都应该起作用。

评论


我在解析这些命令时遇到了麻烦。您介意扩展一下吗?

–davidlowryduda
2015年2月4日,0:18

/ 要么 ?向下或向上搜索,\%xv限制为搜索虚拟列号“ x”,在这种情况下,“ x”为“ = virtcol(“。”)”,它运行virtcol命令并插入光标位于表达式中的虚拟列号,\ S表示任何非空白字符。

–乍得
2015年2月4日,0:29



感谢您解释乍得。我只添加在插入模式或命令行模式下的会获取寄存器的内容。 =寄存器是表达式寄存器,用于评估就地表达式。非常方便,即使看起来也不奇怪。

–superjer
15年2月4日在1:01

这种方法的一个缺点是,如果您将搜索突出显示,则您会发现光标“垂直”列中的所有字符现在都在“列上”或“列下”之后被突出显示。

– alxndr
15年2月4日在17:47

如果要保护现有的搜索,可以在:let searchbak = @ / 之前加上:let @ / = searchbak 。但是在这一点上,它变得漫长而难以接近,也许应该只是一个功能。

–superjer
2015年2月5日,1:18

#3 楼

您可以使用JumpToVerticalOccurrence插件(默认映射到] |和[|)。几乎没有像] V {char}这样的东西,它像f一样工作,但是垂直。当然,您可以根据需要重新映射它们。


如果不想使用插件,可以尝试将:searchvirtcol(.)结合使用,例如:

:call search('\%' . virtcol('.') . 'v\S', 'bW')


其中:



virtcol('.')为您提供当前列,

\S表示非空白
/>
bW用于向后搜索

检查:help search以了解更多信息。

要使其易于使用,可以对其进行映射,例如:

:map <C-k> :call search('\%' . virtcol('.') . 'v\S', 'bW')<CR>
:map <C-j> :call search('\%' . virtcol('.') . 'v\S', 'W')<CR>



或者,如果您的代码包含方括号,请使用%在匹配它们之间跳转(例如{}[]等)或使用整个段落跳转({,},必要时使用Shift)。


链接/源:




移动到下一行在vim的同一列中有非空格字符?在stackoverflow


评论


来自:h search():w表示环绕文件末尾,W表示不环绕文件末尾。但是,为什么将它们放在第二个:map上呢?

–贾尔·洛佩斯(JairLópez)
16-4-19在10:53



@JairLopez正确,w不应该在那里,所以我将其删除了,谢谢。可能我对动作键的含义感到困惑。

– Kenorb
16年4月19日在11:03

#4 楼

我使用vim-indent-object插件的修改版来提供此行为。在这里可以看到我的修改。

这使我可以将[i映射到当前缩进级别的开始,而将]i映射到结束。

#5 楼

这不是您所要的,因为它不是垂直移动,但又类似,快速,并且可能足以让您向后移动2段:{{这会将您带到module Bar之前的那一行。

评论


想象一下,游标与其顶层模块行之间的行和/或段落的数量未知。 (特别是,这种情况是在最近我浏览第三方代码长数千行,具有精确的缩进但没有空行并尝试查找模块定义的外部上下文时出现的。)

– alxndr
15年2月3日在20:25

按段跳是我更喜欢的移动方式,但这不是一个选择:整个文件都是一个“段”。

– alxndr
15年2月3日在20:29

#6 楼

jeetsukumaran / vim-indentwise在跨缩进块的相对,绝对或块范围运动方面效果很好。

#7 楼

我为此使用了自己的插件move_until_char_changes.vim。

我将其映射到gKgJ

它将跳过当前列中具有相同字符的多行(不只是空格),这在日志文件或带有重复字符串的SQL转储中很有用。

默认情况下,它首先移动一行,然后再拾取“搜索”字符。

只要您不尝试使用它两次,并且您不在行或块的可视模式下,它就可以在可视模式下工作(欢迎修复!)

#8 楼

由于我在这里没有找到答案(编辑只是注意到superjer提到了非常相似的内容)。您可以简单地/或?搜索。

例如,您可以在第二栏中向下搜索非空格字符,如下所示:

/\%2v\S


细分为:

/    "search downward (use ? for upward movement)
\%2v "for the following char in the 2nd virtual column
\S   "any non white space character


然后您可以使用常规运算符重复搜索。

有关此主题的更多信息,请参阅:help \%c:help \%v