試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

ファイルマネージャThunarのコンテキストメニューのアクションを作る

Xfce 4.4から採用されたファイルマネージャThunarでは、右クリックメニューから行う動作を簡単に作成でき、使い方によっては非常に便利。

用途

「開く」操作に関しては、基本的に、種類ごとにアプリケーションで開くための右クリックメニュー項目が出てくるようになっていて、ダブルクリックでも、関連付けされたアプリで開けるため、登録する必要性はない。もし、開こうとしているファイルの種類が、どのアプリにも関連付けされていなかったとしても、関連付けの登録を行えばよい。
実際に役に立つのは、単純に「開く」だけでなく、

  • アプリ側に特殊なオプションを付けて渡す
  • 複数選択をして一括で処理をさせる
  • サブディレクトリを含めて、選択したディレクトリ以下のファイルを処理させる*1

などの場合。他のパターンでも使えると思われる。

設定方法

  1. 「編集」メニューにある「アクションの設定」を開く。
  2. ダイアログの右、一番上の追加ボタンでアクションを追加。なお、下のボタンで編集・削除・並べ替えもできる。
  3. 「基本」の設定。
    • 「名前」は右クリックメニューに表示される
    • 「説明」はメニューから項目を選択しているときにステータスバーに表示される
    • 「コマンド」は「/bin/sh -c [コマンド]」と実行され、if文なども使える。シェルスクリプトや実行ファイルを直接指定することも可能。「%f」などの特殊なパラメータに関してはダイアログを参照。
    • アイコンはボタンから選択ダイアログを開いて設定。
  4. 「条件」の設定。0.8.0の時点ではファイル名の単純なマッチングのみで「;」区切り。更に、種類として以下のものから選択。
    • フォルダ
    • テキスト
    • 音楽
    • 動画
    • 画像
    • それ以外

設定の保存場所とインポート/エクスポート

${HOME}/.config/Thunar/uca.xmlに保存されている。アクションの設定を変更すると自動的に上書き保存される。
--daemon付きを含む全てのThunarプロセスが止まっている状態でこのファイルを編集/上書きすることで、設定の取り込みができる。
設定を外部に保存したい場合、このファイルをコピーすればよいのだが、バージョン0.8.0の時点では改行が一切入らず、見づらいので

$ sed -e 's|\(</\?actions\?>\)|\n\1\n|g' ~/.config/Thunar/uca.xml > [好きなファイル名]

として書き出すと、個々のアクションごとにまとまって多少は見やすいかもしれない。

設定例

まだ調整中で修正の可能性がある。ユーザからの入力を受け付けて処理に使用するため、zenityコマンドを使用しているものもある(名前の最後に「...」を付けているもの)。
ファイル名: ~/.config/Thunar/uca.xml

<?xml encoding="UTF-8" version="1.0"?>

<actions>

<action>
<icon>openterm</icon><name>ここで端末を開く(_T)</name><command>exo-open --working-directory %f --launch TerminalEmulator</command><description>この階層で端末エミュレータを開く</description><patterns>*</patterns><directories/>
</action>

<action>
<icon>/usr/share/pixmaps/nautilus/nautilus-launch-icon.png</icon><name>ここでNautilusのファイルブラウザを開く(_N)</name><command>nautilus --sm-disable --no-desktop --browser %f</command><description>この階層でNautilusのファイルブラウザウィンドウを開く</description><patterns>*</patterns><directories/>
</action>

<action>
<icon>gtk-edit</icon><name>管理者権限でテキスト編集(_T)</name><command>gksudo mousepad %f</command><description>gksudo+mousepadを使用して管理者権限でテキスト編集</description><patterns>*</patterns><text-files/>
</action>

<action>
<icon>audacious</icon><name>Audaciousのプレイリストに追加(_L)</name><command>audacious -e %F</command><description>[複数可]指定したファイルをAudaciousのプレイリストに追加</description><patterns>*.mp3;*.ogg;*.flac;*.tta;*.cue</patterns><audio-files/><other-files/>
</action>

