1、效果预览

博主平时用 terminal + vim 作为开发环境,有时候要同时打开多个窗口(如:coding、log、debug ...),这些窗口没有平铺效果,往往乱糟糟的。

本文带来一个脚本,可以一键启动炫酷的多个平铺的窗口,可供大家自行延展发展(因为不同系统的字体可能参数要微调),效果如下:

2、具体实现

2.1 定位鼠标位置

考虑到多个显示器的情况,我们通过脚本读取鼠标箭头位置,然后在其所在窗口展开对应平铺窗口。

这里我们会用到 xdotool,例如,如下命令可以获取鼠标箭头位置:

  1. terminal xdotool getmouselocation
  2. x:1602 y:830 screen:0 window:79767574

我们用 sed 将上面返回的字符串中的 x\y 的值吸取出来:

  1. # 获取鼠标位置
  2. mouse_pos_x=`xdotool getmouselocation | sed "s:x\:\([0-9]*\) y\:\([0-9]*\) .*:\1:g"`
  3. mouse_pos_y=`xdotool getmouselocation | sed "s:x\:\([0-9]*\) y\:\([0-9]*\) .*:\2:g"`
  4. echo "mouse_pos_x = "$mouse_pos_x
  5. echo "mouse_pos_y = "$mouse_pos_y

2.2 获取屏幕位置

上面我们定位了鼠标的位置,接下来我们要定位屏幕的位置,我们将要用到 xrandr 命令:

  1. terminal xrandr
  2. Screen 0: minimum 320 x 200, current 3200 x 1080, maximum 8192 x 8192
  3. HDMI-1 disconnected (normal left inverted right x axis y axis)
  4. DVI-D-1 connected 1920x1080+1280+0 (normal left inverted right x axis y axis) 509mm x 286mm
  5. 1920x1080 60.00*+ 59.96 50.00 59.94 59.93
  6. 1920x1080i 60.00 50.00 59.94
  7. ...
  8. VGA-1 connected primary 1280x1024+0+0 (normal left inverted right x axis y axis) 338mm x 270mm
  9. 1280x1024 60.02*+ 75.02
  10. 1280x960 60.00
  11. 1280x800 59.97 59.81 59.91
  12. ...

我们用 sed1920x1080+1280+01280x1024+0+0 吸出来:

  1. terminal xrandr | grep " connected" | sed "s:.* connected.* \([0-9]*\)x\([0-9]*\)+\([0-9]*\)+\([0-9]*\).*:\1 \2 \3 \4:g"
  2. 1920 1080 1280 0
  3. 1280 1024 0 0

将吸取出来的值存起来:

  1. # 通过下面逻辑,可以将所有屏幕的大小和位置全部算出来
  2. # screen [x, y, x_start, y_start, x_end, y_end]
  3. x_index=0
  4. s_index=0
  5. for x in `xrandr | grep " connected" | sed "s:.* connected.* \([0-9]*\)x\([0-9]*\)+\([0-9]*\)+\([0-9]*\).*:\1 \2 \3 \4:g"`
  6. do
  7. echo $x
  8. screen[$s_index]=$x
  9. let x_index++
  10. let s_index++
  11. if [ $((x_index % 4)) -eq 0 ];then
  12. screen[$((s_index+0))]=$((screen[$((s_index-4))]+screen[$((s_index-2))]));
  13. screen[$((s_index+1))]=$((screen[$((s_index-3))]+screen[$((s_index-1))]));
  14. let s_index+=2
  15. fi
  16. done
  17. echo ${screen[@]}

2.3 计算鼠标在哪个窗口

上面两步已经获取了鼠标位置和窗口坐标,接下来就是一个简单的算法,来计算点在哪个矩形中的问题了(算法如下):

  1. # 计算坐标 (x,y) 是否在某个屏幕中 (x_start,y_start,x_end,y_end)
  2. function point_in_screen(){
  3. local x=$1
  4. local y=$2
  5. local x_start=$3
  6. local y_start=$4
  7. local x_end=$5
  8. local y_end=$6
  9. if (($x >= $x_start)) && (($x <= $x_end)) && (($y >= $y_start)) && (($y <= $y_end)) ; then
  10. return 1
  11. else
  12. return 0
  13. fi
  14. }

