热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Emacstmux和vim环境下的多窗口工作环境第二季窗口旋转

在第一季的部分介绍了怎样将窗口切割成自己需要的样子。这一季我们讨论一下如何对切割后窗口布局进行旋转。为什么需要旋转窗口布局呢?最简单的答案是:任何一个窗

 

在第一季的部分介绍了怎样将窗口切割成自己需要的样子。这一季我们讨论一下如何对切割后窗口布局进行旋转。为什么需要旋转窗口布局呢?最简单的答案是:任何一个窗口布局,总有某一个时刻会让你感觉无法满足你当前的需要。这时候我们怎么办?改变窗口总比改变自己要好。既然选择了改变窗口布局,如何改变就成了下一个问题。如果能有一个传送门,让我们直接到达想要的地方,当然要把先回到最初的单窗口模式,然后再重新切割布局要方便的多了。旋转窗口就是这样的一个传送门。

 

让我们先从常用的多窗口模式开始说起。通常所用的多窗口模式以二窗口、三窗口、四窗口为多。四个以上窗口的环境一方面是比较少用(比较屏幕空间总是有限的,窗口切的太多,每一个窗口能用的面积就很有限了),另一方面,如果真的选择了如此复杂的窗口布局,一般也应该是经过慎重选择,专为某一种特定需求而打造的,通常需要重新布局的机会也不会很多。

 

所以在这里我们只讨论二窗口、三窗口、四窗口的情况。其中四窗口模式(就是田字形)由于同时具有轴对称和中心对称的特点,所以也不存在旋转的必要。这样以来,我们需要讨论的就只剩下二窗口和三窗口两种模式了。

 

二窗口模式的旋转

二窗口的旋转很容易理解啦。无非就是从横向转成竖向,再从竖向转成横向。  但是,这里有一个坏消息和一个好消息。坏消息是这样简单的事情 Emacs 的原生代码里面居然没有提供直接的支持。在原生 Emacs 里面只能选择先使用 Ctrl-x 0 或者 Ctrl-x 1 回到单窗口模式,然后再使用 Ctrl-x 2 或者 Ctrl-x 3 重新切割。在 tmux 和 Vim 里面,这样的旋转是被原生支持的。好消息是我自己写了一个 Emacs 扩展函数 change-split-type 来补上这个缺口。同学们在使用的时候可以自己把这个函数绑定到 Ctrl-x 4 c 上面。并且由于这个函数是自适应的,所以无论是从横向转成竖向,还是从竖向转成横向,都只需要这一个函数,及一个按键绑定就足够了。

 

在下面的示例当中仍然遵循第一季中的约定,命令/操作的示例按如下顺序给出 Emacs - tmux - vim

 

#+BEGIN_EXAMPLE


+--------------------------------+ +----------------+----------------+
| | change-split-type | | |
| a | Ctrl-b Alt-1 | | a |
| | Ctrl-w L | | |
+--------------------------------+ ----------------> | | |
| | | | |
| | | | |
| | | | |
+--------------------------------+ +----------------+----------------+

+---------------+----------------+ +--------------------------------+
| | | change-split-type | |
| a | | Ctrl-b Alt-2 | a |
| | | Ctrl-w K | |
| | | ----------------> +--------------------------------+
| | | | |
| | | | |
| | | | |
+---------------+----------------+ +--------------------------------+


#+END_EXAMPLE

 

三窗口模式的旋转

另外,由于窗口旋转涉及到的问题比较复杂,所以这次我们要把 Eamcs, tmux 和 Vim 分开来讲。首先是 Emacs

 

Emacs 的三窗口旋转

也许你已经猜到了,三窗口的旋转在 Emacs 当中也没有提供原生的支持。好消息是我也写了一个 Emacs 扩展函数 change-split-type-3 来解决这个问题。这个函数也是一个自适应函数,不论当前的窗口布局处于下图所示的那一种模式,这个函数都会将它们顺时针旋转。这样就不需要使用者自己去小心识别不同的场景,然后再去选择正确的函数了。这个函数在我的 Emacs 中是绑定在 Ctrl-x 4 C 上的。注意这里的 C 是大写,以便与上一个函数相区别。

 

#+BEGIN_EXAMPLE

