Что является более эффективным способом использования буферов?


13

В последнее время я резко сократил количество используемых плагинов, поэтому я ищу ответы, используя только встроенные функции Vim.

Я заметил недостаток в моем рабочем процессе, когда я редактирую много буферов: я нахожусь в буфере, и я хочу переключиться на другой, который я не помню имя, и который не является альтернативным буфером , Таким образом, использование :b#невозможно, и использование завершения с командой также :bне удобно.

Для этого я делал следующее:

  • Сначала используйте, :buffersчтобы получить список открытых буферов
  • Запомните номер буфера, который я хочу использовать
  • Нажмите, Enterчтобы закрыть список буферов
  • Использовать :bXс Xномером используемого буфера.

Этот рабочий процесс показался мне довольно тяжелым, поэтому я добавил следующие строки в свой .vimrc:

" Improve the navigation in the buffers 
nnoremap <Leader><S-b> :B<CR> 
command! B call Buffers() 

function! Buffers() 
    execute "buffers" 
    let buffer=input("Enter a buffer:") 
    execute "b" . buffer 
endfunction 

Это дает мне команду :B(и отображение), которая вызывает функцию, :buffersожидает ввода и, наконец, вызывает, :bа затем вводит.

Это работает хорошо, но я удивлен, что мне пришлось разработать такую ​​функцию: обычно Vim имеет довольно эффективный рабочий процесс по умолчанию, поэтому мне интересно, есть ли лучший способ переключиться на буфер, из которого я не знаю ничего, кроме что это уже было открыто в моей сессии редактирования.


3
Я делаю :lsпосле :b#(не нужно сначала нажимать return или escape, можно перейти непосредственно из списка буферов в 'ls'.) (Публикация в виде комментария, потому что он не кажется достаточно существенным, чтобы быть ответом? Также интересно, если я что-то
упускаю и отвечаю

2
@LindaJeanne: Как я уже сказал, :b#это не то, что я ищу, но да, тот факт, что вы можете сохранить нажатие клавиши, введя напрямую, :bне нажимая enterраньше, интересен. (На самом деле это может быть слишком легко, чтобы быть ответом, но это стоило комментировать :-))
statox

Я предполагаю, что ЛиндаДжинн имела в виду #символ в качестве замены (буферного) числа, а не буквальный #символ.
8bittree

Ответы:


12

Я заметил недостаток в моем рабочем процессе, когда я редактирую много буферов: я нахожусь в буфере, и я хочу переключиться на другой, который я не помню имя, и который не является альтернативным буфером , Таким образом, использование :b#невозможно, и использование завершения с командой также :bне удобно.

Наоборот, я считаю завершение табуляции чрезвычайно удобным. Установка правильных опций для значений, которые работают для вас, может сильно помочь. Вот соответствующие строки из моего vimrc (они работают для меня, но они могут не работать для вас, поэтому не просто скопируйте их) :

