特定のアプリケーションにスイッチするシェルスクリプトを作る

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でアプリケーションを再配置してしまえばよいが、ひとつずつしかワークスペースに移動させることができない。 これがとても面倒だったため、スクリプト一発で再配置できるようにしたい。