+--------------------------------+ +----------------+---------------+
| | change-split-type-3 | | |
| a | Ctrl-x 4 C | | a |
| | | | |
+---------------+----------------+ ----------------> +----------------+ |
| | | | | |
| | | | | |
| | | | | |
+---------------+----------------+ +----------------+---------------+
^ |
| change-split-type-3 | change-split-type-3
| Ctrl-x 4 C | Ctrl-x 4 C
| |
| v
+---------------+----------------+ +----------------+---------------+
| | | change-split-type-3 | | |
| a | | Ctrl-x 4 C | | |
| | | | | |
| &#43;----------------&#43; <---------------- &#43;----------------&#43;---------------&#43;
| | | | |
| | | | a |
| | | | |
&#43;---------------&#43;----------------&#43; &#43;--------------------------------&#43;


#&#43;END_EXAMPLE


实际上在 Emacs 这里还有一个好消息。既然要自己写函数&#xff0c;我就索性再写一个&#xff0c;把旋转缓冲区的问题也一并解决了。所谓旋转缓冲区就是保持当前窗口模式不变&#xff0c;将三个窗口当中的编辑缓冲区按照顺时针的方向&#xff0c;相互调换。 这个函数的名字是 roll-v-3 。在我的 Emacs 当中被绑定在 Ctrl-x 4 r 按键组合上。

 

#&#43;BEGIN_EXAMPLE

&#43;--------------------------------&#43; &#43;--------------------------------&#43;
| | roll-v-3 | |
| A | Ctrl-x 4 r | B |
| | | |
&#43;---------------&#43;----------------&#43; ----------------> &#43;---------------&#43;----------------|
| | | | | |
| B | C | | C | A |
| | | | | |
&#43;---------------&#43;----------------&#43; &#43;---------------&#43;----------------&#43;
^ |
| roll-v-3 roll-v-3 |
| Ctrl-x 4 r Ctrl-x 4 r |
| |
| &#43;-------------------------------&#43; |
| | | |
&#43;------------- | C | <------------&#43;
| |
&#43;---------------&#43;---------------&#43;
| | |
| A | B |
| | |
&#43;---------------&#43;---------------&#43;


#&#43;END_EXAMPLE


tmux 的三窗口旋转

tmux 对三窗口模式提供了原生支持&#xff0c;所以在 tmux 里面进行三窗口旋转是最方便的。但是这种支持也是有限度的&#xff0c;大家可以看到在这里 tmux 比 Emacs 少了一种布局方式。

注&#xff1a; 下面示例中的 M 代表 Meta 键&#xff0c;对应到现代键盘上通常是 Alt 键

#&#43;BEGIN_EXAMPLE

&#43;----------------&#43;----------------&#43;
Ctrl-b M-3 | | |
&#43;-------------------------------------- | | b |
| | | |
| &#43;---------------------------------> | a &#43;----------------&#43;
| | Ctrl-b M-4 | | |
| | | | c |
v | | | |
&#43;--------------------------------&#43; &#43;----------------&#43;----------------&#43;
| | ^ |
| a | | |
| | | |
&#43;---------------&#43;----------------&#43; Ctrl-b M-4 | | Ctrl-b M-5
| | | | |
| b | c | | |
| | | | v
&#43;---------------&#43;----------------&#43; &#43;----------------&#43;----------------&#43;
| ^ | | |
| | | a | b |
| | Ctrl-b M-3 | | |
| &#43;---------------------------------- &#43;----------------&#43;----------------&#43;
| | |
&#43;-------------------------------------> | c |
Ctrl-b M-5 | |
&#43;---------------------------------&#43;
#&#43;END_EXAMPLE



 Vim 的三窗口旋转

Vim 的窗口旋转在这里是最复杂的。首先 Vim 也对窗口的旋转提供了原生的支持。通过原生支持&#xff0c;可以实现各种各样的旋转支持&#xff0c;并且所有这些方式都具有浓郁的 Vim 色彩。

 

对于 Vim 的三窗口旋转需要分成两部分来介绍。首先是最简单的一种方式。这种方式严格来说不能称之为“旋转”&#xff0c;应该叫“对调”才对&#xff0c;但是因为也是可以在三窗口模式下使用的一种操作&#xff0c;所以在这里就一并介绍了。

#&#43;BEGIN_EXAMPLE

