Как я могу открыть несколько вкладок одновременно?

14

Если я использую:

:tabedit file1 file2

Я получил:

E172: Only one file name allowed

Есть ли способ использовать :tabeditнесколько имен файлов? Или другой способ открыть несколько вкладок одновременно?

Мартин Турной
источник
@kenorb Да. И у него уже точно такой же ответ, но без объяснения того, что он делает. Так как же ссылка на него добавляет ценность?
Мартин Турной
Есть некоторые другие ответы, и новые ответы могут прийти туда. Во-вторых, там есть несколько других похожих / связанных друг с другом, так что пользователи также могут больше узнать о них.
Кенорб
Я выучил этот однострочник :args *.c | tab all. Другой вопрос более популярен, чем этот, так что хорошо бы связать его.
Кенорб
Связанный: Откройте несколько файлов в новых вкладках с VIM в переполнении стека.
Михай Капотэ

Ответы:

10

Учитывая проблемы и сложность моего другого ответа с использованием «встроенного» способа путем изменения списка аргументов, я добавил собственную небольшую функцию для этого:

" Open multiple tabs at once
fun! OpenMultipleTabs(pattern_list)
    for p in a:pattern_list
        for c in glob(l:p, 0, 1)
            execute 'tabedit ' . l:c
        endfor
    endfor
endfun

command! -bar -bang -nargs=+ -complete=file Tabedit call OpenMultipleTabs([<f-args>])

Теперь вы можете использовать :Tabedit *.vim. Эта функция расширит все шаблоны сглаживания и выполнит :tabedit <f>для каждого файла. Вы можете добавить столько путей, сколько хотите, например, все это работает:

:Tabedit file.rb
:Tabedit *.c
:Tabedit file1.py file2.py _*.py
:Tabedit /etc/hosts file{1,2}.sh

Ну и так далее ...

Я положил это в небольшой globedit.vim плагин, который также содержит команды для :Edit, :Splitи т.д.

Мартин Турной
источник
2
Отличная функция и команда! Некоторые улучшения: (1) Используйте [<f-args>]вместо "<args>"- таким образом, patternпараметр будет List (массив), и вам не придется разбивать строку вручную. (2) Передайте ненулевое значение в качестве третьего аргумента, чтобы glob()он возвращал список. Тогда вы также можете избежать ручного разделения. Вам нужно будет пройти в 0качестве второго аргумента , чтобы пропустить его , не влияя на поведение: glob(l:p, 0, 1).
Tommcdo
7

Насколько я знаю, единственный встроенный способ сделать это:

:args *.vim
:tab all

Во-первых, :argsзаменит список аргументов. В списке аргументов перечислены файлы, с которыми вы открыли Vim; так vim file1 file2означает , что список аргументов содержит file1и file2.
Мы можем изменить это во время выполнения, и Vim откроет буфер для каждой новой записи в списке аргументов.
Смотрите :help argument-listдля получения дополнительной информации.

Команда :allоткрывает окно для каждой записи в списке аргументов, :tabкоманда выполняет команду и открывает новую вкладку, когда данная команда откроет новое окно.

Предостережения

Есть некоторые оговорки к этому методу.

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

Но самая большая проблема заключается в том, что он заменяет все ваши вкладки тем, что есть в списке аргументов; так что вы потеряли все существующие вкладки.
Вы можете немного обойти это, используя :argadd *.vimдля добавления в список аргументов вместо его замены; но команда , такие как :editили :tabeditже не изменить список аргументов, и вы потеряете эти вкладки , если не добавить их в список аргументов (вы до сих пор их в списке буферов, хотя). Вы также можете не захотеть открывать все в вашем списке аргументов на вкладке, возможно, вы просто хотите открыть 2 файла в качестве дополнительной вкладки.

Возможно, вы могли бы сделать это немного лучше, добавив сначала все открытые в настоящее время вкладки в список аргументов (что я не могу заставить работать), но это все еще далеко от совершенства. Если вкладка имеет 2 или более окон, она все равно изменит их ...

Мартин Турной
источник
Я могу ошибаться, но разве это не открывает дополнительную вкладку (как видно из моего вопроса об открытии вкладок по умолчанию)?
Муру
1
Если вы ссылаетесь на мой ответ на этот вопрос, то разница в том, что я использовал :argdo tabedit %, что открывает новую вкладку для каждого аргумента. Начиная с одной вкладки и открывая n новых, вы, естественно, оставите n + 1 вкладок. :tab allэто гораздо лучшее решение.
Tommcdo
@ tommcdo Я говорил об ответе Джоша Петри . Вы не случитесь с одним из его псевдонимов, не так ли? :)
Muru
Ха-ха, нет. Должно быть, я думал о другом вопросе!
Tommcdo
2

:nextВместо этого вы можете использовать команду, например:

:n file1 file2

или:

:n *.txt
kenorb
источник
Это похоже на использование :args *.vim? По крайней мере, он ведет себя так же, и :help next_fдокументирует это как то же самое ...
Мартин Турной
Это короче и проще, и вы не упомянули об этом. Поведение такое же, как вы задали в этом вопросе.
Кенорб
2

Из командной строки вы можете использовать:

vim file1 ... filen -p

И если вы забыли использовать -pеще вы можете использовать

:tab ball

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

dsueiro
источник
0

На самом деле вы можете открывать новые вкладки и сохранять свои текущие вкладки без написания новых функций (см. Этот ответ по переполнению стека ):

:args file1 file2 | argdo tabe

Вы можете открыть новую пустую вкладку ( :tabe), прежде чем сделать это, потому что первый файл откроется в текущей вкладке. Кроме того, дополнительная пустая вкладка будет оставлена ​​открытой (см., :help argdoЧтобы понять, почему).

Михай Капотэ
источник
Вам также необходимо исправить подсветку синтаксиса (по какой-то причине), как описано в ссылке, и закрыть последнюю вкладку, чтобы команда «full» была такой: :tabnew | args file1 file2 | argdo tabe | tabdo syntax onвам нужно нажать Enter, чтобы очистить приглашение, и набрать, :closeчтобы удалить последнее ( пустой) вкладка ... это очень много печатать, и оно того стоит, если вы открываете много вкладок (для 2 или 3 файлов, просто :tabeдважды использовать было бы быстрее).
Мартин Турной