Як я можу використовувати позначки для переходу до локацій у файлах, які я нещодавно відкрив, але не змінив?


11

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

" До позиції курсора при останньому виході з поточного буфера. За замовчуванням перший символ першого рядка. Дивіться | стрибок останньої позиції | як використовувати це для кожного відкритого файлу. За кожним буфером запам'ятовується лише одна позиція, а не одна для кожного вікна. Поки буфер видно у вікні, положення не буде змінено. {не в Vi}.

Однак якщо я

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

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


2
Я думаю, ви шукаєте Ctrl+oта Ctrl+i... :h jump-motionsдля отримання додаткової інформації
Sundeep

@spasic - це не погана пропозиція, але коли ви зробите кілька десятків стрибків, позиція буде втрачена у масовому списку стрибків. Зарахувавши позначки до буфера, ви маєте менший список міток / місць, якими можна керувати
the_velour_fog

Якщо ви його ще не читали, я думаю, ця порада була б цікавою. Можливо, вам доведеться підправити своєviminfo
statox

@statox дякую. Я бачив це і кінчик у vim допомагає. Я думаю, що ці рішення викликають автоматичний перехід до "позначки, коли ви відкриваєте файл. Мені дуже хотілося перейти до останнього положення курсору вручну. Крім того, я просто не міг зрозуміти, коли "марка встановлюється та оновлюється, тому для мене "марка є непридатною.
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

2
спасибі, схоже, це справді може бути корисним. Я завантажив його у свій vimrc, щоб спробувати. Я перейшов на autocmd, WinLeaveоскільки я помітив, BufLeaveщо, здається, не спрацьовує, коли ви закриєте спліт, а буфер все ще відкритий десь в іншому місці. Я знаю, що це трохи кращий випадок, але, WinLeaveздається, працює над ширшим спектром ситуацій типу "закриття файлів", але я все ще просто тестую ...
the_velour_fog

3

Я написав цей виразний вислів, який, здається, працює

autocmd BufLeave * :normal ml

Пояснення

  • BufLeave auto команда: це, здається, спрацьовує, коли ви
    • перейти до іншого вікна
    • коли ви закриєте останнє вікно, де відображається буфер
    • коли ви закриєте сам буфер bd
  • :normal- за замовчуванням здається, що commandчастина autocmd - це команда ex. Отже, щоб сказати vim виконувати команду в звичайному режимі, вам потрібно додати:normal
  • ml- встановити знак l(мнемонічний: останній )

Використання

щоб згадати положення курсору з останнього разу, коли ви були в буфері, просто натисніть

'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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.