2013-08-16 50 views
8

在大中型项目上工作我经常会在屏幕上出现大量的分割,并且每个分割都以5-6个分割打开。通常,我为不同的目录和逻辑工作区使用不同的选项卡,以将功能A上的工作与功能B上的工作或错误C以及笔记分开。在Vim中管理分割

enter image description here

管理这种疯狂的时候你从插件,如NERDTree,逃犯,Gundo和许多其他谁愿意采取额外的分裂提供了很多附加分裂成为一个问题。在这样的助手分裂打开并关闭后,整个装置的高度和宽度都会发生变形。我的意思是,一些窗口变小,有的成为比他们最初较大(我必须手动调整自己的高度和宽度与CTRL+W >CTRL+W <和朋友。

通常它的速度更快做调整鼠标每分裂,但它甚至没有接近Vim的方式

有时我甚至想交换一些分割或向右分割移动CTRL+W HJKL并不总是有帮助,因为他们踢分裂太远,再次扭曲大小旋转CTRL+W r只适用于简单案例

如何管理大量缓冲区,分割和制表符?

编辑:我看到有投票结束。这个问题对你来说可能看起来太笼统了,所以有一个更具体的问题:处理大量缓冲和分裂的良好工作流程是什么? (其中一个答案是在需要更多空间时促进拆分以分离制表符)

+0

'Ctrl' +''w' ='(或'^ W =')将使或多或少均等地分配分裂。你能否让你的问题更具体 - 你究竟在寻找什么? – guessimtoolate

+0

我正在寻找一种方法,在每次打开/关闭一个小分组时都不会弄乱我的分割大小,或者根据缓冲区大小轻松调整大小。另一件事可能是一个插件或任何使重新排序更容易的事情。 – imslavko

回答

13

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

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

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

编辑

多的“东西”的工作一直是处理困难的问题。当我们试图在同一时间和同一空间中处理许多这些“事物”时更是如此。这是一个很难的问题,因为我们无法同时处理几件事情:我们的头脑并没有为此而优化。这就是为什么记忆游戏并不像看起来那么容易,为什么我们不记得在Powerpoint幻灯片充满了列表和图表之后记不住狗屎,以及为什么人们一方面用手机和另一方面的驱动轮死亡。

因为我们不能在同一时间4个缓冲工作,分割窗口应保留到实际的工作在一个窗口中完成,用于参考(文档,HTML文档时,其他窗口的情况下做CSS ......)或反馈(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的角落,所以我不必浪费我宝贵的时间寻找变通办法解决方法,我可以放心地嘲笑最新的一组图像宏。等等,我的意思是“工作”。

+0

这是一个很好的方向:工作流与分裂,但有很多标记。感谢这个答案。 – imslavko

+0

你对管理缓冲区有什么意见吗? ':ls'总是充满缓冲区,并且需要时间直观地查找所需缓冲区的数量。 'CTRL + 6'帮助但仍然。 – imslavko

+0

请参阅我的编辑。 – romainl

3

尝试ctrl-w <N> >将大小一次更改为N。如果你还没有这样做。

我自己更喜欢用标签中的东西代替。和ctrl-w shift-t将分割移动到单独的选项卡。

+0

我知道ctrl-w n>,但猜测或计算你需要多少次轮换才能扩大分割“一点点”感觉很愚蠢。 'ctrl-w shift-t' - 看起来很棒!谢谢! – imslavko

+0

我倾向于改变10,然后看到,也许改变另一个10或20,这通常是关于它。 – aragaer

6

分裂或窗户,因为他们通常被称为,脆弱

  • 当您删除缓冲区时,其他缓冲区不受影响。
  • 当您关闭标签页时,其他标签不受影响。
  • 当你关闭一个窗口时,你的整个窗口布局会以不可预知的方式变得混乱,需要一遍又一遍的繁琐的重新布置(这在Vim中很难做到,很不方便)。

因此,我会建议针对Vim中以windows为中心的工作流。

我的建议:保持当前标签页中的窗口数量较小。以专注的方式使用Windows,并仅用于某些用途(查看文件的不同部分,区分文件,标题/实现文件等)。使用工作区的标签页。获得舒适的浏览缓冲区的许多其他手段:缓冲区列表,:find:edit家庭,模糊的取景器插件,文件探险等

+0

感谢您的回答!我完全错过了学习缓冲区vs windows vs选项卡。现在我知道,这种拆分只适用于某些使用情况,并不适合手动管理超过3个缓冲区。 – imslavko

0

如何使用更GNU screentmux? vim中的窗口对你来说无能为力,只是使用更多的控制台。

在屏幕上,您可以保存会话,以及与:mks vim。

而在vim rebind ctrl+w,h/j/k/l只是ctrl+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 
+0

tmux中的split如何帮助我管理Vim中的分裂?我希望这个建议不是在tmux split中运行大量的vim实例? – imslavko

+0

@imslavko帖子稍有更新。 – sjas

+0

你发布了许多映射到诸如在窗口之间移动或打开新窗口等非常标准的事情,但它没有解决最初的可能性:当你有太多不同大小的分割时,它们变得很难管理它们。 – imslavko