Как мне отредактировать существующий буфер в новой вкладке в vim?


51

Предположим, я начал vim так:

vim foo bar

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


Многие из вас, вероятно, ищут, tabe %что упомянуто в ответе liuyang1 ниже.
Матеуш Пиотровский,

1
@MateuszPiotrowski Как я уже упоминал в этом комментарии к этому ответу , :tabe %он не работает с буферами, которые не имеют допустимого пути к файлу. :tab sbработает каждый раз.
JoL

Ответы:


30

Когда вы запускаете vim таким образом, вы не получаете клиента vim, текстовый редактор использует приглашение терминала или cmd - два файла находятся в двух разных буферах. Используйте :lsдля перечисления буферов:

:ls
  1 %a   "foo"                 line 6
  2      "bar"             line 0

% A является активным буфером. Вы можете использовать :b2для переключения в буфер 2 или использовать для перехода к :bnследующему или :bpдля предыдущего. Я предпочитаю (CTRL-W v) разделять окна по вертикали, а не (CTRL-W s), которая разделяется по горизонтали.

Если у вас загружено 2 файла и нет вкладок (пока), вы можете, :tabnewи в новой вкладке введите:b2

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


Да, но я хочу иметь вкладки.
InnaM

Итак, вы уже запустили vim таким образом, что ваши файлы хранятся в клиенте vim, а не в оболочке cmd / терминала?
DaveParillo

1
Я не уверен, что ты имеешь в виду. Я использую оболочку для запуска vim, как описано выше, а затем у меня работает vim.
InnaM

Ах! Наверное, я никогда не понимал, что буферы не являются локальными для вкладок. Я всегда думал (не особо задумываясь), что каждая вкладка имеет свой список буферов.
InnaM

На моей машине vimзапустит редактор внутри оболочки. Чтобы получить графический интерфейс пользователя VIM, я должен использовать gvim. И вы правы - буферы являются глобальными для приложения vim.
DaveParillo

47

Вы хотите открыть буфер в новой вкладке?

Разделите экран (Ctrl-W s), откройте окно и нажмите Ctrl-W T


Хм. Не совсем то, что я имел в виду, но для начала неплохо. Я еще не знал о Ctrl-w T. Конечно, на первой вкладке все равно будет два буфера.
InnaM

Нет. После того, как вы разделите экран на два окна и откроете одно из них на новой вкладке, он уходит с первой вкладки. Это не останется (по крайней мере, на моем gvim72). Что касается буферов, они не связаны с окнами / вкладками ... они больше похожи на память, где vim хранит содержимое файла.
Ладья

Ах! Вы правы. Я неверно истолковал вывод :ls.
InnaM

Кроме того, Ctrl-W V разбивает окно по вертикали.
Шеннон Нельсон

1
CTRL-w v - правильная команда для разделения окон по вертикали
JRM

27

Вы можете сделать это, комбинируя tabкоманду с sb[uffer]командой.

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

:ls
  1 %a   "foo"                          line 1
  2      "bar"                          line 0

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

:tab sb 2

Команда sbобычно открывает данный буфер в новом разделенном окне, но tabвместо этого команда открывает его в новой вкладке.

Команда tabтакже позволяет указать, где в списке вкладок должна быть создана новая вкладка. Например, :0tab sb 2новая вкладка «Панель» появится в начале списка, а не после текущей вкладки.


2
Вам не нужен номер буфера, дайте ему однозначную часть имени буфера, а VIM сделает все остальное за вас.
десерт

1
Это был ответ, который я искал и нуждался в этом. Я был встревожен, когда :tab buffer part-of-nameне открывал новую вкладку! Но :tab sb part-of-nameработал как шарм. Спасибо!!!!
Суким

Это не точный вопрос ОП, но это было именно то, что я искал :)
jackcogdill

25

Лучший способ выполнить то, о чем просил OP, это:

:bufdo tab split

Это откроет каждый буфер в отдельной вкладке, независимо от того, сколько их. Если вы используете это много, это легко сделать в вашем .vimrc. В сочетании с чем-то вроде этого маленького плагина vim, следующий элемент откроет каждый элемент из :grep(или : Ack ) на собственной вкладке:

:grep foo
:QuickFixOpenAll
:bufdo tab split

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

ОБНОВЛЕНИЕ : я действительно должен дать комментарий к комментарию ggustafsson ниже. Это , несомненно , лучший ответ на много и красиво иллюстрирует тенденцию Vim в стороне композиционного поведения. Предложение таково:

 :tab sball

Стоит посмотреть справку Vim для : tab и : sball, чтобы увидеть, что здесь происходит.


Аналогичный подход из предыдущего редактирования для потомков :bufdo execute "tabnew %". Я думаю, что новый подход немного яснее.
Джон Уитли

Одно предостережение: если начальный буфер в vim не пуст, это, кажется, открывает последний буфер дважды. Я выложу обновление, если найду простое исправление.
Джон Уитли

12
:tab sballкажется, работает лучше.
ggustafsson

6

1. Откройте два файла в Vim.

$ vim foo bar

2. Проверьте количество буферов.

: Ls
  1% "фу"
  2 "бар"

3. Цепочка двух команд: tabnewоткрыть новую вкладку и b <buffer_number>загрузить нужный буфер во вкладку.

: tabnew | Би 2

8
Проблема с шагом 3 состоит в том, что он сначала создает новую вкладку с пустым буфером, а затем открывает буфер 2, в результате чего в списке буферов появляется дополнительный безымянный буфер. Лучше использовать:tab sb 2
rkjnsn

1
@rkjnsn, вы должны опубликовать это как ответ - он лучше всего отвечает на вопрос 'как мне отредактировать существующий буфер в новой вкладке в vim?'
JonnyRaa

1
@JonnyLeeds сделано.
rkjnsn

4

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

  • текущее окно на новую вкладку

Если есть несколько окон, <C-W>Tпереместите это окно на новую вкладку. Однако этот ярлык только для «Окна», а не для «буфера». Если вы предпочитаете этот стиль :spили <C-W>sдублируете текущий буфер на еще одно окно, то <C-W>Tпереместите его на новую вкладку.

4 нажатия клавиш или 7 нажатий клавиш.

  • текущий буфер для новой вкладки

:tabe % открыть новую вкладку для текущего буфера.

7 нажатий клавиш.

  • буфер для новой вкладки

Если использовать плагин CtrlP, также можно использовать «CtrlPBuffer», а затем с помощью <C-t>ярлыка, чтобы открыть его с новой вкладкой страницы. Этот стиль легко переключается на разные буферы.

С сочетанием клавиш CtrlPBuffer, 4 нажатия клавиш или более.


:tabe %это то, что я давно искал, спасибо!
pevik

Нет, на :tabe %самом деле не открывается новая вкладка для текущего буфера. Что происходит, так это то, что он %раскрывается до :tabeпути к файлу текущего буфера и открывает этот путь. Vim увидит, что вы пытаетесь открыть файл, который у вас уже открыт, и повторно использует буфер, который у вас есть. Это означает, что это не работает с буферами, которые не имеют пути к файлу. Если вы открываете новый файл с помощью :newи не сохранили его, вы не сможете поместить его на новую вкладку с этим. Реальная команда, которая вам нужна, - это то, что rkjnsn вставил в ответ: :tab sb %или короче::tab sb
JoL
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.