移至主页和结束键上的文本的开头和结尾

时间:2015-11-22 11:09:02

标签: vim

我希望只需按<home><end>即可移至行的非空白文本的开头和结尾。我已经开始使用<home>

" <home> goes to the beginning of the text on first press and to the
" beginning of the line on second press. It alternates afterwards.
nn <expr> <home> virtcol('.') - 1 <= indent('.') && col('.') > 1 ? '0' : '_'

但我无法启动并运行<end>

" <end> goes to the end of the text on first press and to the end of the line
" on second press.
nn <expr> <end> virtcol('.') < virtcol('$')-1 ? virtcol('$')-1 : winwidth(0)-1

<end>时光标不动。但是,如果我之后按:,则会显示文本:.,.+x,其中x是上述表达式的返回值。此命令在行之间移动,而不是像我想要的那样在列之间移动。

有谁可以告诉我在第二种情况下我做错了什么?作为一个注释,我必须说我已配置virtualedit=all,这意味着我可以在一行的文本长度之后移动光标。

2 个答案:

答案 0 :(得分:2)

问题是您的映射只返回当前行的最后一列的编号或窗口的宽度,但它实际上并不移动光标。

您可以使用$|将光标移动到该行:

:nn <expr> <end> virtcol('.') == virtcol('$')-1 ? winwidth(0)-1.'\|' : '$' 

答案 1 :(得分:1)

要在第一次按下时转到非空白文本的末尾,您可以尝试g_:help g_)。

" <end> goes to the end of the non-whitespace text on first press 
" and to the end of the line on second press.
:nn <expr> <end> virtcol('.') == searchpos('.*\zs\S','n')[1] ? winwidth(0)-1.'\|' : 'g_'

要查找包含最后一个非空白文本的地方,您可以使用

  • searchpos() function(返回列表中包含匹配的行和列位置 - 因此您需要追加
  • [1]只获取列的编号 - 列表的第二个元素。
  • \S表示非空格字符,
  • \zs设置匹配的开头,
  • .*表示之前的所有字符,尽可能多。