这样,我们就能遍历鼠标的坐标点(x,y)在哪个屏幕中了:

  1. screen_num=$((s_index/6))
  2. index=0
  3. while [ $index -le $screen_num ]
  4. do
  5. point_in_screen $mouse_pos_x $mouse_pos_y ${screen[$((index*6+2))]} ${screen[$((index*6+3))]} ${screen[$((index*6+4))]} ${screen[$((index*6+5))]}
  6. if [ $? == 1 ];then
  7. echo 'the point in scree '$index
  8. create_terminal ${screen[$((index*6))]} ${screen[$((index*6+1))]} ${screen[$((index*6+2))]} ${screen[$((index*6+3))]}
  9. break
  10. fi
  11. let index++
  12. done

我们在获取屏幕数据时,将一个屏幕的(w h x_start y_start x_end y_end)6 个数据作为一组存储,因此用 s_index/6 可以获取总的屏幕数。

2.4 1920x1080 平铺效果设计

我有两个屏幕:1920x1080 和 1280x1024,我的设计如下:

  • 在大屏幕中,展开 3 个窗口,就像我们常用的 IDE,有编码窗口,有输入交互命令的窗口,有看 log 的窗口;
  • 在小屏幕中,展开 3 个窗口,一个用来看文件,进行文件搜索,关键词搜索等,一个进行看天气,一个用来监控 CPU 和网速;

那么接下来就是用代码绘制了!

  1. # 绘制 terminal
  2. function create_terminal(){
  3. SCREEN_W=$1
  4. SCREEN_H=$2
  5. if (( $SCREEN_H == 1080)) && (($SCREEN_W == 1920)) ;then
  6. X_BOARD=15 #窗口与窗口之间的横向补偿(由于存在精度误差,该值是经验值)
  7. Y_BOARD=15
  8. LEFT_OFFSET=$3
  9. UP_OFFSET=$4
  10. H=50 #1080
  11. W=189 #1920
  12. win1_pos_x=$((LEFT_OFFSET+X_BOARD))
  13. win1_pos_y=$((UP_OFFSET+Y_BOARD))
  14. win1_size_w=$W
  15. win1_size_h=$((H*2/3))
  16. win2_pos_x=$win1_pos_x
  17. win2_pos_y=$((win1_pos_y + SCREEN_H*2/3 + Y_BOARD -22))
  18. win2_size_w=$((W/2-1))
  19. win2_size_h=$((H/3))
  20. win3_pos_x=$((win1_pos_x+SCREEN_W/2-8))
  21. win3_pos_y=$((win2_pos_y))
  22. win3_size_w=$win2_size_w
  23. win3_size_h=$((win2_size_h-2))
  24. xfce4-terminal --geometry $win1_size_w'x'$win1_size_h'+'$win1_pos_x'+'$win1_pos_y -Tcode -e'bash -c "vim ; bash"'
  25. xfce4-terminal --geometry $win2_size_w'x'$win2_size_h'+'$win2_pos_x'+'$win2_pos_y -Tcmd -e'bash -c "screenfetch ; bash"'
  26. xfce4-terminal --geometry $win3_size_w'x'$win3_size_h'+'$win3_pos_x'+'$win3_pos_y -Tlog -e'bash -c "xdotool key ctrl+shift+t; bash"'
  27. echo $win1_size_w'x'$win1_size_h'+'$win1_pos_x'+'$win1_pos_y
  28. echo $win2_size_w'x'$win2_size_h'+'$win2_pos_x'+'$win2_pos_y
  29. echo $win3_size_w'x'$win3_size_h'+'$win3_pos_x'+'$win3_pos_y
  30. elif (( $SCREEN_H == 1024)) && (($SCREEN_W == 1280)) ;then
  31. ...
  32. fi
  33. }
  • X_BOARDY_BOARD 是窗口与窗口之间的留白,这样相比于窗口相互紧贴,显得更高端
  • HW 是个经验值,由于绘制窗口的函数 xfce4-terminal 传如的串口宽、高不是像素点,而是某种好像和字体相关的行、列,因此得根据自己电脑的情况微调
  • 我们有了窗口像素级起始位置,像素级大小,以及整个屏幕按照字体行列计算的大致行列数 H/W,我们就能计算出三个窗口的起始像素级位置,和窗口的行列级大小(这里有各种补偿,以达到最佳效果)
  • 最后调用 xfce4-terminal 进行绘制,在绘制的时候可以带一些默认执行的语句,例如:vimscreenfetch

