Vim:重映射键移动到下一个非空行(反之亦然)
Vim: Remap key to move to the next non-blank line (and vice versa)
我正在寻找一种方法来重新映射一个键以将光标向下移动到下一行,跳过任何只包含 \n
的行,以及一种只在下一行执行相同操作的方法线.
基本上,我想做与 { 和 } 动作相反的事情。
我不确定你想映射这两个,所以我只使用 {
和 }
。这个怎么样?
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{
)并在可视模式下工作。
以下是与 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()
、 检索以前的视觉模式
- 我们将视觉选择扩展到 "previous mark" 和
:help ''
、 的位置
- 最后我们用
:help v_o
将光标移动到视觉选择的另一端。
运算符挂起的映射只是重复使用视觉模式映射。
我正在寻找一种方法来重新映射一个键以将光标向下移动到下一行,跳过任何只包含 \n
的行,以及一种只在下一行执行相同操作的方法线.
基本上,我想做与 { 和 } 动作相反的事情。
我不确定你想映射这两个,所以我只使用 {
和 }
。这个怎么样?
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{
)并在可视模式下工作。
以下是与 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()
、 检索以前的视觉模式
- 我们将视觉选择扩展到 "previous mark" 和
:help ''
、 的位置
- 最后我们用
:help v_o
将光标移动到视觉选择的另一端。
运算符挂起的映射只是重复使用视觉模式映射。