分裂在Vim管理

时间:2013-08-16 18:20:34

标签: vim macvim

在一个大中型项目上工作我经常会在屏幕上看到很多分割,以及打开的几个标签,每个标签分为5-6个分割。通常我会为不同的目录和逻辑工作区使用不同的选项卡,将功能A上的工作与功能B上的工作或错误C和我的注释分开。

enter image description here

当您从NERDTree,Fugitive,Gundo等插件中获得大量额外拆分时,管理这种疯狂会成为一个问题。在这种辅助分割打开和关闭之后,整个设置的高度和宽度变化都会发生变化。我的意思是,有些窗户变得很小,有些窗户变得比最初大(我手动调整它们的高度和宽度与CTRL+W >CTRL+W <和朋友。

通常用鼠标调整每个分割的速度更快,但它甚至不接近Vim方式。

有时我甚至想要交换一些分裂或向右移动。 CTRL+W HJKL并不总是有帮助,因为它们会使分裂过度并且再次扭曲尺寸。轮换CTRL+W r仅适用于简单情况。

如何管理大量缓冲区,拆分和标签?

编辑:我看到有结果投票。这个问题对你来说似乎太笼统了,所以有一个更具体的问题:使用大量缓冲区和拆分的好工作流程是什么? (其中一个答案是在需要更多空间时促进拆分以分离标签)

4 个答案:

答案 0 :(得分:13)

我只在我真正需要并排放置两个文件时使用拆分(因为一个用作参考,通常是HTML-CSS)。否则,我只使用在单个窗口中加载的常规缓冲区。我也不使用nerdtree或任何会占用太多空间的东西。

我尽量避免在文件之间导航:标签是一种更好的方式。

我的vim几乎总是一个大的灰色矩形。

修改

处理多个“事物”一直是一个难以解决的问题。当我们试图在同一时间和同一空间中处理许多“事物”时更是如此。这是一个难题,因为我们无法同时处理多个事情:我们的思想并未针对此进行优化。这就是为什么记忆游戏并不像它看起来那么容易,为什么我们在Powerpoint幻灯片显示完整的列表和图表以及为什么人们用一只手机和另一只手中的驱动轮死亡之后就不记得狗屎。

因为我们不能同时在4个缓冲区上工作,所以应该将分割窗口保留给在一个窗口中完成实际工作而另一个窗口用于参考的情况(文档,做CSS时的HTML文档...)或反馈(linting,计算结果......)。在这样的设置中,切换到另一个窗口的身体的唯一部分是我们的眼睛:我们不需要键盘快捷键或鼠标。

但我们喜欢让生活变得更加复杂。我们喜欢把自己想象成多任务的神,所以我们分开窗户,我们把窗户放在窗户的窗户里,我们必须找到脆弱的黑客来管理所有的混乱。由于各种原因键盘快捷键不是有效的解决方案,我们讨厌鼠标,对吧?

无论如何,拆分窗口的基本问题与常规缓冲区和标签相同:为了处理缓冲区#3,我们必须切换到缓冲区#3。缓冲区#3是隐藏的,显示在右上方窗口还是另一个选项卡中是无关紧要的,我们必须按几个键才能到达它。当目标缓冲区被隐藏时,我们会:b3来显示它。当它位于右上角窗口时,我们使用<C-w>…映射,默认或自定义。当它在另一个标签中时,我们倾向于gt直到我们找到它(或:sb3更聪明)。无论我们选择哪种空间设置,我们仍然必须切换到目标。

仅涉及您正在使用的布局类型的问题是您必须在二维中思考和移动。从左下方窗口跳到右上方窗口并不是线性的(除非你使用<C-w>w)并且需要更多的思考和输入,而不仅仅是看一下那个窗口。

另一个问题是工作空间是如何划分的,以及它对你可以处理的缓冲区数量和窗口大小的影响。

总而言之,我认为处理多个缓冲区的最佳方法是单独保留窗口和标签,找到更精简的工作流程。

常规缓冲区也很棘手:拥有1,2,5,7列表的方式本身就很奇怪。但我认为缓冲切换(与窗口切换相反)从根本上说更直观,更可靠。

:bn "show next buffer in the list
:bp "show previous buffer in the list
:b3 "show buffer #3
:bf "show first buffer in the list
:bl "show last buffer in the list
:b <tab> "select buffer from a menu
:b fo<Tab> "select buffer from a menu
:b foo "show buffer named foo

以下映射使切换缓冲区变得轻而易举,但您也可以尝试使用许多缓冲区切换插件。

nnoremap gb :buffers<CR>:b<Space>

我喜欢的导航方法不是基于缓冲区的。如今,我发现实际上忘记项目的文件结构并使用标签要容易得多。当我浏览时,我会移动到特定的类或特定的方法或特定的数组或其他任何东西。我的工作区只有一个窗口,显示15个或20个缓冲区中的1个,我没有NERDTree,没有标签,没有MiniBufExplorer,没有TagList ......因为切换到另一个缓冲区需要至少几个按键,无论如何我没有看到任何有效的原因用于切割和切割我的工作区。

因为我没有把自己置于一个花哨过于复杂的gyzmos的角落里,所以我不必浪费宝贵的时间寻找解决方法来解决问题,我可以放心地嘲笑最新一批的图像宏。等等,我的意思是“工作”。

答案 1 :(得分:6)

通常称为Splits或windows的脆弱

  • 删除缓冲区时,其他缓冲区不受影响。
  • 关闭标签页时,其他标签不受影响。
  • 当你关闭一个窗口时,你的整个窗口布局会以不可预测的方式搞砸,需要一遍又一遍地进行繁琐的重新安排(这在Vim中很难做到并且不方便)。

因此,我建议不要以Vim中的窗口为中心的工作流程。

我的建议:保持当前标签页中的窗口数量很少。以集中的方式使用窗口,仅用于某些用途(查看文件的不同部分,区分文件,标题/实现文件,......)。使用工作区的标签页。熟悉导航缓冲区的许多其他方法:缓冲区列表,:find:edit系列,模糊查找器插件,文件浏览器等。

答案 2 :(得分:3)

尝试ctrl-w <N> >立即将尺寸改为N.如果你还没有这样做。

我自己更喜欢在标签中添加内容。并按ctrl-w shift-t将拆分移动到单独的选项卡。

答案 3 :(得分:0)

如何使用更多GNU screentmux?只是使用更多控制台,只是vim中的窗户对你没有多大帮助。

使用屏幕,您可以使用:mks保存会话。

在vim重新绑定ctrl+w,h/j/k/lctrl+h/j/k/l!垂直最大化,水平最大化和使所有窗口大小相同的快捷方式也有帮助。为了调整大小我也有快捷方式,但大多数情况下我都在使用全尺寸/调整大小,窗口管理不是vim的最佳功能,没有鼠标就更糟糕了。

摘自.vimrc

" WINDOW MANAGEMENT SETTINGS

"moving from window to window
nnoremap <C-h>  <C-w>h
nnoremap <C-j>  <C-w>j
nnoremap <C-k>  <C-w>k
nnoremap <C-l>  <C-w>l

"open new blank file
nnoremap o<C-h> :lefta vsp new<cr>
nnoremap o<C-j> :bel sp new<cr>
nnoremap o<C-k> :abo sp new<cr>
nnoremap o<C-l> :rightb vsp new<cr>

"move window
nnoremap <Leader><C-h> <C-W>H
nnoremap <Leader><C-j> <C-W>J
nnoremap <Leader><C-k> <C-W>K
nnoremap <Leader><C-l> <C-W>L

"maximise horizontally
map <Leader>= <C-w><Bar>

"maximise vertically
map <Leader>- <C-w>_

"make all windows equally sized
map <Leader><Leader> <C-w>=

"change windowsizes in visual mode
"horizontally - always three chars else it takes ages
vnoremap - 3<C-w><
vnoremap = 3<C-w>>

"vertically - always three chars else it takes ages
vnoremap _ 3<C-w>-
vnoremap + 3<C-w>+

"moving from window to window in visual mode
"that way you can move from window to window and resize with -,=,_,+ directly as needed
vnoremap <C-h> <ESC><C-w>hv
vnoremap <C-j> <ESC><C-w>jv
vnoremap <C-k> <ESC><C-w>kv
vnoremap <C-l> <ESC><C-w>lv

对于NERDtree,我会显示窗口并再次关闭它。由于有东西被它弄错了,我打开它并自动调整到固定宽度:

nnoremap <Leader><CR> :NERDTreeFind<CR>999<C-w><40<C-w>>010l