Предположим, у меня есть произвольная схема разбиения в vim.
____________________
| one | two |
| | |
| |______|
| | three|
| | |
|___________|______|
Есть ли способ поменяться one
и two
и поддерживать тот же макет? В этом примере все просто, но я ищу решение, которое поможет для более сложных макетов.
ОБНОВИТЬ:
Я думаю, мне следует быть более ясным. Мой предыдущий пример был упрощением фактического варианта использования. С фактическим экземпляром:
Как я мог поменять местами любые два из этих разделений, сохраняя тот же макет?
Обновить! 3+ года спустя ...
Я поместил решение sgriffin в плагин Vim, который вы можете легко установить! Установите его с вашим любимым менеджером плагинов и попробуйте: WindowSwap.vim
Ответы:
Немного опоздал на пост, но наткнулся на этот поиск чего-то другого. Некоторое время назад я написал две функции, чтобы пометить окно, а затем поменять местами буферы между окнами. Кажется, это то, что вы просите.
Просто добавьте их в свой .vimrc и отобразите функции так, как считаете нужным:
Чтобы использовать (при условии, что ваш mapleader установлен в \), вы должны:
Вуаля! Поменяйте местами буферы, не портя расположение окон!
источник
noremap
в сопоставлениях, чтобы это работало. Не уверен, почему, но, надеюсь, это поможет любому, кто найдет это позже. : D0r!figlet one
[два, три, и т. Д.], А затем протестировал его. Прежде чем идти дальше, я проверил github, нашел ваш (wes ') плагин, с анимированными перестановками окон с примерами и ссылкой на этот же ответ (который я получил в качестве комментария в моем .vimrc). Я чувствовал, что я уже сделал и загрузил это, и затем забыл об этом. Во всяком случае, хорошая работа! Спасает меня некоторая работа :)Начиная с этого:
Сделайте «три» активным окном, затем выполните команду ctrl+ w J. Это перемещает текущее окно, чтобы заполнить нижнюю часть экрана, оставляя вас с:
Теперь сделайте активным окно «один» или «два», затем введите команду ctrl+ w r. Это «вращает» окна в текущем ряду, оставляя вас с:
Теперь сделайте «два» активным окном и введите команду ctrl+ w H. Это перемещает текущее окно, чтобы заполнить левую часть экрана, оставляя вас с:
Как вы можете видеть, маневр немного перемешан. С 3 окнами, это немного похоже на одну из тех головоломок с «плиткой». Я не рекомендую пробовать это, если у вас есть 4 или более окон - вам лучше закрыть их, а затем снова открыть в нужных позициях.
Я сделал скринкаст, демонстрирующий, как работать с разделенными окнами в Vim .
источник
ctrl-w r
работает как шарм. Спасибо вам за совет! Вот мой +1.\mw
/\pw
и этот и пытался использовать оба в течение недели каждый. Я обнаружил, что использование этого «нативного» решения работает лучше всего, так как мне не нужно постоянно устанавливать плагины во время установки дюжины дюжин, которые у меня есть, на серверах и удаленных компьютерах и настольных компьютерах, ноутбуках, планшетах и всех других устройствах. Итак, изучение этих нативных команд (напримерctrl-w r
) - это действительно все, что вам нужно, чтобы посвятить себя мышечной памяти и все, что нужно.Посмотрите на
:h ctrl-w_ctrl-x
и / или:h ctrl-w_ctrl-r
. Эти команды позволяют вам менять или поворачивать окна в текущем макете.Изменить: На самом деле, это не будет работать в этой ситуации, потому что это только поменяется местами в текущем столбце или строке. Вместо этого вы можете перейти к каждому из окон и выбрать целевой буфер, но это довольно многословно.
источник
Рэнди прав в том,
CTRL-W x
что не хочет менять окна, которые не находятся в одном столбце / строке.Я обнаружил, что
CTRL-W HJKL
ключи наиболее полезны при работе с окнами. Они вынудят ваше текущее окно из его текущего местоположения и скажут ему занять весь край, указанный направлением нажатой клавиши. Смотрите:help window-moving
для более подробной информации.Для вашего примера выше, если вы запускаете в окне «один», это делает то, что вы хотите:
Для удобства вы можете назначить последовательности, которые вам нужны, для сопоставления клавиш (см.
:help mapping
).источник
У меня есть немного улучшенная версия решения sgriffin, вы можете менять окна, не используя две команды, но с интуитивно понятными командами HJKL.
Вот как это происходит:
Попробуйте переместить ваше окно, используя заглавную HJKL в обычном узле, это действительно круто :)
источник
Здание сильно на @ sgriffin отвечают, вот кое - что еще ближе к тому , что вы просите:
Пожалуйста, дайте мне знать, если поведение не соответствует вашим ожиданиям.
источник
Также на основе решения sgriffin, перейдите к окну, которое вы хотите поменять, нажмите
CTRL-w m
, перейдите к окну, с которым вы хотите поменяться, и нажмитеCTRL-w m
снова.CTRL-w m
это плохой мнемонический выбор, поэтому, если кто-нибудь придумает лучший, пожалуйста, отредактируйте его.Кроме того, я хотел бы получить отзыв от скрипта, также известного как «Окно помечено. Пожалуйста, повторите на цели», но, будучи нубом vimscript, я не знаю, как это сделать.
Все, что сказал, скрипт работает хорошо, как есть
источник
Следующий подход может быть удобен, если функции по какой-то причине недоступны (например, это не ваш vim).
Используйте
:buffers
команду, чтобы узнать идентификаторы открытых буферов, перейдите к нужному окну и используйте команду как:b 5
открыть буфер (в данном случае буфер № 5). Повторите два раза, и содержимое окон поменяется местами.Я «изобрел» этот метод после нескольких попыток запомнить
ctrl-w-something
последовательности даже для очень простых макетов, таких как «один-два-три» в исходном вопросе.источник
Действительно остывать, но мое предложение для отображения является использование ^ W ^ J вместо J (потому что все HJKL уже имеют значение), а также и я бы тянуть в новом буфере, потому что к тому времени , когда вы хотите поменять местами вокруг вас вероятно, не хотите продолжать редактировать буфер, в котором вы уже находитесь. Поехали:
источник
Все вышеприведенные ответы хороши, к сожалению, эти решения не работают в сочетании с окнами QuickFix или LocationList (я столкнулся с этой проблемой, пытаясь заставить буфер сообщений об ошибках Ale работать с этим).
Решение
Поэтому я добавил дополнительную строку кода, чтобы закрыть все эти окна перед выполнением перестановки.
exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'
Общий код выглядит так;
Кредиты на обменную функцию Брэндону Ортеру
Зачем это нужно
Причина, по которой функции подкачки не работают должным образом без удаления сначала всех окон QuickFix (QF) и LocationList (LL), заключается в том, что если родитель QF / LL буферизирует get, то скрытый (и нигде не показанный в окне), QF / Окно LL, связанное с ним, удаляется. Само по себе это не проблема, но когда окно скрывается, все номера окон переназначаются, а своп перепутывается, поскольку сохраненный номер первого отмеченного окна (потенциально) больше не существует.
Чтобы поставить это в перспективе:
Первая отметка окна
Отметка второго окна
Первый переключатель буфера, первое окно заполняется буфером третьего окна. Таким образом, окно QF удаляется, так как у него больше нет родительского окна. Это переставляет номера окон. Обратите внимание, что curNum (номер второго выбранного окна) указывает на окно, которое больше не существует.
Поэтому при переключении второго буфера он пытается выбрать окно curNum, которого больше не существует. Таким образом, он создает его и переключает буфер, что приводит к открытию еще одного нежелательного окна.
источник
Подобный подход mark-window-then-swap-buffer, но также позволяет повторно использовать последний обмен.
источник
set hidden
в .vimrc, нет необходимости вручную скрывать буферы.Вы также можете использовать менеджер окон, как X-monad
источник