<action>
<icon>mplayer</icon><name>MPlayerで任意のオプションを付けて動画再生(_O)...</name><command>o=$(zenity --entry --title=&quot;オプションの指定&quot; --text &quot;オプション&quot; --entry-text -fs); [[ $? = 0 ]] &amp;&amp; mplayer $o %f</command><description>任意のオプションを付けて動画ファイルを再生</description><patterns>*.mpg;*.mpeg;*.avi;*.wmv;*.asf;*.mkv;*.rm;*.rmvb;stream.dump*</patterns><other-files/><video-files/>
</action>

<action>
<icon>gnome-mime-video</icon><name>Matroskaファイルの情報を表示(_M)</name><command>mkvinfo -g %f</command><description>mkvinfoでMatroskaファイルの情報を表示</description><patterns>*.mkv;*.mka</patterns><audio-files/><video-files/>
</action>

<action>
<icon>comix</icon><name>このフォルダ以下の画像をComixで開く[動作不完全](_C)</name><command>comix %f</command><description>選択したフォルダ以下にある画像をComixで開く</description><patterns>*</patterns><directories/>
</action>

<action>
<icon>gimv</icon><name>GImageViewで開く(_G)</name><command>gimv -d -R %F</command><description>[複数可]選択した画像をGImageViewで開く/フォルダの場合は再帰的に開く</description><patterns>*</patterns><directories/><image-files/>
</action>

<action>
<icon>gimv</icon><name>GImageViewでこのフォルダ以下の画像をスライドショー(_S)...</name><command>w=$(zenity --scale --title &quot;切り替え間隔の設定&quot; --text &quot;切り替え間隔[秒]&quot; --value 10 --min-value 1 --max-value 60) ; [[ $? = 0 ]] &amp;&amp; gimv -d -R -S -W $w %F</command><description>[複数可]GImageViewでスライドショーを実行(間隔指定可能)</description><patterns>*</patterns><directories/>
</action>

<action>
<icon>gnome-mime-application-x-7z-compressed</icon><name>簡単7z圧縮(_7)...</name><command>f=$(zenity --file-selection --save --title=&quot;出力ファイル名を指定 (*.7z)  &quot; --filename=%n.7z --confirm-overwrite); if [ $? = 0 ]; then p=$(zenity --entry --title=&quot;パスワードを入力&quot; --text &quot;パスワード(使用しない場合はキャンセル)&quot; --hide-text); if [ $? = 0 ]; then 7z a -p$p $f %F | zenity --text-info --title=&quot;ログ&quot; --width=500 --height=350; else 7z a $f %F | zenity --text-info --title=&quot;ログ&quot; --width=500 --height=350; fi; fi</command><description>[複数可]p7zipを使用して簡単に7zファイルに圧縮</description><patterns>*</patterns><directories/><audio-files/><image-files/><other-files/><text-files/><video-files/>
</action>

<action>
<icon>gnome-mime-application-x-7z-compressed</icon><name>簡単7z展開(_Z)...</name><command>o=$(zenity --file-selection --directory --title=&quot;展開先を指定&quot;); if [ -n &quot;$o&quot; ]; then p=$(zenity --entry --hide-text --text &quot;パスワード(任意)&quot;); if [ $? = 0 ]; then 7z x -y -o$o -p$p %f | zenity --text-info --title &quot;ログ&quot; --width 500 --height=300; fi; fi</command><description>p7zipを使用して簡単に7zファイルを展開</description><patterns>*.7z</patterns><other-files/>
</action>

<action>
<icon>gnome-mime-application-x-bzip</icon><name>gzip/bzip2圧縮されたテキストを表示(_C)</name><command>e=$(echo %n | sed -e &apos;s/^.*\.\([^.]*\)$/\1/&apos;); [[ $e = &quot;gz&quot; ]] &amp;&amp; zcat %n | zenity --text-info --title %n --width 500 --height 350 || bzcat %n | zenity --text-info --title %n --width 500 --height 350</command><description>gzip/bzip2圧縮されたテキストを表示</description><patterns>*.gz;*.bz2</patterns><other-files/>
</action>

</actions>

なお、7z圧縮/展開の例において、zenityのダイアログの中ではパスワードが隠されているが、7zコマンドを-pオプションを付けて実行しているので、処理中にpsコマンドを実行すると、引数であるパスワードも見えるという点に注意。

*1:処理自体はアプリケーションに丸投げするだけなので、アプリケーション側が再帰的に読み込んで処理できるものである必要がある