Открыть файлы в разных разделенных окнах в 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 сохранит его.