在vim
中编辑C文件时,请考虑一个场景。 &安培;你使用了空间的混合& 突片秒。 &安培;你需要将它们全部转换为 spaces 。
有一个名为expand
的实用程序,可以智能地执行此任务。它比s/\t/<4 spaces>/g
更受欢迎。我们可以使用:%!expand -t4
在vim中使用此命令。通常,我为此映射一个功能键,例如 F11 。
同样,我们可以在vim中使用任何其他命令。
问题是当你在整个缓冲区上运行任何这样的操作时,光标位置会改变&amp;可能会有点恼人。
因此,问题是,如何在不改变光标位置的情况下对整个缓冲区执行操作?
答案 0 :(得分:1)
可以使用最新跳转标记恢复光标位置:
``
如果您还想维护确切的窗口视图,请使用winsaveview()
/ winrestview()
。
anwolib - Yet another vim library有一个方便的:KeepView
命令:
:KeepView %!expand -t4
答案 1 :(得分:0)
对于这种情况,我们可以使用标记(例如mA
)。映射将是:
:nmap <F11> mZ:%!expand -t4<CR>`Z
然而,仍有一个问题。在整个缓冲区上操作时,屏幕滚动位置可能会改变 这可以通过使用如下两个标记来处理:
:nmap <F11> mZHmY:%!expand -t4<CR>'Yzt`Z
说明:
现在,当您按下映射的键 F11 时,过滤器将在缓冲区&amp;光标保持在适当的位置。
答案 2 :(得分:0)
你可以:
:your expand cmd|norm! ``
如果您愿意,可以将其映射到<F11>
。但最好使用nnoremap
我刚看到你在问题中提到过:
同样,我们可以在vim中使用任何其他命令
如果你想这样做,可靠的解决方案是将“任何其他命令”包装在一个函数中,在主逻辑之前/之后,保存/恢复光标位置。因为“任何其他命令”可以更改(后退标记)标记,甚至是您定义的标记。