如何使用标记跳到我最近打开但未更改的文件中的位置?


11

通常,我编辑文件-认为我的工作已经完成-然后关闭文件并继续进行下一步。但是后来我意识到我需要回到该代码并对其进行更多调整。
如果再次打开文件,则可以使用.标记并使用跳到上一次编辑的位置'.
现在,我正在尝试找到一种方法,使用vim的标记跳转到我最近访问但未更改的文件中的位置。
我知道我可以手动设置标记,但是在大多数情况下,我不希望再回来,因此我不设置标记,而需要使用vim自动生成的标记。
"标记看起来这可能是一种方式来实现这一目标,从:h motion

" 最后一次退出当前缓冲区时的光标位置。默认为第一行的第一个字符。参见| last-position-jump | 有关如何对每个打开的文件使用此功能。每个缓冲区只记住一个位置,而不是每个窗口记住一个位置。只要缓冲区在窗口中可见,位置就不会改变。{Vi无此功能}。

但是如果我

  • 关闭所有显示缓冲区的窗口(但该缓冲区仍存在于缓冲区列表中)。要么:
  • 杀死缓冲区的所有实例

标记似乎没有更新,如何使用标记跳转到缓冲区/文件中最后一个光标位置的位置?


2
我认为你正在寻找Ctrl+oCtrl+i... :h jump-motions更多信息
森迪普•

@spasic多数民众赞成在一个不错的建议,但是一旦您进行了几十次跳跃,该位置就会在庞大的跳跃列表中丢失。通过将标记范围划分为缓冲区,您可以管理更小的标记/位置列表
the_velour_fog 2016年

如果您还没有阅读它,我认为此技巧将很有趣。也许你得调整你viminfo
statox

@statox谢谢。我看到了,vim帮助中的提示。我认为这些解决方案会"在您打开文件时自动跳到标记处。我真的只想手动跳到最后一个光标位置。另外,我只是无法理解"标记的设置和更新时间,因此对我来说该"标记不可用。
the_velour_fog

Answers:


6

这是一个经典的解决方案:使用

`H

跳到最后一个HTML文件,依此类推...

augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END

2
谢谢,这似乎真的很有用。我已经将其加载到我的vimrc中进行尝试。我已经更改为autocmd,WinLeave因为我发现BufLeave关闭拆分时似乎没有触发,并且缓冲区在其他位置仍处于打开状态。我知道这有点WinLeave
极端

3

我写了这个vimscript声明,似乎很奏效

autocmd BufLeave * :normal ml

说明

  • BufLeave 自动命令:这似乎在您触发
    • 移到另一个窗口
    • 当您关闭最后一个显示缓冲区的窗口时
    • 当您关闭缓冲区本身 bd
  • :normal-默认情况下,commandautocmd 的一部分似乎是一个ex命令。所以要告诉vim运行普通模式命令,您需要添加:normal
  • ml-设置标记l(助记符:last

用法

从上一次您在缓冲区中起就可以回忆起光标位置

'l

要么

`l

0

如果您希望光标恢复viminfo已知的最后一个位置,则可以使用

autocmd BufReadPost * call setpos(".", getpos("'\""))

romainl的答案对我特别有用,而且我已经使用了很多(因为我是网络开发人员):

augroup VIMRC
    autocmd!
    autocmd BufLeave,WinLeave *.html normal! mH
    autocmd BufLeave,WinLeave *.css normal! mC
    autocmd BufLeave,WinLeave *.js normal! mJ
augroup end

nnoremap <space>h `Hzz
nnoremap <space>c `Czz
nnoremap <space>j `Jzz

最后可能有用的是选项:help 'nostartofline

               *'startofline'* *'sol'* *'nostartofline'* *'nosol'*
'startofline' 'sol' boolean (default on)
            global
            {not in Vi}
    When "on" the commands listed below move the cursor to the first
    non-blank of the line.  When off the cursor is kept in the same column
    (if possible).  This applies to the commands: CTRL-D, CTRL-U, CTRL-B,
    CTRL-F, "G", "H", "M", "L", gg, and to the commands "d", "<<" and ">>"
    with a linewise operator, with "%" with a count and to buffer changing
    commands (CTRL-^, :bnext, :bNext, etc.).  Also for an Ex command that
    only has a line number, e.g., ":25" or ":+".
    In case of buffer changing commands the cursor is placed at the column
    where it was the last time the buffer was edited.
    NOTE: This option is set when 'compatible' is set.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.