Vim:重新映射键以移动到下一行(非空白行)(反之亦然)

10

我正在寻找一种将按键重新映射为将光标向下移动到下一行的方法,跳过仅包含\n的行,并且有一种方法可以做相同的操作,只是将光标向上移至下一行。

本质上,我想要做的是与 { 和 } 动作相反的操作。

2个回答

10

以下是与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定义"previous mark",
    2. 我们执行搜索,
    3. 我们使用:help :normal运行以下正常模式命令,
    4. 我们使用:help i_ctrl-r:help "=:help visualmode()检索以前的视觉模式,
    5. 我们使用:help ''扩展视觉选择到"previous mark"的位置,
    6. 最后,我们使用:help v_o将光标移动到视觉选择的另一端。

    操作挂起映射只是复用了视觉模式映射。


    4

    我不确定你想把这两个映射成什么,所以我会使用{}。您觉得这样怎么样?

    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{)以及视觉模式下的参数。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接