&#43;--------------------------------&#43; &#43;----------------&#43;----------------&#43;
| | | | |
| a | Ctrl-w J | b | c |
| | -----------------> | | |
&#43;---------------&#43;----------------&#43; &#43;----------------&#43;----------------&#43;
| | | <----------------- | |
| b | c | Ctrl-w K | a |
| | | | |
&#43;---------------&#43;----------------&#43; &#43;---------------------------------&#43;

#&#43;END_EXAMPLE


下面要介绍的就是真正的旋转了。虽然 Vim 原生提供了丰富的多窗口操作支持&#xff0c;但是其中的有些操作并不是非常直接的。从下面的示例中就能看到&#xff0c;需要一个中间状态来过渡&#xff0c;才能够完成。

 

注1&#xff1a; 在一下示例中&#xff0c;标有字母 a 的窗口代表当前窗口&#xff0c;也就是光标所在的窗口。

注2&#xff1a;在右下角的旋转示例当中&#xff0c;标有字母 b 的窗口代表当前窗口。

#&#43;BEGIN_EXAMPLE

&#43;-----------------&#43; &#43;-----&#43;-----&#43;-----&#43; &#43;--------&#43;--------&#43;
| a | Ctrl-w H | | | | Ctrl-w J | b | c |
| | --------------> | | | | --------------> | | |
&#43;--------&#43;--------&#43; | a | b | c | &#43;--------&#43;--------&#43;
| b | c | <-------------- | | | | <-------------- | a |
| | | Ctrl-w K | | | | Ctrl-w H | |
&#43;--------&#43;--------&#43; &#43;-----&#43;-----&#43;-----&#43; &#43;-----------------&#43;



&#43;--------&#43;--------&#43; &#43;-----------------&#43; &#43;--------&#43;--------&#43;
| | b | Ctrl-w K | a | Ctrl-w L | b | |
| | | --------------
> &#43;-----------------&#43; -------------> | | |
| a &#43;--------&#43; | b | &#43;--------&#43; a |
| | | <-------------- &#43;-----------------&#43; <------------- | | |
| | c | Ctrl-w H | c | Ctrl-w K | c | |
&#43;--------&#43;--------&#43; &#43;-----------------&#43; &#43;--------&#43;--------&#43;
      ^                                                                        |
      |  Ctrl-w H                                                              |  Ctrl-w H
      |                                                                        v
  &#43;-----------------&#43;                                                     &#43;--------&#43;--------&#43;
  |                 |                                                     |        |        |
  |                 |                                                     |        |        |
  &#43;--------&#43;--------&#43;                                                     &#43;--------&#43;--------&#43;
  |        |        |                                                     |                 |
  |        |   a    |                                                     |        b        |
  &#43;--------&#43;--------&#43;                                                     &#43;-----------------&#43;


#&#43;END_EXAMPLE


注&#xff1a; 关于这一季当中提到的所以 Emacs 扩展函数&#xff0c;请访问 EmacsWiki

 

 

 

 

 

 

转:https://www.cnblogs.com/doveyoung/archive/2012/02/05/multi-window-2.html



