Как я могу использовать метки для перехода к местоположениям в файлах, которые я недавно открыл, но не изменил?

11

Часто я редактирую файл - думаю, что моя работа выполнена - затем закрываю файл и перехожу к следующему. Но потом я понимаю, что мне нужно вернуться к этому коду и немного подправить его.
Если открыть файл снова, я могу использовать .знак и перейти к позиции последнего редактирования с '..
Сейчас я пытаюсь найти способ использовать метки vim для перехода к местоположениям в файлах, которые я недавно посетил, но не изменил.
Я знаю, что могу установить метку вручную, но в большинстве случаев я не ожидаю возвращения, и поэтому я не устанавливаю метку и мне нужно использовать метку, которую vim генерирует автоматически. Знак кажется , что это может быть способом для достижения этой цели, с .
":h motion

" На позицию курсора при последнем выходе из текущего буфера. По умолчанию используется первый символ первой строки. Смотрите | last-position-jump | как использовать это для каждого открытого файла. Для каждого буфера запоминается только одна позиция, а не для каждого окна. Пока буфер виден в окне положение не будет изменено. {не в Vi}.

Однако, если я

  • закройте все окна, показывающие буфер (но буфер все еще присутствует в списке буферов). или же:
  • убить все экземпляры буфера

метка, похоже, не обновляется, как я могу использовать метку для перехода к позиции последней позиции курсора в буфере / файле?

the_velour_fog
источник
2
Я думаю, что вы ищете Ctrl+oи Ctrl+i... :h jump-motionsдля получения дополнительной информации
Sundeep
@spasic - неплохое предложение, но как только вы сделаете несколько десятков прыжков, позиция будет потеряна в огромном списке прыжков. Размещая метки в буфере, вы получаете меньший список меток / мест для управления
the_velour_fog
Если вы еще не читали это, я думаю, этот совет будет интересным. Возможно, вам придется настроить свойviminfo
statox
@statox спасибо. Я видел это и подсказка в vim help. Я думаю, что эти решения вызывают автоматический переход к "отметке при открытии файла. Я действительно хотел только перейти к последней позиции курсора вручную. Кроме того, я просто не мог понять, когда "отметка будет установлена ​​и обновлена, поэтому для меня эта "отметка непригодна.
the_velour_fog

Ответы:

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
romainl
источник
2
спасибо, похоже, это действительно может быть полезно. Я загрузил его в свой vimrc, чтобы попробовать. Я переключился на autocmd, WinLeaveпоскольку, как я заметил BufLeave, похоже, что он не срабатывает, когда вы закрываете разделение, а буфер все еще открыт где-то еще. Я знаю, что это немного крайний случай, но, WinLeaveпохоже, он работает в более широком диапазоне ситуаций типа «закрытие файла», но я все еще просто тестирую ...
the_velour_fog
3

Я написал это заявление Vimscript, который, кажется, работает

autocmd BufLeave * :normal ml

объяснение

  • BufLeave Авто команда: это, кажется, срабатывает, когда вы
    • перейти в другое окно
    • при закрытии последнего окна с отображением буфера
    • когда вы закрываете сам буфер с bd
  • :normal- кажется, по умолчанию commandчасть autocmd является командой ex. Поэтому, чтобы vim выполнил команду в нормальном режиме, вам нужно добавить:normal
  • ml- установить отметку l(мнемоника: последняя )

использование

чтобы вызвать позицию курсора в последний раз, когда вы были в буфере, просто нажмите

'l

или же

`l
the_velour_fog
источник
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.
dylnmc
источник