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

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

Мне нравится открывать сразу несколько файлов с помощью:

vi main.pl maintenance.pl

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

:n
:prev

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

:args

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

:n test.pl

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

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


person Edward Tanguay    schedule 10.09.2008    source источник
comment
tmux ... использовать vim на каждой панели   -  person Tommy    schedule 02.09.2016
comment
@Tommy: таким образом вы не можете вставить извлеченный / удаленный контент между файлами (буфер vims). Если он доступен, может помочь только буфер обмена (см. Принятый ответ: stackoverflow.com/questions/5532878/)   -  person ChristophS    schedule 27.06.2018
comment
:N кажется более простым способом перейти к предыдущему файлу ...   -  person Gert van den Berg    schedule 16.11.2018
comment
vimcasts.org/categories/the-argument-list? VimCasts очень рекомендуются при изучении vim.   -  person mcepl    schedule 21.01.2020


Ответы (29)


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

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

person fijter    schedule 10.09.2008
comment
Чтобы сохранить и закрыть вкладку, вы также можете использовать ZZ вместо :wq (как обычно, сохранить и закрыть) - person Andreas Grech; 05.05.2010
comment
Я использую пакет vim-gnome в Ubuntu 10.10 и могу переключаться между вкладками с помощью Ctrl + PageUp и Ctrl + PageDown. Мне не пришлось ничего настраивать; это было по умолчанию. - person Joey Adams; 01.10.2011
comment
Кроме того, в режиме редактирования gt переходит на следующую вкладку, а gT - на предыдущую вкладку. - person Dean; 09.12.2011
comment
Вы можете перейти на любую вкладку, используя ngt, где n - это индекс вкладки (начиная с единицы). Я думаю, что есть опция, которая отображает индекс каждой вкладки рядом с именем файла, но я не знаю, что это такое. Если кто знает, я хотел бы это услышать. - person void-pointer; 13.01.2012
comment
CTRL + PageUp / PageDown также работает в Debian Squeeze. Я не знал, что вкладки существуют по умолчанию! / проголосовать - person Esa; 14.09.2012
comment
Также обратите внимание, что вы можете использовать флаг -p для открытия нескольких файлов во вкладках из командной строки. Например, gvim -p main.pl maintenance.pl откроет эти два файла во вкладках. - person Matthew Strawbridge; 25.11.2012
comment
Примечание. Ctrl + PageUp / PageDown не будет работать, если в терминале Gnome открыто несколько вкладок. Вкладки терминала занимают ярлык. - person Chris Hanson; 02.02.2013
comment
вертикальный раскол! :vsp filename - person javier_domenech; 13.06.2013
comment
Я сопоставил Ctrl-h с предыдущей вкладкой и Ctrl-l со следующей вкладкой, что хорошо сочетается с отображениями Vim по умолчанию h и l (для перемещения курсора влево и вправо): nnoremap <silent> <C-h> gT и nnoremap <silent> <C-l> gt. - person gitaarik; 19.07.2013
comment
@Dean: Я думаю, что gt и gT работают в режиме escape / command, а не в режиме edit. - person Nawaz; 06.05.2014
comment
@JoeyAdams проблема с этим пакетом в том, что он изменяет некоторые вещи, которых вы не ожидаете, или они работают в некоторых очень специфических условиях. Например, в этом случае Ctrl + Pageup / Down фактически используется по умолчанию для переключения вкладок в терминале (по крайней мере, в Ubuntu). Если в вашем терминале есть несколько вкладок (для меня это нормально) и несколько вкладок в Vim, Ctrl + PageUp / Down будет переключаться между вкладками терминала, а не вкладками Vim! (сам тестировал) Вот почему я советую всегда проверять файл конфигурации, когда он у вас такой - прямо из коробки. - person rbaleksandar; 18.06.2014
comment
@AndreasGrech ZZ является синонимом :x, а не :wq. Я знаю, что придирчиво, но разница важна, если вам когда-либо понадобится заботиться о последних измененных временных метках файлов, поскольку :xZZ) будет изменять файл только в том случае, если он изменился. :wq форсирует запись. - person sanmiguel; 12.03.2015
comment
@ void-pointer каждый аспект того, что отображается в заголовке вкладки терминала vim, контролируется параметром tabline. См. :h setting-tabline для получения полной информации. NB: Это не контролирует строку вкладок графического интерфейса. - person sanmiguel; 12.03.2015
comment
fyi, Буферы против вкладок - person Nikos Alexandris; 08.04.2015
comment
Этот ответ не заслуживает такого количества голосов, потому что он заставил меня (и, вероятно, многих других) подумать, что вкладка в vim - это то же самое, что и tab в любом другом редакторе (например, notepad ++ ). @Nikos Alexandris красиво указал, в чем разница между вкладками и окнами. 'Вкладки были разработаны только для того, чтобы у нас было разное расположение окон. Они не предназначены для размещения открытого файла; вместо этого открытый файл загружается в буфер. ' - person patryk.beza; 05.10.2015
comment
Голосовать против, поскольку Patryk.beza верен, это не предназначенная функция вкладок. - person ryanjdillon; 30.11.2015
comment
Если вы используете MacVim, вы также можете переключать вкладки с помощью Command + {и Command +}, которые используются повсюду в OSX для изменения вкладок (например, терминал, Chrome и т. Д.). Небольшой совет. - person Patrick Bassut; 21.01.2016
comment
Как сопоставить: tabn и: tabp с клавишами F7 / F8? - person MuneshSingh; 02.03.2016
comment
@ patryk.beza Я думаю, что блог Buffers vs . Вкладки говорят о Terminal Tab, а не vim tabs в этом ответе. - person Ryan; 11.04.2016
comment
@ Райан Нет. Ты ошибаешься. Буферы против вкладок явно относится к вкладки vim, не вкладки терминала. - person patryk.beza; 12.04.2016
comment
Я считаю, что открытие новых буферов / файлов во вкладках имеет смысл, особенно когда у вас есть много окон одного и того же буфера на текущей вкладке. Однако часто бывает более интуитивно понятным закрыть текущий буфер с помощью :bd (который также закрывает вкладку / окно, если нет разделения с другим буфером) вместо закрытия вкладки / окна (что оставит буфер открытым, если есть другая активная вкладка / окно). - person joelostblom; 18.04.2016
comment
Таким образом, буферы против вкладок говорил, что при использовании разных вкладок / разделенных окон для редактирования одного и того же файла Vim фактически открывает только один буфер, в результате чего вы фактически редактируете один и тот же файл (буфер) на разных вкладках / разделенных окнах. Не думаю, что это проблема для меня. Я по-прежнему буду использовать вкладки и разделенные окна. - person AnnieFromTaiwan; 24.08.2016
comment
Это очень плохой совет. Вкладки - это эффективный способ размещения буферов. - person JohnDoe; 24.09.2016
comment
Используйте: tabn1,: tabn2,: tabn3 ... и т. Д., Чтобы переключиться на эту конкретную вкладку. - person Krishnadas PC; 05.10.2016
comment
@munesh Вам не нужна клавиша F7 / F8 для выполнения: tabn и: tabp, просто используйте gt или gT - person off99555; 03.11.2016
comment
Итерация между вкладками уже по умолчанию сопоставлена ​​с CTRL-PgUp и CTRL-PgDown (по крайней мере, в Ubuntu 16.04) - person Moshe Bixenshpaner; 03.12.2016
comment
@munesh Добавьте строки map <F7> :tabp<CR> и map <F8> :tabn<CR> в ваш файл .vimrc. - person RiaanDP; 02.01.2017
comment
Пожалуйста, подумайте о добавлении уведомления о том, что вместо этого следует использовать буферы, и предоставления ссылки к более идиоматическому ответу. - person Mateen Ulhaq; 08.05.2018
comment
Установите для ярлыков <Ctrl+Tab> и <Ctrl + Shift + Tab ›, чтобы они соответствовали переключению вкладок браузера. - person Tejas Kale; 11.01.2019
comment
Я вижу много статей и мнений, в которых говорится, что вкладки в Vim на самом деле не вкладки, и все же никто не может придумать действительную причину, почему я не могу просто используйте вкладки вместо буферов. Конечно, буферы предназначены для нескольких файлов, а вкладки предназначены для разных макетов. Многие вещи предназначены для одного использования, и пользователи считают, что другое использование более подходит для их рабочего процесса. Что неправильно с использованием вкладок для файлов? - person Bruno Ely; 20.04.2019
comment
Также :tabfind filenam затем <Tab> позволяет вам найти любой файл с файловой системой в нем и открыть его в новой вкладке. Это в сочетании с :set wildmenu довольно приятно. - person Raekkeri; 02.05.2019
comment
Я бы хотел, чтобы люди называли вкладки Vim страницами вкладок. Именно так они называются в :help window и помогают отличать их от вкладок в браузерах и других редакторах кода. Открыть 100+ буферов в Vim легко (и то, что у меня есть ежедневно), по моему опыту, открыть 100+ вкладок в другом редакторе (или 100+ вкладок в Vim) невозможно. - person icc97; 04.07.2019
comment
В терминале Ubuntu ‹Ctrl + Page Up / Down› уже назначено для изменения вкладок Терминала, но ‹Ctrl + Alt + Page Up / Down› работает для изменения вкладок Vim. - person alandplm; 17.09.2019
comment
Я бы посоветовал предпочесть буферы вкладкам. Предлагает намного более простое и удобное переключение IMO. Также не загромождает окна. См. Ответ Себастьяна ниже. - person sid-m; 05.04.2020
comment
Вы также можете перемещать вкладки с помощью команды :tabm! Как :tabm +1, чтобы переместить вкладку на один шаг вперед и т. Д. - person Sam; 19.08.2020