推荐阅读
  • 本文介绍了使用 Python 编程语言高效抓取微博文本和动态网页图像数据的方法。通过详细的示例代码,展示了如何利用爬虫技术获取微博内容和动态图片,为数据采集和分析提供了实用的技术支持。对于对网络数据抓取感兴趣的读者,本文具有较高的参考价值。 ... [详细]
  • 在Hive中合理配置Map和Reduce任务的数量对于优化不同场景下的性能至关重要。本文探讨了如何控制Hive任务中的Map数量,分析了当输入数据超过128MB时是否会自动拆分,以及Map数量是否越多越好的问题。通过实际案例和实验数据,本文提供了具体的配置建议,帮助用户在不同场景下实现最佳性能。 ... [详细]
  • 本文探讨了在 Silverlight 应用程序中实现多窗口界面的方法,通过引入浮动窗口组件,增强了应用的交互性和用户体验。该方案详细介绍了技术实现过程,包括窗口管理、布局调整及跨窗口通信机制,为开发者提供了实用的参考。 ... [详细]
  • 多种实现 Windows 定时自动执行任务的专业技巧与方案
    在Windows系统中,实现定时自动执行任务有多种专业技巧和方案。常见的方法包括:使用Windows任务计划程序、开发Windows服务以及利用SQL Server Agent作业。这些方法被广泛应用于各种自动化场景,多数技术人员对此都有所了解。 ... [详细]
  • 第五周教学内容回顾与实验成果分析报告
    在第五周的教学内容回顾与实验成果分析报告中,我们重点探讨了String类的应用。实验旨在使学生熟练掌握String类的各种操作方法,并学会利用JDK帮助文档解决实际问题。具体实验内容包括对给定字符串“thisisatestof”进行多种操作,如字符串分割、拼接、查找子字符串等,以加深对String类功能的理解和应用。通过本次实验,学生们不仅巩固了理论知识,还提升了实际编程能力。 ... [详细]
  • Linux 信号处理全面解析(第六篇)
    本文深入探讨了信号及其来源。信号本质上是对中断机制的软件层面模拟,从原理上看,进程接收到信号与处理器接收到中断请求类似。信号具有异步特性,能够在进程执行过程中随时触发,从而中断当前操作并执行相应的处理程序。文章详细分析了信号的生成、传递和处理机制,并讨论了常见的信号类型及其应用场景。此外,还介绍了如何在 Linux 系统中使用信号进行进程间通信和错误处理,为开发者提供了实用的技术指导。 ... [详细]
  • 智能制造数据综合分析与应用解决方案
    在智能制造领域,生产数据通过先进的采集设备收集,并利用时序数据库或关系型数据库进行高效存储。这些数据经过处理后,通过可视化数据大屏呈现,为生产车间、生产控制中心以及管理层提供实时、精准的信息支持,助力不同应用场景下的决策优化和效率提升。 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • 如何利用Apache与Nginx高效实现动静态内容分离
    如何利用Apache与Nginx高效实现动静态内容分离 ... [详细]
  • 浏览器中 W3School JavaScript 的 Location 对象详解
    Location对象是浏览器Window对象的一部分,通过`window.location`属性可访问。它包含了当前页面URL的相关信息,如协议、主机名、路径和查询参数等,对于页面导航和URL操作非常有用。 ... [详细]
  • 本文介绍了一种专为清洁工人设计的自定义文本烟花效果。通过该功能,用户可以输入特定的感谢或祝福语句,系统将生成绚丽的烟花动画,以表达对清洁工人的敬意和感激之情。该特效不仅美观,还能增强用户的互动体验,提升公共场合的氛围。 ... [详细]
  • 在Python 3环境中,当无法连接互联网时,可以通过下载离线模块包来实现模块的安装。具体步骤包括:首先从PyPI网站下载所需的模块包,然后将其传输到目标环境,并使用`pip install`命令进行本地安装。此方法不仅适用于单个模块,还支持依赖项的批量安装,确保开发环境的完整性和一致性。 ... [详细]
  • 在操作系统中,阻塞状态与挂起状态有着显著的区别。阻塞状态通常是指进程因等待某一事件(如I/O操作完成)而暂时停止执行,而挂起状态则是指进程被系统暂时移出内存,以释放资源或降低系统负载。此外,本文还深入分析了`sleep()`函数的实现机制,探讨了其在不同操作系统中的具体实现方式及其对进程调度的影响。通过这些分析,读者可以更好地理解操作系统如何管理进程的不同状态以及`sleep()`函数在其中的作用。 ... [详细]
  • 在HTML文档中,图像和链接标签的合理应用与优化对于提升网页的用户体验至关重要。本文详细探讨了如何通过正确的语法和属性设置,实现图像和链接的高效展示和功能增强。同时,文章还介绍了常见的优化技巧,如使用alt属性提高图像的可访问性,以及通过rel属性增强链接的安全性和语义性。这些方法不仅有助于搜索引擎优化,还能显著改善用户的浏览体验。 ... [详细]
  • 初次接触AJAX是在去年,当时主要是通过手动编写客户端代码来实现,还需处理被请求的页面,过程相当繁琐。尽管之前就听说过AJAX.NET,但一直没有机会深入了解。本文将作为初学者的指南,详细介绍AJAX.NET的基本概念、核心功能及其在实际项目中的应用技巧,帮助读者快速上手并掌握这一强大的开发工具。 ... [详细]
author-avatar
手机用户2502916591
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有