Practice of Programming

プログラム とか Linuxとかの話題

alt-tabを不要にする

コマンド修正し間違えたので再度修正。と、不便なところ追記。script追記。

alt-tab(撲は別の割当ですが)を使ってNextWindowを探すのって、よくしますよね。
でも、これ要らないんじゃないかと、ふと思った.

普段、Linuxを使っていて立ち上げるものというのは少なくって、いずれも二重起動させたいことはまずない。

くらい。


で、bbkeysでショートカットキーで起動するようにしているものの、今までは、最初の一回を呼び出して、後は、alt-tabで切り替えということをしていた。
だが、ショートカットキーで起動だけじゃなくて、既に開いているものを呼び出すようにしてやれば、alt-tabいらないやんと今になって気づきました。


というわけで、ちょっと工夫してみた。
※アプリケーションによっては、二重起動しないのもあるので、下記をやらなくてもいいのもあります(sylpheedとか)。
※wmctrl が必要なので、aptかなんかで入れておいてください。


例えば、emacsを立ち上げたい場合。emacs の代わりに、下記をショートカットキーに登録しておきます。

wmctrl -a 'emacs@' || emacs

こうすることで、emacsが存在しなければ、立ち上げる。存在したら、そのウィンドウにスイッチするといった挙動になります。
これで、起動のショートカットとアクティブにするショートカットが共通になります。
alt-tabみたいにぐるぐる回して目的のものを探すなんてことしなくてよくなりました。素敵。
別のワークスペースに置いているもののところにもサクッと飛んで行ってくれるので、非常にいい感じです。


ちなみに、wmctrlを使う前はxwitでやってたんですが、下記みたいになって、残念な感じ。

#!/bin/sh

EMACSWID=`xwininfo -root -tree | grep emacs | tail -n1 | awk '{print $1}'`
if [ "$EMACSWID" != "" ];
then
  xwit -id $EMACSWID -pop -focus
else
  emacs
fi

xwininfoで探して、xwit で、全面に出してきます。xwininfo -root -treeは結構遅いので、若干もたついてました。
一般的な環境用に、gnomeで試してみたら、xwitの -pop も -raise も効かなかったため、ググったら wmctrlを見つけて、wmctrlに乗り換えました。


最後に、不便なところ。

  • 複数立ち上げた場合は、一番最初のものが立ち上がってしまうところ
  • windowのタイトル一致なので、ちゃんと書かないと間違ったwindow上がるかも
    • 本当は、ちゃんとしたshellスクリプトで、windowタイトルの末尾が完全一致した場合みたいにすべき

一番最後のを起動したければ、下記のでいけるかな?

wmctrl -a `wmctrl -l |grep 'emacs@' | tail -n1 |awk '{print $4}'`

まぁ、もともと複数立ち上げない前提ですし...、そういう時はalt-tab使えばいいかと。


というわけで、結構便利です。これで、alt-tabを使うことはあんまりなくなることでしょう。


ちなみに、撲はshell scriptにしています。urxvtの場合ですが。
下記のように、window名を末尾マッチさせた方が確実かと思います。

#!/bin/sh

if [ "$1" = 'pop' ]; then
  if wmctrl -l |grep -E 'urxvt$'; then
    wmctrl -l | grep -E 'urxvt$' | awk '{print $1}' |xargs -n 1 -i xwit -id {} -pop -focus
  else  
    setsid urxvt +sb -tint black -sh 20% -tr -fg white +sb --geometry 150x30 -bg black -cr green &
  fi
else
  setsid urxvt +sb -tint black -sh 20% -tr -fg white +sb --geometry 150x30 -bg black -cr green &
fi