Листинг

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

: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.

person Sébastien RoccaSerra    schedule 10.09.2008
comment
Если вы играете с несколькими буферами, я бы порекомендовал LustyJuggler . - person Arun M; 06.11.2010
comment
Спасибо за очень хороший краткий справочник по командам vim, наиболее часто используемым при работе с несколькими файлами. - person quanticle; 19.03.2011
comment
Или :b#, где # - это индекс файла в буфере, а не только последнее посещение - person Engineer2021; 10.10.2013
comment
:b - очень мощная команда, потому что она может принимать как номера буферов, так и имена буферов в качестве аргументов. Что еще? Он также поддерживает завершение табуляции в любой части имени файла. Скажем, у вас открыт файл foo.txt в буфере 2, вы можете ввести :b 2<Enter>, :b foo.txt или :b oo<Tab><Enter>, чтобы отредактировать этот файл. Да, последний завершит «oo» в «foo.txt», когда вы нажмете ‹Tab›. - person Susam Pal; 01.05.2014
comment
У меня есть эта строка в моем .vimrc: nnoremap gb :ls<cr>:b<space>. Когда я набираю gb в командном режиме, отображаются мои открытые буферы и типы :b , готовые для того, чтобы я начал вводить имя / номер буфера. - person nkorth; 27.02.2015
comment
а при использовании :ball вид разбивается на несколько окон, знаете ли вы, как переключаться с одного на другое? - person Dimitri Kopriwa; 15.10.2015
comment
+1 за использование окон. Если файл ссылается на другой файл, я открываю этот файл в разделенном окне (я продолжаю этот процесс для всех необходимых файлов). Затем я могу быстро просмотреть нужную мне информацию в одном окне, работая в другом окне. Наконец, когда мне больше не нужно смотреть в окно, я убираю его. - person Tom; 18.01.2017
comment
Также стоит отметить, что :b будет принимать совпадение подстроки, если оно однозначно. Поэтому, если у вас есть открытые файлы foo, bar и baz, достаточно :b z, чтобы переключить вас на буфер baz, а :b oo или :b o переведут вас в буфер foo. - person Soren Bjornstad; 05.05.2018
comment
Запустите vim через vim, а не vi, и добавьте set nocompatible hidden в свой .vimrc. В совместимом режиме обработка нескольких буферов ограничена. - person sapanoia; 23.01.2019
comment
@ Том, отличная идея! Для других с настройкой tags используйте :stjump [name], чтобы перейти к [name] и открыть новый буфер с горизонтальным разделением. Это более сложный вариант выполнения g Ctrl-], который переходит к тегу под курсором, но вы можете просто создать <leader> ярлык в .vimrc. Я предпочитаю вертикальное разделение, которое требует сначала создать вертикальное разделение :vsp, а затем перейти в новое разделение с помощью g Ctrl-]. - person icc97; 04.07.2019

