在Vim中的多个窗口中自动应用更改命令

时间:2013-12-11 18:52:13

标签: vim

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}                |~ 

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

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

是否有更好的方法可以做到这一点(我会坚持使用Vim,但有兴趣听听其他具有此功能的编辑器),还是应该将我的评论保留在文档文件中?

2 个答案:

答案 0 :(得分:3)

很好,我从来没有听说过Cornell notes,但我怀疑是否可以按照你想要的方式同步两个缓冲区,而不需要任何关键(我很乐意被证明是错误的)

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

<强>工作流

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

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

<强>优点

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

<强>缺点

  • 写笔记会更复杂,因为你必须经常使用R (替换)而不是i (插入)不要弄乱我们创造的阴沟。
  • 调整两个缓冲区的大小比“调整固定装订线”更容易。
  • 如果你花费大部分时间创建新文档,那么,这将是痛苦的。

答案 1 :(得分:2)

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

虽然dd之类的命令可以直接应用于其他缓冲区,但插入模式已经要求您等待文本条目的结束。像u这样的命令根本无法直接应用;您需要注意更改的内容,并将其应用于其他缓冲区。大多数Ex命令也是如此,例如:global:substitute

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