LINUX 像電影裡的駭客一樣用 terminal 作為日常開發

1、效果預覽

博主平時用 terminal + vim 作為開發環境,有時候要同時開啟多個視窗(如:coding、log、debug 。。。),這些視窗沒有平鋪效果,往往亂糟糟的。

本文帶來一個指令碼,可以一鍵啟動炫酷的多個平鋪的視窗,可供大家自行延展發展(因為不同系統的字型可能引數要微調),效果如下:

LINUX 像電影裡的駭客一樣用 terminal 作為日常開發

2、具體實現

2。1 定位滑鼠位置

考慮到多個顯示器的情況,我們透過指令碼讀取滑鼠箭頭位置,然後在其所在視窗展開對應平鋪視窗。

這裡我們會用到 xdotool,例如,如下命令可以獲取滑鼠箭頭位置:

➜ terminal xdotool getmouselocation x:1602 y:830 screen:0 window:79767574

我們用 sed 將上面返回的字串中的 x\y 的值吸取出來:

# 獲取滑鼠位置mouse_pos_x=`xdotool getmouselocation | sed “s:x\:\([0-9]*\) y\:\([0-9]*\) 。*:\1:g”`mouse_pos_y=`xdotool getmouselocation | sed “s:x\:\([0-9]*\) y\:\([0-9]*\) 。*:\2:g”`echo “mouse_pos_x = ”$mouse_pos_xecho “mouse_pos_y = ”$mouse_pos_y

2。2 獲取螢幕位置

上面我們定位了滑鼠的位置,接下來我們要定位螢幕的位置,我們將要用到 xrandr 命令:

➜ terminal xrandrScreen 0: minimum 320 x 200, current 3200 x 1080, maximum 8192 x 8192HDMI-1 disconnected (normal left inverted right x axis y axis)DVI-D-1 connected 1920x1080+1280+0 (normal left inverted right x axis y axis) 509mm x 286mm 1920x1080 60。00*+ 59。96 50。00 59。94 59。93 1920x1080i 60。00 50。00 59。94 。。。VGA-1 connected primary 1280x1024+0+0 (normal left inverted right x axis y axis) 338mm x 270mm 1280x1024 60。02*+ 75。02 1280x960 60。00 1280x800 59。97 59。81 59。91 。。。

我們用 sed 將 1920x1080+1280+0 和 1280x1024+0+0 吸出來:

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

將吸取出來的值存起來:

# 透過下面邏輯,可以將所有螢幕的大小和位置全部算出來# screen [x, y, x_start, y_start, x_end, y_end]x_index=0s_index=0for x in `xrandr | grep “ connected” | sed “s:。* connected。* \([0-9]*\)x\([0-9]*\)+\([0-9]*\)+\([0-9]*\)。*:\1 \2 \3 \4:g”`do echo $x screen[$s_index]=$x let x_index++ let s_index++ if [ $((x_index % 4)) -eq 0 ];then screen[$((s_index+0))]=$((screen[$((s_index-4))]+screen[$((s_index-2))])); screen[$((s_index+1))]=$((screen[$((s_index-3))]+screen[$((s_index-1))])); let s_index+=2 fidoneecho ${screen[@]}

2。3 計算滑鼠在哪個視窗

上面兩步已經獲取了滑鼠位置和視窗座標,接下來就是一個簡單的演算法,來計算點在哪個矩形中的問題了(演算法如下):

# 計算座標 (x,y) 是否在某個螢幕中 (x_start,y_start,x_end,y_end)function point_in_screen(){ local x=$1 local y=$2 local x_start=$3 local y_start=$4 local x_end=$5 local y_end=$6 if (($x >= $x_start)) && (($x <= $x_end)) && (($y >= $y_start)) && (($y <= $y_end)) ; then return 1 else return 0 fi}

這樣,我們就能遍歷滑鼠的座標點(x,y)在哪個螢幕中了:

screen_num=$((s_index/6))index=0while [ $index -le $screen_num ]do 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))]} if [ $? == 1 ];then echo ‘the point in scree ’$index create_terminal ${screen[$((index*6))]} ${screen[$((index*6+1))]} ${screen[$((index*6+2))]} ${screen[$((index*6+3))]} break fi let index++done

我們在獲取螢幕資料時,將一個螢幕的(w h x_start y_start x_end y_end)6 個數據作為一組儲存,因此用 s_index/6 可以獲取總的螢幕數。

2。4 1920x1080 平鋪效果設計

