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> 用于在调用我们的函数之前删除任何意外范围。

视觉模式映射是这样工作的:

  1. 我们用:help :k,
  2. 定义"previous mark"
  3. 我们执行搜索,
  4. 我们 运行 下面的普通模式命令 :help :normal,
  5. 我们用 :help i_ctrl-r:help "=:help visualmode()
  6. 检索以前的视觉模式
  7. 我们将视觉选择扩展到 "previous mark" 和 :help ''
  8. 的位置
  9. 最后我们用 :help v_o 将光标移动到视觉选择的另一端。

运算符挂起的映射只是重复使用视觉模式映射。