2.5 1280x1024 平铺效果设计

同 1920x1080,绘制 1280x1024 的代码如下:

  1. X_BOARD=30 #窗口与窗口之间的横向补偿(由于存在精度误差,该值是经验值)
  2. Y_BOARD=30
  3. LEFT_OFFSET=$3
  4. UP_OFFSET=$4
  5. H=48 #56 #1024
  6. W=129 #142 #1280
  7. win1_pos_x=$((LEFT_OFFSET+X_BOARD))
  8. win1_pos_y=$((UP_OFFSET+Y_BOARD))
  9. win1_size_w=$((W/2-4))
  10. win1_size_h=$((H-2))
  11. win2_pos_x=$((win1_pos_x + SCREEN_W/2 + X_BOARD - 48))
  12. win2_pos_y=$win1_pos_y
  13. win2_size_w=$win1_size_w
  14. win2_size_h=$((win1_size_h/2))
  15. win3_pos_x=$win2_pos_x
  16. win3_pos_y=$((win1_pos_y + SCREEN_H/2 + Y_BOARD - 40))
  17. win3_size_w=$win2_size_w
  18. win3_size_h=$((win2_size_h-1))
  19. # xwininfo
  20. xfce4-terminal --geometry $win1_size_w'x'$win1_size_h'+'$win1_pos_x'+'$win1_pos_y -Tsys
  21. xfce4-terminal --geometry $win2_size_w'x'$win2_size_h'+'$win2_pos_x'+'$win2_pos_y -Tmem -e'bash -c "curl \"wttr.in/HangZhou?0\";bash"'
  22. xfce4-terminal --geometry $win3_size_w'x'$win3_size_h'+'$win3_pos_x'+'$win3_pos_y -Tinfo -e'bash -c "sampler -c runchart.yml;bash"'
  • 天气用了一个 OpenAPI,这个属于 github 上一个超大项目,里面有各种开放 API
  • 系统性能,用了 sampler,大家可以进一步深入研究

3 代码

本文代码在:https://github.com/nbtool/cool_terminal

  1. terminal tree
  2. .
  3. ├── readme.md
  4. ├── runchart.yml
  5. └── run.sh
  6. 0 directories, 3 files

参考链接

[1]. 本文代码 GITHUB

[2]. xdotool 介绍

[3]. arch linux 社区 xrandr 介绍

[4]. arch linux 社区 xfce4-terminal 介绍


: ** 如果觉得不错,帮忙点个支持哈~**

