在不改变光标位置的情况下对整个缓冲区执行操作

时间:2013-11-13 11:11:35

标签: vim

vim中编辑C文件时,请考虑一个场景。 &安培;你使用了空间的混合& 突片秒。 &安培;你需要将它们全部转换为 spaces

有一个名为expand的实用程序,可以智能地执行此任务。它比s/\t/<4 spaces>/g更受欢迎。我们可以使用:%!expand -t4在vim中使用此命令。通常,我为此映射一个功能键,例如 F11

同样,我们可以在vim中使用任何其他命令。

问题是当你在整个缓冲区上运行任何这样的操作时,光标位置会改变&amp;可能会有点恼人。

因此,问题是,如何在不改变光标位置的情况下对整个缓冲区执行操作?

3 个答案:

答案 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

说明:

  1. 标记当前位置。 ( MZ
  2. 转到屏幕顶部。 (ħ
  3. 标记此行。 (
  4. 运行过滤器。 (:%!expand -t4
  5. 转到第Y行('Y
  6. 将其置于屏幕顶部。 ( ZT
  7. 去你的标记。 (
  8. 现在,当您按下映射的键 F11 时,过滤器将在缓冲区&amp;光标保持在适当的位置。

答案 2 :(得分:0)

你可以:

:your expand cmd|norm! ``

如果您愿意,可以将其映射到<F11>。但最好使用nnoremap

我刚看到你在问题中提到过:

  

同样,我们可以在vim中使用任何其他命令

如果你想这样做,可靠的解决方案是将“任何其他命令”包装在一个函数中,在主逻辑之前/之后,保存/恢复光标位置。因为“任何其他命令”可以更改(后退标记)标记,甚至是您定义的标记。