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



我有一些$somePaths数组的4个文件夹。我想在VIM中打开这个文件夹中的一些文件。下面的命令以制表符的形式打开它们。

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

实际上,我想让这些文件在分割窗口(十字形)。怎样才能做到呢?

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

vim有:vertical命令,这在您的情况下可能很有用。试试吧:

vim +'vertical all' [your file list]

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

上面发布的公认的解决方案很好,并且解决了您的用例,但是我想指出一种不需要太多努力或配置就能实现类似功能的替代方法。

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

最新更新