Открыть файлы в разных разделенных окнах в VIM
У меня есть несколько $somePaths
массивов из 4 папок. Я хочу открыть некоторые файлы из этих папок в VIM. После этого откроется вкладка.
vim -p `for i in ${somePaths[@];}; do echo $i/src/main.cpp; done`
На самом деле я хотел бы иметь эти файлы в разделенных окнах (cross-like). Как это можно сделать?
Ответы
Ответ 1
Помимо -p
, Vim также предлагает аргументы командной строки -o
и -o
для горизонтальных/вертикальных расщеплений. К сожалению, их нельзя смешивать. Чтобы создать собственный собственный макет окна, вы должны передать явные команды размещения окна через -c
. Этот пример
$ vim 1 -c 'bel vsplit 2' -c '1wincmd w' -c 'bel split 3' -c '3wincmd w' -c 'bel split 4'
создает макет, который выглядит так:
+-----------+-----------+
| | |
| | |
| | |
|1 |2 |
+-----------+-----------+
| | |
| | |
| | |
|3 |4 |
+-----------+-----------+
Чтобы сохранить список файлов в виде одного блока, вы можете использовать тот факт, что номера буферов монотонно возрастают и ссылаются на номера буфера в команде:
$ vim -c 'bel vert sbuf 2' -c '1wincmd w' -c 'bel sbuf 3' -c '3wincmd w' -c 'bel sbuf 4' a b c d
Ответ 2
vim имеет команду :vertical
, которая может быть полезна в вашем случае. попробуйте:
vim +'vertical all' [your file list]
Ответ 3
Вы можете использовать -O4
вместо -p
.
Ответ 4
Принятое решение, опубликованное выше, является хорошим и решает ваш вариант использования, однако я хотел бы указать на альтернативный способ достижения чего-то подобного без особых усилий или конфигурации.
VIM имеет встроенную поддержку сеансов записи, :h :mksession
, то, что вы можете сделать, это сохранить текущий сеанс vim (открыть файлы, расщепления, вкладки, окна и т.д., в зависимости от значения :h 'sessionoptions'
. и поддерживающие сеансы могут быть немного утомительными, я бы предложил использовать либо xolox/vim-session
(я использовал его ранее), либо tpope/vim-obsession
(используйте его сейчас). Это позволит вам повторно открыть сеанс точно так же, как и вы остановились!
Вот что я делаю, у меня есть этот фрагмент в моей ~/.zshrc:
function vim() {
tmux rename-window "vim - ${PWD##*/}"
if test $# -gt 0; then
env vim --servername ${PWD##*/} "[email protected]"
elif test -f ~/.vim/sessions/${PWD##*/}.vim; then
env vim --servername ${PWD##*/} -S ~/.vim/sessions/${PWD##*/}.vim
else
env vim --servername ${PWD##*/} -c Obsession\ ~/.vim/sessions/${PWD##*/}.vim
fi
}
В основном это проверка, если vim запущен, так как он без аргументов, и проверяет, существует ли сеанс и загружает его, или с помощью tpope/vim-obsession
начинает запись нового сеанса, который будет загружен при следующем открытии ВИМ. Имя сеанса - это просто имя каталога, в котором вы запускаете vim. Если вы передадите какие-либо аргументы vim, он будет вести себя так, как вы ожидали, и не беспокоиться о сеансах.
Таким образом, теперь я могу просто запустить vim в любом каталоге, и в первый раз я это сделаю, он начнет запись нового сеанса, тогда как при последующих вызовах он загрузит этот сеанс, а tpope/vim-obsession
сохранит его.