Как эффективно работать с несколькими файлами в Vim?

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

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

:n
:prev

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

:args

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

:n test.pl

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

Итак, как я могу добавлять и удалять файлы в свой список args?

Ответ 1

Почему бы не использовать вкладки (введенные в Vim 7)? Вы можете переключаться между вкладками с :tabn и :tabp, С помощью :tabe <filepath> вы можете добавить новую вкладку; и с регулярным :q или :wq вы закрываете вкладку. Если вы сопоставляете :tabn и :tabp с клавишами F7/F8, вы можете легко переключаться между файлами.

Если файлов не так много или у вас нет Vim 7, вы также можете разделить экран на несколько файлов: :sp <filepath>. Затем вы можете переключаться между splitscreens с помощью Ctrl + W, а затем клавиши со стрелкой в ​​направлении, которое вы хотите переместить (или вместо клавиш со стрелками, W для следующего и W для предыдущего splitscreen)

Ответ 2

Список

Чтобы просмотреть список текущих буферов, я использую:

:ls

Открытие

Чтобы открыть новый файл, я использую

:e ../myFile.pl

с расширенным завершением вкладки (поместите set wildmenu в .vimrc).

Примечание. Вы также можете использовать :find, который будет искать набор путей для вас, но вам нужно сначала настроить эти пути.


Переключение

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

:b myfile

с расширенным завершением вкладки (все еще set wildmenu).

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


Использование окон

Ctrl-W s и Ctrl-W v, чтобы разделить текущее окно по горизонтали и по вертикали. Вы также можете использовать :split и :vertical split (:sp и :vs)

Ctrl-W w для переключения между открытыми окнами и Ctrl-W h (или j или k или l) для навигации по открытым окнам.

Ctrl-W c закрыть текущее окно и Ctrl-W o закрыть все окна, кроме текущего.

Запуск vim с флагом -o или -o открывает каждый файл в своем собственном расколе.


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

Примечание. Если вы хотите, чтобы все файлы переходили в тот же экземпляр Vim, запустите Vim с опцией --remote-silent.

Ответ 3

:ls

для списка открытых буферов

  • :bp предыдущий буфер
  • :bn Следующий буфер
  • :bn (n число) переместитесь в n-й буфер
  • :b <filename-part> с вкладкой-ключом, обеспечивающей автозаполнение (awesome!!)

В некоторых версиях vim bn и bp на самом деле bnext и bprevious соответственно. В этом случае полезно включить автозаполнение.

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

Кроме того, вы можете сохранять сеансы vim

:mksession! ~/today.ses

Вышеприведенная команда сохраняет текущие буферы и настройки открытых файлов на ~/today.ses. Вы можете загрузить этот сеанс, используя

vim -S ~/today.ses

Никаких хлопот, вспоминая, где вы остановились вчера.;)

Ответ 4

Чтобы добавить в список args:

:argadd

Чтобы удалить из списка args:

:argdelete

В вашем примере вы можете использовать :argedit test.pl, чтобы добавить test.pl в список args и отредактировать файл за один шаг.

:help args дает гораздо более подробную информацию и расширенное использование

Ответ 5

Я использую команды буфера - :bn (следующий буфер), :bp (предыдущий буфер) :buffers (список открытых буферов) :b<n> (открыть буфер n) :bd (удалить буфер). :e <filename> просто откроется в новый буфер.

Ответ 6

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

Попробуйте сделать :ls, чтобы просмотреть список файлов, которые вы открыли, и вы увидите:

   1 %a   "./checkin.pl"            line 1
  2 #    "./grabakamailogs.pl"     line 1
  3      "./grabwmlogs.pl"         line 0
  etc.

Затем вы можете отскакивать через файлы, ссылаясь на них по указанным цифрам, например. : 3b

или вы можете разделить экран, введя номер, но используя sb вместо просто b.

В качестве стороннего% относится к файлу, который в настоящее время виден, а # относится к альтернативному файлу.

Вы можете легко переключаться между этими двумя файлами, нажав Ctrl Shift 6

Изменить: например, :ls вы можете использовать :reg, чтобы просмотреть текущее содержимое ваших регистров, включая регистры 0-9, содержащие то, что вы удалили. Это особенно полезно, если вы хотите повторно использовать текст, который вы ранее удалили.

Ответ 7

Vim (но не оригинальный Vi!) имеет вкладки, которые я нахожу (во многих контекстах) выше буферов. Вы можете сказать :tabe [filename], чтобы открыть файл на новой вкладке. Переключение между вкладками осуществляется щелчком по вкладке или комбинациями клавиш [n] gt и gt. Графический Vim даже имеет графические вкладки.

Ответ 8

