特定のアプリケーションにスイッチするシェルスクリプトを作る
Web開発を行っていて、ターミナルとブラウザを行き来することが非常に多い。 一度のキーアクションでターミナルに移動、ブラウザに移動できる方法がないかと考えた上で、作ってみた。 思いつきから作ってみたが意外と便利だった。一日に多用するショートカットとなった。
ブラウザとターミナルを交互に切り替えたい
Web開発している時にターミナルとChromeを何度も行き来することがある。 Alt-tabもあるけれど、他のウィンドウが邪魔で何度Alt+tabを入力すればよいかわからない。 Alt-tabを押す、該当の画面がターミナル(Window)であるかを確認、もう一度Alt-tabを押すという繰り返しが非常に面倒。
特定のキー1回でブラウザとターミナルをトグルできればベスト。
xdotoolを使ってみる
できる事は下記があるらしい。
- ウィンドウ ID の取得
- 名前やクラスによる検索
- 現在アクテイブなウィンドウ
- ウィンドウ ID で指定されたウィンドウの操作
- リサイズ
- 移動
- 最小化
- 最全面へ
- マウスイベントの模倣
- マウスカーソル移動
- マウスクリック
- キーイベントの模倣
- 文字入力
- ショートカットキー入力
NOTE: xdotoolを使い特定ウィンドウの表示をワンキーでトグル(http://d.hatena.ne.jp/mooz/20101228/p)
$xdotool
Usage: xdotool <cmd> <args>
Available commands:
getwindowfocus
getwindowname
getwindowpid
getwindowgeometry
getdisplaygeometry
search
selectwindow
help
version
behave
behave_screen_edge
click
getmouselocation
key
keydown
keyup
mousedown
mousemove
mousemove_relative
mouseup
set_window
type
windowactivate
windowfocus
windowkill
windowmap
windowminimize
windowmove
windowraise
windowreparent
windowsize
windowunmap
set_num_desktops
get_num_desktops
set_desktop
get_desktop
set_desktop_for_window
get_desktop_for_window
get_desktop_viewport
set_desktop_viewport
exec
sleep
結構いろいろある
windowIDの取得
対象アプリケーションのWindowのIDを取得
$ xdotool search "byobu"
Defaulting to search window name, class, and classname
65011722
workspaceIDの取得
対象のアプリケーションがどこのワークスペースにいるかを取得
xdotool get_desktop_for_window 65011722
0
windowをworkspaceへのセット
WindowIDが65011722
のWindowをWorkspace1
に移動させる
xdotool set_desktop_for_window 65011722 1
実装してみる
xdotoolで現在のWindowを見て、ブラウザであればターミナルを、そうでなければブラウザをアクティブにする。
xbindkeysを使ってショートカットをアサイン xbindkeys使ってなければインストールから。
sudo apt-get install xbindkeys
~/.xbindkeysrcを修正する
"/path/to/your/script/relocate_wondow.sh"
Control+Shift + m
xbindkeysを再起動
pkill xbindkeys
xbindkeys
Ctrl+Shift+mでターミナルとブラウザをトグルできるようなった!
その他xdotoolでやりたいこと
他にもxdotoolでやりたいことがいくつかある。
いつも指定のワークスペースにアプリをセットしたい
作業を始めるときいつも同じ配置にする。
browser | terminal | twitter/slack | calendar/todo list
上記の配置をすることが多い。アプリ開いて、ワークスペース移動して、アプリ開いて…。 面倒であるので一発でワークスペースに配置したい。
現在のアプリをひとつずつ隣のワークスペースに移動させたい
そもそもなぜこのような要望が出るかというと今のelementary OSのバグで、マルチモニタを接続した際にプライマリのワークスペースが大きく描画されてしまう謎挙動がある。 その状態でアプリケーションをドラッグで移動しようとしてもプライマリのワークスペースが隣のワークスペースの領域にかぶっていて、移動が困難になる。
対処策として、一度Super+Shift+Left
でアプリケーションを再配置してしまえばよいが、ひとつずつしかワークスペースに移動させることができない。
これがとても面倒だったため、スクリプト一発で再配置できるようにしたい。