:ls

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

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

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

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

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

:mksession! ~/today.ses

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

vim -S ~/today.ses

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

person shyam    schedule 15.09.2008
comment
перейти в определенный буфер: N CTRL- ^ - person Tom Yang; 10.11.2015
comment
@shyam Думаю, я люблю тебя! Почему-то я никогда не знал наверняка о команде mksession, но сегодня совершенно неожиданно решил, что ДОЛЖЕН быть какой-то способ сохранить список файлов, чтобы легко их открывать. Это даже лучше, поскольку кажется, что он даже сохраняет полное состояние вещей (разбиение окон, расположение буферов и т. Д.). Тогда спасибо! - person Kasapo; 15.06.2016
comment
Кроме того, используйте метку ", чтобы перейти к тому месту, где вы были в последний раз в файле. - person Chromium; 28.05.2018

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

:argadd

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

:argdelete

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

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

person MarkB    schedule 10.09.2008
comment
Это действительно ответ на заданный вопрос, хотя, учитывая название, другие ответы совершенно справедливы. - person Soren Bjornstad; 24.04.2016

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

person Andy Whitfield    schedule 10.09.2008

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

Попробуйте выполнить :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, которые содержат то, что вы удалили. Это особенно полезно, если вы хотите повторно использовать текст, который вы ранее удалили.

