是否可以使vim标记记住当前窗口中线的相对位置?

时间:2017-07-18 09:28:29

标签: vim

我正在使用http://www.thegeekstuff.com/2008/12/vi-and-vim-autocommand-3-steps-to-add-custom-header-to-your-file/中建议的解决方案(修改后的版本)来自动创建和更新源代码的标头。

如上述页面所述,在 _ = IOSPublicDefaultAlert.init(viewController: self, alertTitle: "Warning!!!", alertMessage: alertMessage, actionTitleAndType: ["Ok" : .destructive, "Cancel" : .default], actionCompletion: { [unowned self] (title) in if title == "Ok"{ } }) 中调用write命令后,将执行以下命令序列:

  1. 标记设置在文件的当前位置。
  2. “上次修改”字段已更新。这会将光标移动到文件的开头(搜索和替换发生的位置)。
  3. 光标返回先前标记的位置。
  4. 这很好,但有一个令人讨厌的问题:假设我们正在编辑靠近窗口底部的一条线。如果在那时我们保存文件,因为光标移动(用于更新标题)我们正在编辑的行跳转,以便它位于窗口的中间。

    根据我的理解vim将光标移动到标记为'a的地方,并调整窗口内容,使当前行显示在窗口中间。我想知道是否有办法让“标记”记住窗口中标记线的确切相对位置,并在跳回标记时保持这个位置?

2 个答案:

答案 0 :(得分:2)

它位于文档中:Restoring the cursor position

lexer

(我用省略号跳过了不相关的部分)。

   :map <F2> msHmt…'tzt`s

打破恢复位置:

ms  store cursor position in the 's' mark
H   go to the first line in the window
mt  store this position in the 't' mark

答案 1 :(得分:1)

标记本身只存储位置本身;视图(当前窗口中显示的内容)不是其中的一部分。

您正在寻找的是winsaveview()winrestview()对功能。这些存储光标位置(如标记,但不会自动适应缓冲区中的更改;更新标题可能不需要的内容),以及窗口中当前显示的内容的详细信息。推荐使用这些标记;在自定义映射或命令中,它还具有不破坏标记的好处。

如果您使用:substitute更新标头,您还可以更改当前搜索模式(除非使用:function)和搜索历史记录。撤消所有这些很难;我知道,因为我自己写了这样一个插件(AutoAdapt plugin)。您可能希望查看其实现以获取更多提示(或者完全开始使用它)。 (该插件页面还包含各种替代插件的链接。)