nnoremap ,b :buffer *
set wildmenu
set wildignore+=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=*/min/*,*/vendor/*,*/node_modules/*,*/bower_components/*
set wildignore+=tags,cscope.*
set wildignore+=*.tar.*
set wildignorecase
set wildmode=full

При этом правильный буфер редко находится на расстоянии более пяти или шести нажатий клавиш:

Вкладка-завершение


Это дает мне команду :B(и отображение), которая вызывает функцию, :buffersожидает ввода и, наконец, вызывает, :bа затем вводит.

Барри Артур несколько лет назад придумал гораздо более простое решение, которое с тех пор стало довольно популярным:

nnoremap <leader>b :ls<CR>:b<Space>

из которых я предложил несколько более универсальный вариант пару лет назад:

nnoremap gb :ls<CR>:b

гигабайт


Поскольку мы говорим на vimscript, я написал хорошую функцию, которая «автоматически заполняет» командную строку правильной заглушкой команды после команд типа списка, таких как :lsили :ilist. Преимущество этой функции перед приведенными выше сопоставлениями заключается в том, что мне не нужно запоминать конкретные сопоставления. Это работает так же, как Vim, но с небольшим поворотом .

" smooth listing
cnoremap <expr> <CR> <SID>CCR()

function! s:CCR()
    if getcmdtype() == ":"
        let cmdline = getcmdline()
            if cmdline =~ '\v\C^(dli|il)' | return "\<CR>:" . cmdline[0] . "jump  " . split(cmdline, " ")[1] . "\<S-Left>\<Left>"
        elseif cmdline =~ '\v\C^(cli|lli)' | return "\<CR>:silent " . repeat(cmdline[0], 2) . "\<Space>"
        elseif cmdline =~ '\C^changes' | set nomore | return "\<CR>:sil se more|norm! g;\<S-Left>"
        elseif cmdline =~ '\C^ju' | set nomore | return "\<CR>:sil se more|norm! \<C-o>\<S-Left>"
        elseif cmdline =~ '\C^ol' | set nomore | return "\<CR>:sil se more|e #<"
        elseif cmdline =~ '\C^undol' | return "\<CR>:u "
        elseif cmdline =~ '\C^ls' | return "\<CR>:b"
        elseif cmdline =~ '/#$' | return "\<CR>:"
        else | return "\<CR>" | endif
    else | return "\<CR>" | endif
endfunction

CCR


Тем не менее, я большой сторонник "символьной навигации" над "файловой навигацией". Когда это применимо, навигация на основе символов намного быстрее и экономичнее, чем навигация на основе файлов.

Кстати, последний GIF показывает одно из средств навигации по символам. Пример глупый, но ... да ладно.


Я думаю, что я не наигрался с wild*опциями, я постараюсь настроить его по-своему. Что касается решения Барри Артура, то оно довольно близко к интересному ответу @ nobe4. Наконец, мне нужно более глубоко взглянуть на вашу CCR()функцию, чтобы действительно получить ее, но она выглядит многообещающей. Спасибо за Ваш ответ.
statox

5
Смотрите этот мой ответ . Особенно комический.
romainl

Я определенно украду некоторые из них!
statox

7

Я столкнулся с той же проблемой некоторое время назад, и я нашел решение:

nnoremap <leader>b :buffers<CR>:buffer<space>

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

Я думаю, что имеет смысл, что у Vim здесь нет опции «список и выбор», это два отдельных действия. Но Вим достаточно силен, чтобы объединить команду.

Думайте об этом как о философии Unix: делай одно и делай это хорошо.

:buffersперечисляет буферы и :buffer xxxпозволяет выбрать один.


1
Это хороший способ осветить функцию, которую я предложил в своем вопросе, интересно!
statox

1
Если вы хотите сделать пространство в конце более видимым, вы можете сделать: nnoremap <leader> b: buffers <CR>: buffer <Space> |
Тайлер Дерден

1

Некоторое время я использовал технику nobe4 следующим образом:

nnoremap <Leader>b :set nomore<Bar>:ls<Bar>:set more<CR>:b<Space>

Затем я начал использовать Tab-завершение с этим (как предполагает romainl)

Но совсем недавно я обнаружил, что самый быстрый метод с наименьшим количеством нажатий клавиш - это использовать:

{count} CTRL-^

Это не так уж и отличается, :b#<Enter>но, как вы говорите, вам нужно знать номер буфера!

Для этого я запустил плагин MiniBufExplorer , который отображает список имен файлов сверху (как почти любой другой редактор). Я уверен, что есть множество альтернатив.

Наконец, поскольку Ctrl-^мои пальцы немного растягиваются, и это очень распространенная операция, я перенес ее на Ctrl-E. Реализация для этого не слишком сложна:

nnoremap <C-E> :<C-U>call SwitchToBuffer()<CR>

function! SwitchToBuffer()
  if v:count > 0
    exec v:count . "b"
    return
  endif

  " Whatever you want to do if you didn't provide a count
  " In this case, fall back to nobe4's technique:
  call feedkeys(":ls\n:b ")
endfunction

Итак, мой текущий процесс переключения буфера происходит примерно так:

  1. Посмотрите на MiniBufExplorer
  2. Хит 3 Ctrl-E

К сожалению, MBE и приведенный выше скрипт не являются встроенными в Vim, как вы и просили. Когда я на удаленной машине без конфигурации, я просто использую :b [partial]и Tab-завершение.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.