person Rob Wells    schedule 10.09.2008
comment
Приятно видеть в стороне связанную информацию, например% и #. +1 - person Ashish; 04.03.2015

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

person Konrad Rudolph    schedule 10.09.2008
comment
Спасибо, звучит отлично, но, к сожалению, на сервере установлен только VIM 6.1. - person Edward Tanguay; 10.09.2008
comment
Вкладки очень удобны с подстановочными знаками: vim -p dir/*. Максимальный размер табуляции - 10, но вы можете изменить его в ~/.vimrc настройке tabpagemax на другое значение. - person Campa; 18.06.2013

Такие вещи, как :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/*
person puk    schedule 08.12.2011

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

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

РЕДАКТИРОВАТЬ: Недавно я использовал dyng / ctrlsf.vim для поиска с контекстным представлением (например, Sublime search), и я переключил движок с ag в ripgrep. Производительность выдающаяся.

EDIT2: вместе с CtrlSF вы можете использовать mg979 / vim-visual-multi, вносить изменения сразу в несколько файлов, а затем в конце сохранять их за один раз.

person Petur Subev    schedule 31.03.2016
comment
ctrlp перемещен и теперь находится в ctrlpvim / ctrlp.vim - person Dave; 24.04.2016
comment
ЭТО правильный ответ! Почему не набирает больше голосов? - person Thomas Möbius; 15.07.2016
comment
У него не больше голосов, потому что вопрос был задан в 2008 году. :) - person burnettk; 01.05.2017
comment
точно. Я не могу представить vim в среде разработки без этих плагинов. - person Edgar Alloro; 15.11.2018

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

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

Резюме:

  • Буфер - это текст файла в памяти.
  • Окно - это область просмотра в буфере.
  • Вкладка - это набор окон.
person Andrew    schedule 18.06.2015
comment
Вы получите это резюме, набрав :help window в Vim - person icc97; 04.07.2019

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

  • :b <partial filename><tab> (перейти в буфер)
  • :bw (очистка буфера, удаление буфера)
  • :e <file path> (редактировать, открыть новый буфер>
  • pltags - разрешить переход к определениям подпрограмм / методов
person zigdon    schedule 15.09.2008
comment
350 файлов !!! Это впечатляет. как найти нужный буфер для перехода? Вы когда-нибудь делали шпагат? - person Brian O'Dell; 07.04.2014
comment
@ BrianO'Dell :b <partial filename><tab> плюс set wildmenu в вашем .vimrc хорошо работает, когда у вас открыто множество буферов. Затем вы просто выполняете частичное совпадение и просматриваете те, которые он находит. В других приличных редакторах у вас есть нечеткий поиск, но обычно вы не можете ограничить этот нечеткий поиск только открытыми вами файлами. - person icc97; 01.09.2017

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

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

person dlmeetei    schedule 05.07.2017

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

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

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

person user2179522    schedule 08.07.2013

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

person Max Cantor    schedule 17.09.2008
comment
Мне нравятся эти сопоставления. Также попробуйте Ctrl-H, Ctrl-L. Я устанавливаю Firefox и терминал gnome с одинаковыми сопоставлениями. Очень приятно иметь согласованные сочетания клавиш табуляции. - person cmcginty; 04.07.2009
comment
используйте клавишу лидера вместо ctrl, чтобы не сбивать существующие сопоставления - person aehlke; 10.08.2010

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

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

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

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

  • Отображаются все открытые буферы
  • You can:
    • Type 23 to go to buffer 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'.

person qeatzy    schedule 20.06.2017
comment
Эта великолепная идея! Я много использовал :b и :ls, но независимо. Я думаю, что это становится менее полезным, когда у вас есть буферы, превышающие одну страницу, но тогда вы все равно можете просто вернуться к :b - person icc97; 01.09.2017
comment
Рад видеть, что это помогает. Ваше здоровье! :) - person qeatzy; 01.09.2017
comment
На этой Vim wikia вы можете немного сократить его до nnoremap <leader>f :ls<cr>:b<space>, что может вызвать проблемы с хотя команда 'more' - person icc97; 21.09.2017
comment
Да, этот способ отлично работает, если открыто меньше файлов (обычный вариант использования). set more материал имеет значение только тогда, когда открыто много файлов (более одной страницы), например, vim /usr/include/*, хотя тогда он менее полезен. - person qeatzy; 22.09.2017

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

person indentation    schedule 15.09.2008

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

  1. Используйте буферы, а не «страницы вкладок». Буферы - это та же концепция, что и вкладки почти во всех других редакторах.
  2. Если вам нужен такой же внешний вид вкладок, вы можете использовать плагин vim-airlines с следующий параметр в вашем .vimrc: let g:airline#extensions#tabline#enabled = 1. Это автоматически отображает все буферы в виде заголовков вкладок, если у вас нет открытых страниц вкладок.
  3. Используйте vim-unimpaired Тима Поупа, который дает [ b < / kbd> и ] b для перехода к предыдущему / следующему буферам соответственно (плюс целый ряд других вкусностей)
  4. Имейте set wildmenu в вашем .vimrc, тогда, когда вы наберете :b <file part> + Tab для буфера, вы получите список возможных буферов, которые вы можете использовать стрелки влево / вправо для прокрутки
  5. Используйте плагин Тима Поупа vim-obsession для хранения сеансов, которые хорошо работают с авиакомпанией (у меня был много проблем с сессиями и плагинами)
  6. Воспользуйтесь подключаемым модулем Тима Поупа vim-winegar. Это работает с "родным" :Explore, но значительно упрощает работу. Вы просто набираете -, чтобы открыть проводник, что является тем же ключом, что и переход по каталогу в проводнике. Ускоряет навигацию (однако с fzf я редко использую это)
  7. fzf (который можно установить как плагин vim) также является действительно мощным нечетким Finder, который можно использовать для поиска файлов (и буферов тоже). fzf также очень хорошо работает с fd (более быстрая версия find)
  8. Используйте Ripgrep с vim-ripgrep для поиска по базе кода, а затем вы можете использовать :cdo в результатах для поиска и замены
person icc97    schedule 19.08.2017
comment
fzf и fzf-vim изменили мою жизнь, я не могу этого рекомендовать. Он также очень хорошо работает в Windows, даже в консоли для нечеткого поиска файлов. В Windows используйте бэкэнд ripgrep (rg), который, по моему опыту, превосходит любой другой инструмент find / grep (например, silversearcher или окна по умолчанию обнаруживают, что fzf использует iirc). Вы можете использовать его для поиска по любому списку элементов: самые последние использованные файлы, открытые в данный момент буферы, строки в текущем буфере, строки в кодовой базе (cwd), теги, .. вы можете легко запрограммировать свой собственный нечеткий поиск по списку. Так хорошо! (Я пришел из ctrl-p и никогда не оглядывался назад) - person Emile Vrijdags; 13.03.2019

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

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

введите описание изображения здесь

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

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

person Michael Durrant    schedule 19.01.2014
comment
Мне пришлось смеяться, когда я увидел ваш искусственный пример нескольких окон. Надеюсь, никто так не работает :-) В любом случае я использую tiling wm, что даже лучше (я перешел с tmux на i3wm). Просто чтобы закончить свой ответ. - person lzap; 08.07.2014
comment
Tmux великолепен, и я использовал этот подход долгое время, но он затрудняет навигацию, копирование и вставку между двумя файлами. - person neallred; 19.01.2016
comment
Раньше я делал это, но наличие нескольких буферов vim лучше, когда вам нужно скопировать / вставить - person Titou; 16.11.2017

Для меня и многих других пользователей vim лучший вариант -

  • Откройте файл, используя,

: e имя_файла.расширение

А затем просто Ctrl + 6, чтобы перейти к последнему буферу. Или вы всегда можете нажать

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

  • Делаем вертикальный или горизонтальный разрез с помощью

: vsp для вертикального разделения

: sp для горизонтального разделения

А затем <C-W><C-H/K/L/j>, чтобы изменить рабочий раскол.

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

person LeO    schedule 19.01.2020

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

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

person Jens    schedule 03.07.2014

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

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

person projecktzero    schedule 16.09.2008

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

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

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

person user2663398    schedule 07.01.2014

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

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

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

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

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

nmap <CR> :CtrlPBuffer<CR>

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

person fede1024    schedule 05.12.2015

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

NERDtree

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

Nerdtree

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

vim-plug

Vundle

person thenakulchawla    schedule 03.06.2018

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

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

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

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

person superarts.org    schedule 13.04.2015

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

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

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

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

  4. Если я хочу просмотреть файловую систему, я бы использовал командную строку или внешнюю утилиту (Quicklsilver, Afred и т. Д.), Но чтобы посмотреть на текущую структуру проекта NERD Tree - это классика. Не используйте это вместо 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>
    
person Dionysis    schedule 27.02.2016

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

person Cpt. Senkfuss    schedule 31.05.2013

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

alias vim="vim -p"

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

person npit    schedule 20.10.2017

  1. Чтобы открыть 2 или более файлов с помощью vim, введите: vim -p file1 file2

  2. После этой команды, чтобы перейти к этим файлам, вы можете использовать CTRL + Shift + или , он изменится ваши файлы в vim.

  3. Если вы хотите добавить еще один файл vim и поработать над ним, используйте: :tabnew file3

  4. Также вы можете использовать, который не создаст новую вкладку и откроет файл на экране, разрезая ваш экран: :new file3

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

  6. Чтобы загрузить его, у вас должен быть vim-plug, поэтому для загрузки других подключаемых модулей также NERDTree, чтобы ввести эти команды в свой ~/.vimrc.

    let data_dir = has('nvim') ? stdpath('data') . '/site' : '~/.vim'
    if empty(glob(data_dir . '/autoload/plug.vim'))
      silent execute '!curl -fLo '.data_dir.'/autoload/plug.vim --create-dirs 
      https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
      autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
    endif

    call plug#begin('~/.vim/plugged')
    Plug 'scrooloose/nerdtree'
    call plug#end()
  1. Затем сохраните .vimrc с помощью команды :wq, вернитесь к нему и введите: :PlugInstall

После этого плагины будут установлены, и вы сможете использовать NERDTree с другими плагинами.

person Aram Simonyan    schedule 30.03.2021