在VIM中在不同的分割窗口中打开文件

12

我有一个包含 4 个文件夹路径的数组 $somePaths。我想在 VIM 中打开这些文件夹中的一些文件。下面的命令将它们打开到选项卡中。

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

实际上,我希望在拆分的窗口中(类似十字形)查看这些文件。如何操作?

4个回答

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

谢谢。能否传递文件列表以使用此布局打开它? - Loom

4

Vim有:vertical命令,这在你的情况下可能很有用。试试这个:

vim +'vertical all' [your file list]

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

在水平分割窗口方面不是非常灵活(分割线是水平的,选项卡是垂直的),但对于入门来说非常好,并且根据您的屏幕尺寸适当。 - Zelphir Kaltstahl

2
上面发布的接受的解决方案是好的,并且可以解决您的用例,但是我想指出一种替代方法,可以在不需要太多努力或配置的情况下实现类似的功能。

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会保持其更新。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接