Чи є спосіб надійно повернутися вперед і назад в історію файлів


15

Я хотів би перейти до файлу, який я нещодавно відредагував останній і наступний вид, як-от плагіни MRU.

:bnextі :bprevпрацює іноді, але найчастіше я просто опиняюся в якомусь незрозумілому файлі, не пам'ятаю редагування і змушений повернутися до плагіна MRU.

Чи є спосіб це виправити?

Ctrl-^заміни між двома останніми файлами. Який найкращий спосіб переходити між іншими?

Я розумію, що це може бути складним, але я згоден на все, що може покращити поточну :bn :bpповедінку. Буфери, які я часто бачу, абсолютно не відповідають. Можливо, є плагін, який може відслідковувати останні файли та надавати гачки, щоб я міг створювати відображення?

Відповідаючи на коментарі, трохи прояснили мої думки. Я вважаю, що я хочу - це можливість переміщати файли в порядку останнього збереження. Таким чином, якщо я повернуся в історію, порядок не зміниться, поки я не збережу файл, який потім стає останнім і не зробить один крок "назад" до файла, збереженого безпосередньо перед цим, тобто того, з якого я почав.

Щось на зразок Ctrl-O Ctrl-Iпари, яка перемикає файли відразу, не стрибаючи навколо поточного буфера. Сорт як uі Uв netrw:

   u    Change to recently-visited directory                 |netrw-u|
   U    Change to subsequently-visited directory             |netrw-U|

Під "файлом, який я нещодавно редагував", ви маєте на увазі "файл, до якого я нещодавно вносив зміни"? Або ви просто маєте на увазі останнє, яке ви бачили у Vim?
Багатий

2
Якщо останнє, я особисто просто розминаю Ctrl-O(або іноді Ctrl-T), поки не доїду.
Багатий

Так, це те , що я теж Ctrl-Oі Ctrl-I. Але він стрибає між точками редагування, і це порушує потік. Все, що я хочу переходити між буферами в порядку доступу. Як плагіни відображають список останніх файлів? Вони всередині них стежать?
звільнений

Ctrl-^заміни між двома останніми файлами. Але який найкращий спосіб орієнтуватися між більшим?
звільнений

Під доступом досі не зрозуміло, якщо ви маєте на увазі порядок їх відкриття, записаний у зосереджене вікно чи змінений. Ctrl-O/Iє специфічними для вікон видовищами, тоді як MRU зазвичай глобальний. Якщо ви хочете замовити за останнім доступом, як тільки ви один раз відскочите назад, порядок списку змінюється, що ще більше ускладнює справи.
Метт Бем

Відповіді:


7

Я написав невелику функцію, щоб неодноразово натискати CTRL-O, поки буфер не змінився.

Ви можете знайти його тут . Я відобразив це на CTRL-U, але ви могли б перекрити CTRL-O, якщо хочете.

function! GoBackToRecentBuffer()
  let startName = bufname('%')
  while 1
    exe "normal! \<c-o>"
    let nowName = bufname('%')
    if nowName != startName
      break
    endif
  endwhile
endfunction

nnoremap <silent> <C-U> :call GoBackToRecentBuffer()<Enter>

Можливо, ви могли б написати щось подібне для <C-I>.

Проблеми:

  • Якщо попереднього буфера немає, він продовжуватиметься беззвучно циклічно, поки ви не натиснете CTRL-C!

Пов'язані:

  • :jumps перелічує історичні місця, через які CTRL-O відступить.
  • За замовчуванням CTRL-T Vim є хорошою альтернативою розтирання CTRL-O, оскільки він є більш грубим: він рухається назад лише через стрибки тегів.

Здається, Vim пропонує лише один рівень історії файлів MRU, відкритий на CTRL- ^. Однак я помітив, коли використовував :kwbdдля закриття декількох буферів, що Vim робить крок назад до попередніх буферів у очікуваному зворотно-історичному порядку. Можливо, Vim має список MRU, яким він не ділиться з нами, або, можливо, він вибирає, до якого буфера повернутися, на основі історії локацій CTRL-O ( :jumps).
joeytwiddle

1
Крім того , autocmd InsertLeave * normal mZбуде пам'ятати останній змінений файл в глобальній марку Z . Ви можете повернутися до цього g'Z. // У мене є, nmap <C-y> g'Zале я все ще частіше використовую Ctrl-U.
joeytwiddle

6

Ви можете використовувати :lsдля показу всіх буферів. Наприклад:

:ls
  1      "vim.markdown"                 line 160
  2      "ext.markdown"                 line 0
  3 #    "~/to"                         line 1
  4 %a   "~/TODO"                       line 68

Щоб повернутися до буфера ext.markdown, використовуйте :e +Nbuf, де Nномер буфера з першого стовпця. Наприклад: :e +2buf.

Ви можете створити просту функцію для більш інтерактивного досвіду:

fun! ChooseBuf()
    redir => buffers
        silent ls
    redir end

    echo l:buffers
    let l:choice = input('Which one: ')
    execute ':edit +' . l:choice . 'buf'
endfun
command! ChooseBuf call ChooseBuf()
nnoremap <Leader>b :call ChooseBuf()<CR>

Після використання :ChooseBufабо <Leader>bви можете просто ввести номер буфера, який ви хочете відредагувати.

Це не зовсім "нещодавно використовується", оскільки замовлення "нещодавно відкрито" (це, мабуть, і тому :bnext/ :bprevне працює так, як ви очікуєте).


4

<C-6>це те, що вам потрібно, що повертає вас до попереднього буфера, який ви відкрили перед поточним. Є також :bprev& :bnextякі ви можете використовувати для того ж.


<C-6>це не погано, але я не можу використовувати це, щоб відскочити два буфери. bprevі bnextне в порядку стрибків.
Праксеоліт

Так, я не думаю, що існує хорошого рідного способу заглибитися в історію. Вам доведеться використовувати плагін MRU, навіть у CtrlP є один, повинні бути інші
Dhruva Sagar

2
Примітка: це не так <C-6>, це <C-^>. Хоча на багатьох термінальних емуляторах немає відмінності, на деяких (включаючи той, що постачається з OS X), є. В останньому випадку необхідне використання Shiftключа (припускаючи макет Qwerty).
tommcdo

@tommcdo цікаво, я на osx, але використовуйте iterm замість terminal.app, він працює так само для мене. Якщо потрібна клавіша Shift на ній, це буде обломком.
Dhruva Sagar

Подумайте про це, можливо, просто моя ОС перехоплює цю прив'язку ключа, а не поширює її на Vim. Мою ОС треба зупинити!
tommcdo

2

Ви також можете скористатись :oldfilesсписком редакторів, які ви редагували.

У списку будуть номери, пов’язані з іменами файлів. Виберіть файл, відмітьте номер (скажімо, 14) і відкрийте його:edit #<14

Ви також можете запускати інші команди у цьому файлі або передавати декілька файлів команді одночасно. Більше про це ТУТ


1
Інший відповідь в зв'язку навчив мене:bro[wse] ol[dfiles][!]
Стів
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.