问题 在VIM中的不同拆分窗口中打开文件


我有一些 $somePaths 4个文件夹的数组。我想在VIM中打开这个文件夹中的一些文件。以下内容在选项卡中打开它们。

vim -p `for i in ${somePaths[@];}; do echo $i/src/main.cpp; done`

实际上我想将这些文件放在拆分窗口(十字架)中。怎么做?


11517
2018-03-28 15:00


起源



答案:


除了 -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

5
2018-03-28 15:28



谢谢。是否可以传递文件列表以使用此布局打开它? - Loom
是的,看我的编辑。 - Ingo Karkat


答案:


除了 -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

5
2018-03-28 15:28



谢谢。是否可以传递文件列表以使用此布局打开它? - Loom
是的,看我的编辑。 - Ingo Karkat


vim有 :vertical 命令,这可能对您的情况有用。尝试一下:

vim +'vertical all' [your file list]

4
2018-03-28 15:23





你可以尝试使用 -O4 代替 -p


3
2018-03-28 15:21



在水平分割窗口时(分割线是水平的,标签是垂直的),不是很灵活,但是对于开始并且取决于您的屏幕尺寸是合适的。 - Zelphir


上面公布的公认解决方案很好并且解决了您的使用案例,但是我想指出另一种方法来实现类似的东西而不需要太多努力或配置。

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##*/} "$@"
  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,但它会表现得像您期望的那样,并且不会担心会话。

这样,我现在可以在任何目录中启动vim,并且在我第一次这样做时,它将开始记录新会话,而在后续调用中,它将加载该会话并且 tpope/vim-obsession 保持更新。


2
2018-04-02 16:55