我正在寻找一种将按键重新映射为将光标向下移动到下一行的方法,跳过仅包含\n
的行,并且有一种方法可以做相同的操作,只是将光标向上移至下一行。
本质上,我想要做的是与 { 和 } 动作相反的操作。
以下是与hlsearch
兼容的替代DJ映射的方法:
跳转到下一行(非空行)
nnoremap <key> :<C-u>call search('^.\+')<CR>
跳转到上一个非空行
nnoremap <otherkey> :<C-u>call search('^.\+', 'b')<CR>
将视觉选择扩展到下一行的非空内容
xnoremap <key> :<C-u>k`\|call search('^.\+')\|normal! <C-r>=visualmode()<CR>``o<CR>
扩展视觉选择到前一个非空行
xnoremap <otherkey> :<C-u>k`\|call search('^.\+', 'b')\|normal! <C-r>=visualmode()<CR>``o<CR>
操作到下一行非空行
omap <key> :<C-u>normal! v<key><CR>
操作到前一个非空行
omap <otherkey> :<C-u>normal! v<otherkey><CR>
解释...
启用hlsearch
后,/anything
会突出显示每一个匹配项。由于我们并没有积极搜索非空行而只是简单地移动到它们,结果高亮显示无意义且令人噪音过多。
通过使用:help search()
,我们可以绕开hlsearch
,从而使映射效果大大降低噪音。
在调用我们的函数之前,使用<C-u>
来清除任何意外范围。
视觉模式映射的工作流程如下:
:help :k
定义"previous mark",:help :normal
运行以下正常模式命令,:help i_ctrl-r
、:help "=
和:help visualmode()
检索以前的视觉模式,:help ''
扩展视觉选择到"previous mark"的位置,:help v_o
将光标移动到视觉选择的另一端。操作挂起映射只是复用了视觉模式映射。
我不确定你想把这两个映射成什么,所以我会使用{
和}
。您觉得这样怎么样?
nnoremap } /^\S<cr>
nnoremap { ?^\S<cr>
/ " Search forward
^ " For the start of a line
\S " Followed by a non-whitespace character
<cr> " Enter
?
映射与正向搜索相同,只不过是向后搜索。
当然,为了完整起见,您需要添加:
nnoremap } /^\S<cr>
xnoremap } /^\S<cr>
onoremap } /^\S<cr>
nnoremap { ?^\S<cr>
xnoremap { ?^\S<cr>
onoremap { ?^\S<cr>
d{
)以及视觉模式下的参数。