Есть ли способ надежно переходить назад и вперед в истории файлов

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|
firedev
источник
Под «файлом, который я только что отредактировал последним», вы буквально подразумеваете «файл, который я недавно редактировал»? Или вы просто имеете в виду последнее, что вы видели в Vim?
Богатый
2
Если последнее, я лично просто пюре Ctrl-O(или иногда Ctrl-T), пока я не доберусь туда.
Богатый
Да, я тоже так Ctrl-Oи делаю Ctrl-I. Но он прыгает между точками редактирования, и это нарушает поток. Все, что я хочу, чтобы идти вперед и назад между буферами в порядке доступа. Как плагины отображают список самых последних файлов? Они отслеживают их внутренне?
firedev
Ctrl-^перестановки между двумя последними файлами. Но как лучше переходить между ними?
firedev
При доступе все еще неясно, имеете ли вы в виду порядок, в котором они были открыты, записаны, в сфокусированном окне или изменены. 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, потому что он более грубый: он перемещается назад только через переходы тегов.
joeytwiddle
источник
Кажется, 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не в порядке прыжков.
Praxeolitic
Да, я не думаю, что есть какой-то хороший родной способ углубиться в историю. Вам придется использовать какой-нибудь плагин MRU, даже у CtrlP есть, другие должны быть
Дхрува Сагар
2
Примечание: это не <C-6>так <C-^>. В то время как на многих эмуляторах терминалов нет никакого различия, на некоторых (включая тот, который поставляется с OS X), есть. В последнем случае Shiftтребуется использование ключа (при условии расположения Qwerty).
Tommcdo
@tommcdo интересно, я на OSX, но использую iterm вместо Terminal.app, он работает для меня то же самое. Требование клавиши Shift на нем было бы обломом.
Дхрува Сагар
Если подумать, возможно, моя ОС захватывает эту привязку ключа, а не передает ее в Vim. Моя ОС должна быть остановлена!
Tommcdo
2

Вы также можете использовать, :oldfilesчтобы получить список файлов, которые вы редактировали.

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

Вы также можете запустить другие команды для этого файла или передать несколько файлов команде одновременно. Подробнее об этом ЗДЕСЬ

Каролис Концевичюс
источник
1
Другой ответ в связи научил меня:bro[wse] ol[dfiles][!]
Стив