Переместить существующее окно на существующую вкладку

14

Иногда мне нужно переместить окна в уже существующую вкладку, и мне было интересно, есть ли комбинация клавиш / клавиш, которая могла бы сделать это. Я знаю, что могу закрыть окно, переключиться на вкладку, а затем открыть ее в новом разделе, но мне было интересно, есть ли более короткий способ сделать это. Обратите внимание, что я хочу переместить его на существующую вкладку, а не на новую вкладку, как это <C-w>Tделается.

Вечнозеленое дерево
источник
Невозможно перемещать окна по вкладкам.
lcd047
Хм, это очень плохо. Я мог бы, вероятно, создать какое-то отображение или команду, которая могла бы выполнить это все же.
EvergreenTree
Я думаю, что лучшее, что вы можете сделать, это сохранить все настройки окна, а затем воссоздать его на существующей вкладке.
Tommcdo

Ответы:

10

Хотя есть команды для перемещения существующих окон на текущей вкладке (т. Е. Для изменения расположения окна путем поворота, изменения размера и перемещения), нет команд для перемещения окна на другую вкладку.

Поскольку окно - это просто окно просмотра в загруженном буфере, вам необходимо:

  1. Обратите внимание на номер буфера, отображаемый в текущем окне.
  2. :close! окно.
  3. Переключитесь на существующую целевую вкладку.
  4. :sbuffer номер буфера, чтобы снова открыть его.

Вы потеряете любые специфичные для окна опции. Вы также можете сохранить и восстановить их в скрипте.

Инго Каркат
источник
Я понял, что это так. Я мог бы, вероятно, сделать небольшой сценарий, который делает именно это.
EvergreenTree
2
  1. перейти на существующую целевую вкладку
  2. разбить его, как вы хотите
  3. :b ab(вкладка завершить остальное)

abпросто случайные буквы, замените начало нужного вам имени файла. :bЗавершение табуляции очень хорошо для меня, оно обычно может найти правильный исходный буфер на основе только одной буквы и 1-2 Tabнажатий клавиш.

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

lkraav
источник
2

Две команды, определенные ниже, перемещают все буферы с правой вкладки на текущую вкладку, а затем закрывают правую вкладку. Mtabspперемещает их путем разделения по горизонтали и Mtabvspразделения по вертикали. Вам необходимо переместить объединенную вкладку перед использованием команд. Используйте +tabm, -tabmили <n>tabm.

Настроить

Добавьте приведенный ниже скрипт vim к себе vimrc:

function! Mtab(vert)
    if tabpagenr() == tabpagenr("$")
        return 0
    endif
    +tabnext
    let s:killed_tab = tabpagenr()
    let s:buf_list = tabpagebuflist()
    -tabnext
    for item in s:buf_list
        if a:vert
            vsp
        else
            sp
        endif
        execute "buf " . item
    endfor
    execute "tabclose " . s:killed_tab
endfunction

command! Mtabsp call Mtab(0)
command! Mtabvsp call Mtab(1)

Технические детали

Функция Mtab получает один параметр vert. Он определяет, будет ли текущая вкладка разделена по горизонтали или вертикали.

Желаемый результат достигается с помощью следующих шагов:

  1. Переходим на следующую вкладку временно
  2. Используйте две переменные для ссылки на номер вкладки и буферы
  3. Вернуться на текущую вкладку
  4. Разбиваем вкладку и открываем каждый буфер
  5. Наконец, мы закрываем правую вкладку

Если наша текущая вкладка является последней, команды игнорируются.

EVPO
источник
1

Если это файловый буфер (не работает для чистых буферов и т. Д.), Вы можете:

  1. :let @f=@%ENTER - в исходном окне;
    • Это заменяет содержимое обычного регистра f содержимым специального регистра % , который содержит текущее имя файла.
    • Примечание: я выбрал регистр f как в файле , но вы можете использовать любой другой регистр, который вам нравится.
    • Вы можете проверить, что регистр содержит правильный путь с помощью: :echo @f
  2. Опционально: Ctrl-WCtrl-Q- закрыть старое окно;
  3. gt/ gT- перейти к целевой вкладке (и окну);
  4. Ctrl-Ws - разделите вкладку на свое усмотрение, чтобы открыть новое окно;
  5. :e␣Ctrl-RfENTER
    • в открывшемся окне загружает файл с пути, хранящегося в регистре f ;
    • Примечание: здесь символ marks обозначает обычный пробел.

Важное примечание: последний шаг не будет работать правильно, если путь содержит пробелы или некоторые специальные символы! :-( В качестве обходного пути следующая, немного более длинная команда должна работать для путей с пробелами (хотя она может все еще не работать для некоторых других специальных символов):

  • :e␣"Ctrl-Rf"ENTER

(то есть, цитируя результат Ctrl-R, f )

Вдохновлен ответами от Икраав и Инго-Каркат .

akavel
источник
Это фантастика, мне нужно настроить отображение «вырезать и вставить» Windows во вкладки.
dragon788