Vim - 如何使自己的映射可重复?第 2 部分



这篇文章正是我想要的: Vim - 如何使自己的映射可重复?

尽管该帖子中的映射有效,但它似乎总是将我的光标左对齐到第 0 列。我希望它只是将光标留在原地。

这是映射(它应该只执行正常的df(但也删除相应的括号(:

nnoremap <silent> <Plug>Map_df( dt(me%x`ex=:silent! call repeat#set("<Plug>Map_df(", v:count)<CR>
nmap df( <Plug>Map_df(`e

如果行为不可创建,请告诉我。

我认为您需要从第一个映射的rhs中删除=,因为它会缩进当前行,并在此过程中移动光标。

以下是您目前点击df(时会发生什么:

  • dt(删除,直到下一个左括号
  • me在左括号上设置标记e
  • %将光标移动到右括号上
  • x删除右括号
  • `e将光标移回左括号
  • x删除左括号
  • =:silent! ...<cr>使映射可重复,并缩进当前行

在正常模式下,=是一个运算符,它通过外部程序或内部格式化函数(有关详细信息,请参阅:h =(过滤文本对象或运动覆盖的文本中的行,以设置它们的缩进级别。

在这里,:silent! ...<cr>=解释为动议。但是,它不会移动光标,因此=对当前行(:silent! ...<cr>之前的位置(和当前行(:silent! ...<cr>之后的位置(之间的行进行操作。

在您链接的问题中,=不是普通运算符,而是作为参数传递给r命令的字符。它用于替换视觉选择中的每个字符。


我认为您也不需要第二个映射rhs中的`e

nno <silent>  <plug>Map_df(  dt(me%x`ex:sil! call repeat#set("<plug>Map_df(", v:count)<cr>
nmap          df(            <plug>Map_df(

如果您不想破坏e标记,则可以改用'

nno <silent>  <plug>Map_df(  dt(m'%x``x:sil! call repeat#set("<plug>Map_df(", v:count)<cr>
nmap          df(            <plug>Map_df(

相关内容

最新更新