[LINUX] 像电影里的黑客一样用 terminal 作为日常开发的更多相关文章

  1. 影响Linux发展的四位天才黑客

    影响Linux发展的四位天才黑客 相信大家对 Linux 再熟悉不过了.我们都知道 Linux继承自 Unix,但其实他们上一代还有一个 Multics.从最早的 Multics 发展到最早版本的 L ...

  2. .netcore项目部署到linux的docker里后,速度异常的慢

    .netcore项目部署到linux的docker里后,速度异常的慢,部署在iis下速度非常快. 特别是 接口里再调用其他接口,那速度绝对是蜗牛爬行的速度. 经过几个月的折腾,终于知道是什么问题了: ...

  3. Linux 桌面玩家指南:19. 深入理解 JavaScript,及其开发调试工具

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  4. 打造Linux三流娱乐环境,二流办公环境,一流Java开发环境

    写这篇文章的目的首先是为让自己以后再装linux环境时候,不用再通宵google+百度,做个备忘录,其次,给新入Linux环境的同学分享一点个人经验,再高尚点的动机也算是想做为开源技术的传播布道者.我 ...

  5. 在package.json里面的script设置环境变量,区分开发及生产环境。注意mac与windows的设置方式不一样

    在package.json里面的script设置环境变量,区分开发及生产环境. 注意mac与windows的设置方式不一样. "scripts": { "publish- ...

  6. gcc和MinGW的异同(在cygwin/gcc做的东西可以无缝的用在linux下,没有任何问题,是在windows下开发linux程序的一个很好的选择)

    cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器. cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从 ...

  7. Linux是一门真正的黑客高手艺术

    黑客这个词从诞生到现在,从来就没有解释为“高级入侵者”.“病毒制造者”或者“QQ盗号者”过.我至今不清楚在中国是谁先把黑客和这些无聊的词汇联系在了一起,导致如此多的人被误导.但有一点是肯定的,不负责任 ...

  8. 如何在 Arch Linux 的终端里设定 WiFi 网络

    如果你使用的是其他 Linux 发行版 而不是 Arch CLI,那么可能会不习惯在终端里设置 WiFi.尽管整个过程有点简单,不过我还是要讲一下.在这篇文章里,我将带领新手们通过一步步的设置向导,把 ...

  9. linux 优化&安全运维&黑客攻防

    优化: 可删除用户:adm,lp,sync,shutdown,halt,news,uucp,operator,games,gopher.   :userdel games 可删除组:adm,lp,ne ...

随机推荐

  1. nodejs的tream(流)解析与模拟文件读写流源码实现

    什么是流? 可读流于可写流 双工流于转换流 背压机制与文件流模拟实现 一.什么是流? 关于流的概念早在1964年就有记录被提出了,简单的说"流"就是控制数据传输过程的程序,比如在那 ...

  2. postgreSQL使用sql归一化数据表的某列,以及出现“字段 ‘xxx’ 必须出现在 GROUP BY 子句中或者在聚合函数中”错误的可能原因之一

    前言: 归一化(区别于标准化)一般是指,把数据变换到(0,1)之间的小数.主要是为了方便数据处理,或者把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权. 不过还是有很多人使用 ...

  3. 08. 树莓派安装MySQL

    1. 配置国内源(如果之前设置过可跳过步骤1~步骤2) vim /etc/apt/sources.list.d/raspi.list 2. 添加源 ,文档内原先的内容在开头加#号注释掉,加上下面这个 ...

  4. uniapp 入门

    uniapp官网 uni-app 是一个使用 Vue.js (opens new window)开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.Web(响应式).以及各种小 ...

  5. 我们必须要了解的Java位运算(不仅限于Java)

    本文原创地址为 https://www.cnblogs.com/zh94/p/16195373.html 原创声明:作者:陈咬金. 博客地址:https://www.cnblogs.com/zh94/ ...

  6. ucontext的简单介绍

    简介 结构体 函数 getcontext setcontext makecontext swapcontext 简介 ucontext.h是GNU C库的一个头文件,主要用于用户态下的上下文切换.需要 ...

  7. 虚拟机:KVM

    1. KVM 介绍 1.0 虚拟化简史 其中,KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是Linux 的一个内核模块,该内核模块使得 Linux ...

  8. 143. Reorder List - LeetCode

    Question 143. Reorder List Solution 题目大意:给一个链表,将这个列表分成前后两部分,后半部分反转,再将这两分链表的节点交替连接成一个新的链表 思路 :先将链表分成前 ...

  9. linux篇-linux iptables配置

    1 iptables默认系统自带 setup 2重启防火墙 /etc/init.d/iptables restart 3接受端口 Vi /etc/sysconfig/iptables -A INPUT ...

  10. java 5种IO模型

    每日一句 人的痛苦会把自己折磨到多深呢? 每日一句 You cannot swim for new horizons until you have courage to lose sight of t ...