Как эффективно работать с несколькими файлами в Vim? - PullRequest
1046 голосов
/ 10 сентября 2008

Я начал использовать Vim для разработки сценариев Perl и начинаю находить его очень мощным.

Мне нравится то, что я могу открывать несколько файлов одновременно, например, vi main.pl maintenance.pl и затем прыгайте между ними с помощью:

:n
:prev

и посмотрите, какой файл открыт с

:args

А чтобы добавить файл, я могу сказать:

:n test.pl

, который я ожидаю, будет добавлен в мой список файлов, но вместо этого он стирает мой текущий список файлов, и когда я набираю :args, у меня открывается только test.pl.

Так, как мне ДОБАВИТЬ и УДАЛИТЬ файлы в моем списке аргументов?

Ответы [ 27 ]

17 голосов
/ 15 сентября 2008

При использовании нескольких файлов в vim я в основном использую эти команды (с ~ 350 открытыми файлами):

  • :b <partial filename><tab> (переход в буфер)
  • :bw (очистка буфера, удаление буфера)
  • :e <file path> (редактировать, открывать новый буфер>
  • pltags - включить переход к определениям подпрограмм / методов
14 голосов
/ 09 июля 2013

Вы можете использовать Глобальные метки Vim .

Таким образом, вы можете быстро переключаться между файлами и даже отмечать место в файле. Кроме того, ключевые команды короткие: 'C приводит меня к коду, с которым я работаю, 'T выводит меня на юнит-тест, с которым я работаю.

Когда вы меняете место, сброс меток также происходит быстро: mC отмечает новый код, mT отмечает новое тестовое место.

12 голосов
/ 17 сентября 2008

Я использую тот же файл .vimrc для GVim и командной строки vim. Я склонен использовать вкладки в GVim и буферы в командной строке vim, поэтому у меня настроен .vimrc, чтобы облегчить работу с ними обоими:

" Movement between tabs OR buffers
nnoremap L :call MyNext()<CR>
nnoremap H :call MyPrev()<CR>

" MyNext() and MyPrev(): Movement between tabs OR buffers
function! MyNext()
    if exists( '*tabpagenr' ) && tabpagenr('$') != 1
        " Tab support && tabs open
        normal gt
    else
        " No tab support, or no tabs open
        execute ":bnext"
    endif
endfunction
function! MyPrev()
    if exists( '*tabpagenr' ) && tabpagenr('$') != '1'
        " Tab support && tabs open
        normal gT
    else
        " No tab support, or no tabs open
        execute ":bprev"
    endif
endfunction

Это перекрывает существующие отображения для H и L, но делает переключение между файлами чрезвычайно быстрым и простым. Просто нажмите «H» для следующего и «L» для предыдущего; используете ли вы вкладки или буферы, вы получите ожидаемые результаты.

10 голосов
/ 05 июля 2017

Добавление другого ответа, так как это не охватывается ни одним из ответов

Чтобы изменить все буферы на tab view.

 :tab sball

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

gt or :tabn           "    go to next tab
gT or :tabp or :tabN  "    go to previous tab

подробности на :help tab-page-commands.

Мы можем указать vim открыть несколько файлов с помощью vim -p file1 file2 в качестве вкладки. alias vim='vim -p' будет полезно.
Этого же можно добиться, следуя автокоманде в ~/.vimrc

 au VimEnter * if !&diff | tab all | tabfirst | endif

В любом случае, чтобы ответить на вопрос: Для добавления в список аргументов: arga file,

Удалить из списка аргументов: argd pattern

Больше на :help arglist

10 голосов
/ 15 сентября 2008

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

7 голосов
/ 20 июня 2017

Если с использованием только встроенных команд vim , лучшее, что я когда-либо видел для переключения между несколькими буферами, это:

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

Прекрасно сочетает в себе команды :ls и :b - вывод списка всех открытых буферов и ожидание ввода команды для переключения буфера.

Учитывая приведенное выше отображение в vimrc, после ввода <Leader>f,

  • Отображаются все открытые буферы
  • Вы можете:
    • Введите 23, чтобы перейти в буфер 23,
    • Введите #, чтобы перейти в альтернативный буфер / MRU,
    • Введите частичное имя файла, затем введите <Tab> или <C-i> для автозаполнения,
    • Или просто <CR> или <Esc>, чтобы остаться в текущем буфере

Снимок вывода для приведенного выше сопоставления клавиш:

:set nomore|:ls|:set more
  1  h    "script.py"    line 1
  2 #h  + "file1.txt"    line 6  -- '#' for alternative buffer
  3 %a    "README.md"    line 17 -- '%' for current buffer
  4       "file3.txt"    line 0  -- line 0 for hasn't switched to
  5     + "/etc/passwd"  line 42 -- '+' for modified
:b '<Cursor> here'

В приведенном выше снимке:

  • Второй столбец: %a для текущего, h для скрытого, # для предыдущего, пустой для не был переключен на.
  • Третий столбец: + для измененных.

Также настоятельно рекомендую set hidden. См. :help 'hidden'.

7 голосов
/ 19 января 2014

Мой способ эффективно работать с несколькими файлами - использовать tmux.

Позволяет разделить окна по вертикали и горизонтали, например:

enter image description here

У меня он работает таким образом как на моих компьютерах Mac, так и на Linux, и я нахожу его лучше, чем встроенный механизм переключения оконных панелей (на Mac). Я считаю, что переключение проще, и только с помощью tmux я смог получить «новую страницу в том же текущем каталоге», работающую на моем Mac (несмотря на то, что, кажется, есть варианты для открытия новых панелей в том же каталоге), что удивительно критическая часть. Мгновенно новая панель в текущем местоположении удивительно полезна. Метод, который создает новые панели с одинаковыми комбинациями клавиш для обеих ОС, очень важен для меня и является бонусом для будущей личной совместимости. Помимо нескольких панелей tmux, я также пытался использовать несколько вкладок, например, enter image description here и несколько новых окон, например enter image description here и в конечном итоге я обнаружил, что несколько панелей tmux наиболее полезны для меня. Я очень «визуален» и люблю держать свои различные контексты прямо перед собой, соединенные вместе как панели.

tmux также поддерживает горизонтальные и вертикальные панели, чего не было у старого screen (хотя iterm2 для Mac, похоже, поддерживает его, но опять же, текущая настройка каталога у меня не сработала). tmux 1.8

6 голосов
/ 19 августа 2017

Я использую следующее, это дает вам множество функций, которые вы ожидаете иметь в других редакторах, таких как Sublime Text / Textmate

  1. Используйте буферы, а не «закладки». Буферы - это та же концепция, что и вкладки почти во всех других редакторах.
  2. Если вы хотите, чтобы вкладки выглядели одинаково, вы можете использовать плагин vim-aviation со следующими настройками в .vimrc: let g:airline#extensions#tabline#enabled = 1. Это автоматически отображает все буферы как заголовки вкладок, когда у вас нет открытых вкладок
  3. Используйте Tim Pope's , который дает *1013*, что дает [ b и ] b для перехода к предыдущему / следующие буферы соответственно (плюс целый ряд других вкусностей)
  4. У вас есть set wildmenu в вашем .vimrc, тогда, когда вы наберете :b <file part> + Tab для буфера, вы получите список возможных буферов, которые вы можете использовать стрелки влево / вправо для прокрутки
  5. Используйте плагин Тима Поупа vim-obsession для хранения сессий, которые хорошо играют с авиакомпаниями (у меня было много боли с сессиями и плагинами )
  6. Используйте плагин Тима Папы vim-уксуса . Это работает с нативным :Explore, но значительно облегчает работу с ним. Вы просто набираете -, чтобы открыть проводник, это тот же ключ, что и для перехода в каталог в проводнике. Ускоряет навигацию (однако с fzf я редко использую это)
  7. fzf (который может быть установлен как плагин vim) также является действительно мощным нечетким искателем, который вы можете использовать для поиска файлов (и буферов тоже). fzf также очень хорошо играет с fd (более быстрая версия find)
  8. Используйте Ripgrep с vim-ripgrep для поиска по базе кода, а затем вы можете использовать :cdo в результатах для поиска и замены
3 голосов
/ 16 сентября 2008

Я использую несколько буферов, которые скрыты в моем файле ~/.vimrc.

Скрипт мини-буфера также хорош для получения компактного списка ваших буферов. Затем :b1 или :b2 ..., чтобы перейти к соответствующему буферу или использовать проводник мини-буфера и перейти через буферы.

3 голосов
/ 03 июля 2014

Я использую командную строку и много git, поэтому у меня есть этот псевдоним в моем bashrc:

alias gvim="gvim --servername \$(git rev-parse --show-toplevel || echo 'default') --remote-tab"

Это откроет каждый новый файл в новой вкладке в существующем окне и создаст одно окно для каждого репозитория git. Таким образом, если вы откроете два файла из репо A и 3 файла из репо B, вы получите два окна: одно для репо A с двумя вкладками и одно для репо B с тремя вкладками.

Если открываемый файл не содержится в git-репо, он перейдет в окно по умолчанию.

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

nmap <C-p> :tabprevious<CR>
nmap <C-n> :tabnext<CR>

Чтобы открыть несколько файлов одновременно, вы должны объединить это с одним из других решений.

...