Practice of Programming

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

alt-tabを使わずにアプリケーション切り替えを快適にするscript達

以前紹介したものですが、僕は結局スクリプトを作るようにしたので、それを紹介することにしました。


shellはあんまり得意じゃないので、変でも気にしない方向で...。
直して頂けたら、それは歓迎ですが。


キーバインドは、Windowsキー +
s ... sylpheed
w ... terminal(t に割り当ててたのだけど、若干遠いので変えた)
e ... emacs
g ... pidgin (元の名前がgaimなんで)
x ... xchat
m ... Firefox (mozillaだから)
o ... OpenOffice


あと、Windows + Escape を以前はアプリケーションの終了に割り当ててたのですが、icon化に変更しました。基本的に上記のアプリケーションは終了する必要があんまりないからです。終了する時は、別のショートカットを割り当てればいいかと。Windows + F4とか。なんで、alt 使わないかって言うと、altは別でよく使うので、Linuxだと不要なWindowsキーを代わりに使ってます。

Firefoxのshellスクリプトはなんかめんどくさいことしてるので、とりあえず省きました。キー割り当てに使っているソフトウェアは、bbkeys ですが、もっと素敵な何かがあるのかもしれません。bbkeys の場合、Windowsキーを認識してくれないので、ちょっと工夫する必要があります。

xmodmap -e 'keycode 115 = Super_L'
xmodmap -e 'keycode 131 = Super_L'
xmodmap -e 'add Mod5 = Super_L'

http://d.hatena.ne.jp/ktat/20070813/1186933121

これで、bbkeys の設定で、Mod5がWindowsキーに割り当てられます。ただしこれ、gnome使ってると衝突するようなので、なんか別の方法のがいいかも...。すんません、一般的な環境じゃなくて...。


下記のスクリプトですが、基本的に、pop という引数を取るようにしています。popという引数がない場合は、存在しても、多重起動するように...というポリシーだったのですが、途中からどうでもよくなったので、そうなってないのもあるかも。

というわけで、スクリプト達。前に載せたのも入ってますが、気にしない。

sylpheed.sh

sylpheed は二重起動しないし、sylpheedが立ち上がってる状態でコマンドたたくと、ポップアップしてきます。ので、ポップアップしたついでに全受信させます。xteを使います。Ubuntuとか、debianだと、xautomationで入るかな。さすが、sylpheed コマンドラインオプションでありました。ので、スクリプトにする必要がないな。

#!/bin/sh

sylpheed --receive-all &

# 以下、全部不要
# SYLPHEED_PID=`ps -e |grep sylpheed | grep -v grep |awk '{print $1}'`
# SYLPHEED_CNT=`wmctrl -p -l | grep " $SYLPHEED_PID " | awk '{print $1}' | wc -l`
#
#if [ ! "$SYLPHEED_PID" ]; then
#  sylpheed --receive-all &
#fi
#if [ "$SYLPHEED_CNT" = 1 ]; then
#   xte 'keydown Control_L' 'keydown Shift_L' 'key i' "keyup Control_L" "keyup Shift_L"
#  sylpheed --receive-all &
#else
#  wmctrl -p -l | grep " $SYLPHEED_PID " | awk '{print $1}' | tail -n 1 |xargs -r -n1 wmctrl -i {} -a;
#fi

xchat.sh

xchat こいつトレイに入ってしまうと、wmctrlでリストされないので困ります。
解決方法はわかりません。とりあえず、二重起動を避けるために、ps で調べて、存在したらwmctrl -a をしますが、トレイに入ってる場合は何にもません。
こんなん間違えてた...orz

#!/bin/sh

XCHATPID=`ps -e | grep '[x]chat' | awk '{print $1}'`

if [ "$XCHATPID" = "" ];
then
  setsid xchat &
else
  wmctrl -a 'XChat: ';
fi

term.sh

rxvtの起動です。screen使ってるので、多重起動する必要はない。

#!/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  
    urxvt +sb -tint black -sh 20% -tr -fg white +sb --geometry 150x30 -bg black -cr green &
  fi
else
  urxvt +sb -tint black -sh 20% -tr -fg white +sb --geometry 150x30 -bg black -cr green &
fi

pidgin.sh

pidgin は、複数のウィンドウがある上に、windowの名前にpidginが入ってないので、pid から。wmctrl -l -p で、pid も一緒に出てくるので、それを利用します。

#!/bin/sh

PIDGIN_PID=` ps -e |grep -v 'pidgin.sh' |grep pidgin | awk '{print $1}'`

echo $PIDGIN_PID
if [ "$PIDGIN_PID" != "" ]; then
  wmctrl -l -p | grep " $PIDGIN_PID " | awk '{print $5}' | xargs -n1 -i wmctrl -a {}
else
  pidgin &
fi

ちなみに、pidginにはsingle instanceオプションがありますが、言うこと聞いてくれませんでした。

ooffice.sh

OpenOfficeも複数あるので全部たちあげます。

#!/bin/sh

if [ "$1" = 'pop' ]; then
  if wmctrl -l |grep -E 'OpenOffice.org [A-Za-z]+$'; then
    wmctrl -l | grep -E 'OpenOffice.org [A-Za-z]+$' | awk '{print $1}' |xargs -n 1 -i xwit -id {} -pop -focus
  else  
    ooffice &
  fi
else
  ooffice &
fi

emacs.sh

@HOSTNAMEのところは、ご自分のホスト名に変換してください。wmctrl 二回叩いてるのは、何かしらないけど、フォーカス取れないことが何度かあったので、そうしました。

#!/bin/sh

EMACS_IS=`wmctrl -l |grep -E 'emacs@HOSTNAME$' | tail -n1 | awk '{print $1}'`

if test "$1" = "pop" && test "$EMACS_IS" != "" ; then
  wmctrl -i -a $EMACS_IS;
  wmctrl -i -a $EMACS_IS;
else
  env XMODIFIERS="@im=none" emacs &
fi

とりあえず、こんなもんで。