我希望只需按<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
,这意味着我可以在一行的文本长度之后移动光标。
答案 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
设置匹配的开头,.*
表示之前的所有字符,尽可能多。