【问题标题】:Is it possible to make vim marks remember the relative position of the line in the current window?是否可以让vim标记记住当前窗口中行的相对位置?
【发布时间】:2017-07-18 09:28:28
【问题描述】:

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

如上页所述,在vim 中调用write 命令时,将执行以下命令序列:

  1. 在文件的当前位置设置了一个标记。
  2. “上次修改”字段已更新。这会将光标移动到文件的开头(进行搜索和替换的地方)。
  3. 光标返回到之前标记的位置。

这很好,但有一个有点烦人的问题:假设我们正在编辑靠近窗口底部的一行。如果此时我们保存文件,由于光标移动(用于更新标题),我们正在编辑的行会​​跳转,使其位于窗口中间。

据我所知'a 将光标移动到标记a 标记的位置,并调整窗口内容,使当前行出现在窗口中间。我想知道是否有办法让“标记”也记住窗口中标记线的确切相对位置,并在跳回标记时保持该位置?

【问题讨论】:

    标签: vim


    【解决方案1】:

    在文档中:Restoring the cursor position

       :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
    

    分手恢复位置:

    't  go to the line previously at the top of the window
    zt  scroll to move this line to the top of the window
    `s  jump to the original position of the cursor
    

    【讨论】:

    • 非常感谢!很有帮助!
    【解决方案2】:

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

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


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

    【讨论】:

      猜你喜欢
      • 2010-10-10
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多