【发布时间】:2014-05-08 02:58:56
【问题描述】:
我有一些$somePaths 4 个文件夹的数组。我想在 VIM 中打开这个文件夹中的一些文件。以下将在选项卡中打开它们。
vim -p `for i in ${somePaths[@];}; do echo $i/src/main.cpp; done`
实际上,我希望将这些文件放在拆分窗口中(十字形)。怎么做?
【问题讨论】:
我有一些$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 中有这个 sn-p:
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 会保持更新。
【讨论】: