这篇文章正是我想要的: 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(