Такие вещи, как :e и :badd, будут принимать только один аргумент ONE, поэтому следующее не будет выполнено

:e foo.txt bar.txt
:e /foo/bar/*.txt
:badd /foo/bar/*

Если вы хотите добавить несколько файлов из vim, используйте arga[dd]

:arga foo.txt bar.txt
:arga /foo/bar/*.txt
:argadd /foo/bar/*

Ответ 9

Здесь много ответов! То, что я использую, не изобретая колесо - самые известные плагины (которые не собираются умирать в ближайшее время и используются многими людьми), чтобы быть очень быстрыми и вызывающими.

  • ctrlpvim/ctrlp.vim - найти файл по имени нечеткий поиск по его местоположению или просто по имени
  • jlanzarotta/bufexplorer - для просмотра открытых буферов (когда вы не помните, сколько файлов вы открыли и недавно изменили, и вы не помните, где они находятся, вероятно, потому, что вы искали их с помощью Ag)
  • rking/ag.vim для поиска файлов по отношению к gitignore
  • scrooloose/nerdtree, чтобы увидеть структуру каталогов, просмотреть, добавить/удалить/изменить файлы.

UPDATE: Недавно я использую dyng/ctrlsf.vim для поиска в контекстном представлении (например, Sublime search), и я переключил движок с ag на ripgrep. Производительность невыполнима.

Ответ 10

Некоторые ответы в этой теме предлагают использовать вкладки, а другие предлагают использовать буфер для выполнения того же самого. Вкладки и буферы разные. Я настоятельно рекомендую вам прочитать эту статью Сумасшествие Vim Tab - Буферы против вкладок

Вот хорошее резюме, которое я вытащил из статьи:

Краткое описание:

  • Буфер - это текст в памяти файла.
  • Окно представляет собой окно просмотра в буфере.
  • Страница закладки - это коллекция окон.

Ответ 11

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

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

Ответ 12

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

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

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

Ответ 13

Я использую тот же файл .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" для предыдущего; используете ли вы вкладки или буферы, вы получите ожидаемые результаты.

Ответ 14

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

Ответ 15

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

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

enter image description here

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

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

Ответ 16

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

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

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

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

  • Отображаются все открытые буферы
  • Ты можешь:
    • Тип 23 переходит в буфер 23,
    • Введите # чтобы перейти в альтернативный буфер /MRU,
    • Введите частичное имя файла, затем введите <Tab> или <Ci> для автозаполнения,
    • Или просто <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'.

Ответ 17

Добавление другого ответа, поскольку это не подлежит ни одному из ответов

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

 :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

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

Чтобы удалить из списка arg: argd pattern

Больше в :help arglist

Ответ 18

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

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

Ответ 19

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

  • Используйте буферы, а не "вкладки". Буферы - это та же концепция, что и вкладки практически во всех других редакторах.
  • Если вам нужен одинаковый вид наличия вкладок, вы можете использовать плагин vim-airline со следующей настройкой в ​​.vimrc: let g:airline#extensions#tabline#enabled = 1. Это автоматически отображает все буферы в виде заголовков вкладок, когда у вас нет открываемых страниц.
  • Используйте Tim Pope vim-unimpaired, который дает [ b и ] b для перехода к предыдущему/следующему буферов соответственно (плюс целый ряд других лакомств).
  • У вас set wildmenu в вашем .vimrc, а затем, когда вы вводите :b <file part> + Tab для буфера, вы получите список возможных буферов, которые вы можете использовать стрелки влево/вправо для прокрутки
  • Используйте Tim Pope vim-obsession плагин для хранения сессий, которые хорошо сочетаются с авиакомпанией (у меня много боли с сеансами и плагинами)
  • Используйте плагин Tim Pope vim-vinegar. Это работает с нативным :Explore, но с ним намного проще работать. Вы просто набираете -, чтобы открыть проводник, который является тем же самым ключом, что и поиск каталога в проводнике. Делает навигацию быстрее (однако с fzf я редко использую это)
  • fzf (который может быть установлен как плагин vim) также является действительно мощным нечетким поиском, который вы можете использовать для поиска файлов (и буферов). fzf также играет очень красиво с fd (более быстрая версия поиска)
  • Используйте Ripgrep с vim-ripgrep для поиска по вашей базе кода, а затем вы можете использовать :cdo для результатов поиска и замены

Ответ 20

попробуйте следующие карты для удобства редактирования нескольких файлов

"разделенные окна

nmap <leader>sh :leftabove vnew<CR>

nmap <leader>sl :rightbelow vnew<CR>

nmap <leader>sk :leftabove new<CR>

nmap <leader>sj :rightbelow new<CR>

"перемещение

nmap <C-j> <C-w>j

nmap <C-k> <C-w>k

nmap <C-l> <C-w>l

nmap <C-h> <C-w>h

Ответ 21

Я использую командную строку и 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>

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

Ответ 22

Я сделал очень простое видео, показывающее рабочий процесс, который я использую. В основном я использую Ctrl-P плагин Vim, и я отобразил навигацию буфера на клавишу Enter.

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

У меня не так много файлов, открытых в видео, но это становится невероятно полезным, когда вы начинаете много.

Поскольку плагин сортирует буферы с использованием заказа MRU, вы можете просто нажать Enter дважды и перейти к самому последнему файлу, который вы редактировали.

После установки плагина необходима только одна конфигурация:

nmap <CR> :CtrlPBuffer<CR>

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

Ответ 23

если вы используете osx и хотите, чтобы вы могли нажимать на ваши вкладки, используйте MouseTerm и SIMBL (взятые из здесь). Кроме того, ознакомьтесь с этим обсуждением.

Ответ 24

Когда я начал использовать VIM, я не понимал, что вкладки должны использоваться как разные макеты окон, а буфер служит ролью для множественного редактирования/переключения файлов между собой. На самом деле в начале вкладки даже не были до версии v7.0, и я только что открыл один VIM внутри вкладки терминала (я использовал гном-терминал в данный момент) и переключался между вкладками, используя alt + numbers, так как я думал, используя команды вроде: buffers,: bn и: bp были слишком много для меня. Когда был выпущен VIM 7.0, мне было проще управлять большим количеством файлов и переключиться на него, но в последнее время я просто понял, что буферы всегда должны быть в пути, если только одно: вам нужно настроить его, чтобы он работал правильно.

Итак, я попробовал vim-авиакомпанию и включил визуальную верхнюю вкладку, такую ​​как буферная панель, но у графика возникла проблема с моим iTerm2, поэтому я попробовал пару других, и кажется, что MBE работает лучше всего для меня. Я также устанавливаю shift + h/l как ярлыки, так как исходные (перемещение к голове/хвосту текущей страницы) для меня не очень полезны.

map <S-h> :bprev<Return>
map <S-l> :bnext<Return>

Кажется, что еще проще, чем gt и gT, и: e проще, чем: tabnew. Я нахожу: bd не так удобен, как: q хотя (у MBE есть некоторые проблемы с ним), но я могу жить со всеми файлами в буфере, которые, как я думаю.

Ответ 25

Вы можете быть абсолютным сумасшедшим и псевдонимом vim до vim -p, добавив в свой .bashrc:

alias vim="vim -p"

Это приведет к открытию нескольких файлов из оболочки в закладках, без необходимости вызывать :tab ball изнутри vim.

Ответ 26

Большинство ответов в этом потоке используют простые команды vim, которые, конечно, прекрасны, но я думал, что предоставил бы обширный ответ, используя комбинацию плагинов и функций, которые я нахожу особенно полезными (по крайней мере некоторые из этих советов пришли из советы по навигации по файлам Gary Bernhardt):

  • Чтобы переключиться между последними двумя файлами, просто нажмите <leader> дважды. Я рекомендую назначить <leader> пробелу:

    nnoremap <leader><leader> <c-^>
    
  • Для быстрого перемещения по проекту ответ является нечетким согласующим решением, таким как CtrlP. Я привязываю его к <leader>a для быстрого доступа.

  • В случае, когда я хочу видеть визуальное представление открытых в настоящее время буферов, я использую плагин BufExplorer. Простой, но эффективный.

  • Если я хочу просмотреть файловую систему, я бы использовал командную строку или внешнюю утилиту (Quicklsilver, Afred и т.д.), но чтобы посмотреть на текущую структуру проекта Дерево NERD - это классика. Не используйте это, хотя вместо 2 в качестве основного метода поиска файлов. Это действительно замедлит вас. Я использую привязку <leader>ff.

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

  • Откройте новые расщепления в небольших областях, когда места недостаточно и их можно расширить при навигации. Обратитесь здесь для комментариев о том, что они делают именно:

    set winwidth=84
    set winheight=5
    set winminheight=5
    set winheight=999
    
    nnoremap <C-w>v :111vs<CR>
    nnoremap <C-w>s :rightbelow split<CR>
    set splitright
    
  • С легкостью переходите из split to split:

    nnoremap <C-J> <C-W><C-J>
    nnoremap <C-K> <C-W><C-K>
    nnoremap <C-L> <C-W><C-L>
    nnoremap <C-H> <C-W><C-H>
    

Ответ 27

Я бы предложил использовать плагин

NERDtree

Вот ссылка github с инструкциями.

Nerdtree

Я использую vim-plug как менеджер плагинов, но вы также можете использовать Vundle.

ВИМ-штекером

Vundle