【问题标题】:Automatically applying change commands in multiple windows in Vim在 Vim 的多个窗口中自动应用更改命令
【发布时间】:2025-12-06 08:10:01
【问题描述】:

Vim 能否自动对所有打开的窗口应用更改/插入命令,例如 ddOu?我正在一个窗口中编写 LaTeX 文档,并希望使用第二个窗口来保存我的边注、TODO 等(类似于Cornell notes)。我的 Vim 标签看起来像

|1 \documentclass{article}       |1 
|2 \begin{document}              |2 
|3 Lorem ipsum dolor sit amet,   |3 TODO: reword this.
|  …consectetur adipisicing elit.|  
|4 Ut enim ad minim veniam, quis |4 Could use some more examples.
|  …nostrud exercitation ullamco.|  
|5                               |5 Put bibliography here.
|6 \end{document}                |6 

我需要保持wrap(最好是showbreak)切换,因为我的句子通常很长。

到目前为止,我已成功使用scrollbindcursorbind 并行导航这两个文件。但是,当我在一个文件中插入或删除行时,对齐会中断。例如,我可能会在左侧窗口中插入一行(使用o)来加载一个包,从而产生

|1 \documentclass{article}       |1 
|2 \usepackage{hyperref}         |2 
|3 \begin{document}              |3 TODO: reword this. 
|4 Lorem ipsum dolor sit amet,   |4 Could use some more examples.
|  …consectetur adipisicing elit.|  
|5 Ut enim ad minim veniam, quis |5 Put bibliography here.
|  …nostrud exercitation ullamco.|  
|6                               |6
|7 \end{document}                |~ 

现在右侧窗口中的所有 cmets 都在错误的行上。如果我在左侧窗口中的编辑还在右侧窗口的第 1 行之后插入了新行,则对齐将被保留。我使用windo 命令取得了一些成功(例如windo normal dd 删除两个文件中的一行);我应该将dd 映射到window normal dd 并且对于我可能使用的每个命令都应该类似地映射吗?对于像o 这样让您处于插入模式的命令,这将如何工作?

为了使问题复杂化,理想情况下,我希望 any 操作创建或删除要在两个文件中复制的换行符。例如,插入模式下的回车应该被捕获并在另一个窗口中重复。

有没有更好的方法(我会坚持使用 Vim,但有兴趣了解其他具有此功能的编辑器),还是应该将我的 cmets 保留在文档文件中?

【问题讨论】:

  • 不是答案,但这不是% cmets 的用途吗?只需将右侧的行直接放在它们所属的文档中即可。如果需要,您仍然可以轻松地将它们剥离,:g/^\s*%/d

标签: vim


【解决方案1】:

很好,我从未听说过Cornell notes,但我怀疑是否有可能以您想要的方式同步两个缓冲区而不会出现任何问题(不过我很想被证明是错误的)

但是,如果我们退后一步,而不是尝试同步两个缓冲区,而是尝试通过在第 120 列创建一个装订线来仅使用一个缓冲区,那会怎样?

工作流程

  • 创建一个新文档
  • :set virtualedit=all
  • 在正常模式下,输入 80@='120|i|^M^[' 以在位置 120 处创建一个 80 行的装订线。
  • 编写文档和注释
  • 保存文档

^M 输入为 ctrl-venter
^[ 输入为 ctrl-v esc

优势

  • 简化了文档和注释的导航和删除。毕竟,您只是在一个缓冲区中工作。
  • 您只需打开一个文件即可获得文档和注释。
  • 如果您花费大部分时间浏览和更改现有文档,这可能是一个可行的解决方案。

缺点

  • 写笔记会更复杂,因为你必须经常使用R (replace) 而不是i (insert) 以免弄乱填补我们创建的排水沟。
  • 调整两个缓冲区的大小比“调整”固定间距更容易。
  • 如果您将大部分时间都花在创建新文档上,那会很痛苦。

【讨论】:

    【解决方案2】:

    在 Vim 中,您将无法实现 100% 完整且一致的完美系统。

    虽然dd 之类的命令可以直接应用于其他缓冲区,但插入模式已经要求您等待文本输入的结尾。像u 这样的命令根本不能直接应用;您需要注意发生了什么变化,并将其应用于另一个缓冲区。对于大多数 Ex 命令,如 :global:substitute,也是如此。

    我宁愿在CursorHold,InsertLeave之类的事件上定义:autocmds,而不是重新映射大多数命令,它将总行数与先前存储的值进行比较,然后在当前行调整另一个缓冲区因此。如果您愿意接受某些编辑将通过该方案,并且您要么避免这些编辑,要么手动更正它们,这可能是一个可行的解决方案。

    【讨论】: