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

StackOverflow https://stackoverflow.com/questions/53664

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

:n
:prev

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

:args

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

:n test.pl

который, как я ожидаю, затем будет ДОБАВЛЕН в мой список файлов, но вместо этого он стирает мой текущий список файлов, и когда я печатаю :args у меня есть только test.pl открыть.

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

Это было полезно?

Решение

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

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

Другие советы

Листинг

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

: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 вариант.

:ls

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

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

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

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

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

:mksession! ~/today.ses

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

vim -S ~/today.ses

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

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

:argadd

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

:argdelete

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

:help args дает гораздо больше деталей и расширенное использование

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

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

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

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

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

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

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

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

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

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

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

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

ОБНОВЛЯТЬ :В последнее время я использую dyng/ctrlsf.vim для поиска с контекстным представлением (например, Sublime search), и я переключил движок с аг к рипгреп.Производительность выдающаяся.

Вещи как :e и :badd будет принимать только ОДИН аргумент, поэтому следующее не удастся

: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/*

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

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

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

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

Краткое содержание:

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

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

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

При смене мест сброс отметок тоже происходит быстро: mC отмечает новое место кода, mT отмечает новое испытательное место.

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

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

Добавление еще одного ответа, поскольку он не описан ни в одном ответе.

Чтобы изменить все буферы на 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

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

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

Подробнее на :help arglist

Мой способ эффективной работы с несколькими файлами — использовать 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

Если используя только встроенные команды 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'.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

nmap <CR> :CtrlPBuffer<CR>

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

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

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

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

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

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

alias vim="vim -p"

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

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

NERDtree

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

Ботаник

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

vim-плагин

Вундл

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

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

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

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

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

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

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

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

    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
    
  2. Легко переходите от разделения к разделению:

    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>
    
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top