我有兩個螢幕:1920x1080 和 1280x1024,我的設計如下:

LINUX 像電影裡的駭客一樣用 terminal 作為日常開發

在大螢幕中,展開 3 個視窗,就像我們常用的 IDE,有編碼視窗,有輸入互動命令的視窗,有看 log 的視窗;

在小螢幕中,展開 3 個視窗,一個用來看檔案,進行檔案搜尋,關鍵詞搜尋等,一個進行看天氣,一個用來監控 CPU 和網速;

那麼接下來就是用程式碼繪製了!

# 繪製 terminalfunction create_terminal(){ SCREEN_W=$1 SCREEN_H=$2 if (( $SCREEN_H == 1080)) && (($SCREEN_W == 1920)) ;then X_BOARD=15 #視窗與視窗之間的橫向補償(由於存在精度誤差,該值是經驗值) Y_BOARD=15 LEFT_OFFSET=$3 UP_OFFSET=$4 H=50 #1080 W=189 #1920 win1_pos_x=$((LEFT_OFFSET+X_BOARD)) win1_pos_y=$((UP_OFFSET+Y_BOARD)) win1_size_w=$W win1_size_h=$((H*2/3)) win2_pos_x=$win1_pos_x win2_pos_y=$((win1_pos_y + SCREEN_H*2/3 + Y_BOARD -22)) win2_size_w=$((W/2-1)) win2_size_h=$((H/3)) win3_pos_x=$((win1_pos_x+SCREEN_W/2-8)) win3_pos_y=$((win2_pos_y)) win3_size_w=$win2_size_w win3_size_h=$((win2_size_h-2)) xfce4-terminal ——geometry $win1_size_w‘x’$win1_size_h‘+’$win1_pos_x‘+’$win1_pos_y -Tcode -e‘bash -c “vim ; bash”’ xfce4-terminal ——geometry $win2_size_w‘x’$win2_size_h‘+’$win2_pos_x‘+’$win2_pos_y -Tcmd -e‘bash -c “screenfetch ; bash”’ 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”’ echo $win1_size_w‘x’$win1_size_h‘+’$win1_pos_x‘+’$win1_pos_y echo $win2_size_w‘x’$win2_size_h‘+’$win2_pos_x‘+’$win2_pos_y echo $win3_size_w‘x’$win3_size_h‘+’$win3_pos_x‘+’$win3_pos_y elif (( $SCREEN_H == 1024)) && (($SCREEN_W == 1280)) ;then 。。。 fi}

X_BOARD 和 Y_BOARD 是視窗與視窗之間的留白,這樣相比於視窗相互緊貼,顯得更高階

H 和 W 是個經驗值,由於繪製視窗的函式 xfce4-terminal 傳如的串列埠寬、高不是畫素點,而是某種好像和字型相關的行、列,因此得根據自己電腦的情況微調

我們有了視窗畫素級起始位置,畫素級大小,以及整個螢幕按照字型行列計算的大致行列數 H/W,我們就能計算出三個視窗的起始畫素級位置,和視窗的行列級大小(這裡有各種補償,以達到最佳效果)

最後呼叫 xfce4-terminal 進行繪製,在繪製的時候可以帶一些預設執行的語句,例如:vim,screenfetch 等

2。5 1280x1024 平鋪效果設計

同 1920x1080,繪製 1280x1024 的程式碼如下:

X_BOARD=30 #視窗與視窗之間的橫向補償(由於存在精度誤差,該值是經驗值)Y_BOARD=30LEFT_OFFSET=$3UP_OFFSET=$4H=48 #56 #1024W=129 #142 #1280win1_pos_x=$((LEFT_OFFSET+X_BOARD))win1_pos_y=$((UP_OFFSET+Y_BOARD))win1_size_w=$((W/2-4))win1_size_h=$((H-2))win2_pos_x=$((win1_pos_x + SCREEN_W/2 + X_BOARD - 48))win2_pos_y=$win1_pos_ywin2_size_w=$win1_size_wwin2_size_h=$((win1_size_h/2))win3_pos_x=$win2_pos_xwin3_pos_y=$((win1_pos_y + SCREEN_H/2 + Y_BOARD - 40))win3_size_w=$win2_size_wwin3_size_h=$((win2_size_h-1))# xwininfoxfce4-terminal ——geometry $win1_size_w‘x’$win1_size_h‘+’$win1_pos_x‘+’$win1_pos_y -Tsys 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”’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,大家可以進一步深入研究