rangerはTUIファイラ。
rifle.conf
rifleはランチャ。どのファイルをどの外部アプリで起動するかを決定する。rifle.confはrifle設定ファイル。
構文
~/.config/ranger/rifle.confの先頭コメントを参照。
# Syntax: # <condition1> , <condition2> , ... = command
=より前は条件。=より後は実行コマンド。条件に一致したときにコマンドを実行する。
これに従って以下を読み取ってみる。
mime ^text, label editor = ${VISUAL:-${EDITOR}} -- "$@"
| 条件 | 意味 |
|---|---|
mime ^text |
MIME(ファイル種別)がtextで始まるファイルのとき(正規表現で^は行頭を表す) |
label editor |
rangerコマンドEで実行したとき |
| コマンド | 意味 |
|---|---|
${VISUAL:-${EDITOR}} -- "$@" |
Shellスクリプト。変数${VISUAL}(なければ${EDITOR})に引数を渡す |
引数
コマンドはrangerから引数を受け取れる。すなわち選択ファイルのパスである。
| シンタックス | 意味 |
|---|---|
$1〜$9 |
n番目に選択したファイルのフルパス |
$@ |
全ファイルのフルパス |
条件
| 表記 | 概要 |
|---|---|
! |
以下条件式の先頭に付与することで否定式にする |
match <regexp> |
ファイルパスが指定した正規表現に一致する |
ext <regexp> |
拡張子が指定した正規表現に一致する |
mime <regexp> |
MIMEが指定した正規表現に一致する |
name <regexp> |
ファイル名basenameが指定した正規表現に一致する |
path <regexp> |
絶対パスが指定した正規表現に一致する |
has <program> |
指定したプログラムが存在する($PATH配下。typeコマンド?) |
env <variable> |
指定した環境変数が存在する(typeコマンド?) |
file |
ファイルである |
directory |
ディレクトリである |
number <n> |
コマンドの数(?) |
terminal |
端末である(stdin, stderr, stdoutが接続されている) |
X |
Xorgが実行されている($DISPLAYが空でない) |
副作用がある疑似条件は以下。
| 表記 | 概要 |
|---|---|
flag <flag> |
プログラムの実行方法を変更する( |
label <label> |
コマンドにラベルを割当る。:open_with <label>, refile -p <label>で実行可能 |
else |
常に真(?) |
| 概要 | |
|---|---|
f |
バックグラウンド実行する。setsid $command >& /dev/null & |
r |
root権限で実行する。sudo $command |
t |
新しい端末で実行する。$TERMCMD -e $command($TERMCMD未定義時は$TERM) |
c |
複数ファイルをマークしても現在のファイルのみ実行する(※rangerでrifle使用時のみ使用可) |
~/.config/ranger/rifle.confに定義されていた<label>はeditorなどがある。
| shell変数 | ranger設定値 | bash起動時点 | |
|---|---|---|---|
editor |
$EDITOR |
vim |
(none) |
pager |
$PAGER |
less |
(none) |
wallpaper |
(none) | (none) | (none) |
各
確認方法は以下。ranger上のコンソール(# :shell -p)とターミナル上で以下を実行する。
echo -e "${VISUAL}\n${EDITOR}\nsensible-editor"
echo "${PAGER}"
echo "${WALLPAPER}"
echo "${VIEWER}"
ついでにtypeコマンドで確かめてみた。
$ type editor
editor は /usr/bin/editor です
/usr/bin/editorは/etc/alternatives/editorのリンクらしい。
$ ls -l /usr/bin/editor | grep 'editor' lrwxrwxrwx 1 root root 24 11月 13 22:04 /usr/bin/editor -> /etc/alternatives/editor
/etc/alternatives/editorは/bin/nanoのリンク。
$ ls -l /etc/alternatives/editor | grep 'editor' lrwxrwxrwx 1 root root 9 11月 13 22:04 /etc/alternatives/editor -> /bin/nano
/bin/nanoは実行ファイル。TUI(CUI)テキストエディタ。
$ ls -l /bin/nano -rwxr-xr-x 1 root root 181780 1月 11 2017 /bin/nano
だがrangerではvimで起動する。よってrangerが使っているのはrifle.confで定義されているように${EDITOR}である。alternativesの定義ではない。そして${EDITOR}にvimが設定されている。これはrangerが起動した後の処理でされている。どこかは特定できなかった。おそらく設定ファイルでは変更不可。
できれば自分でもラベルを新設したかった。値の設定も。
コマンド
| コマンド | 概要 |
|---|---|
ask |
:open_withコマンドが開く。起動アプリを指定して開く。 |
| (他) | shellで実行できるコマンド |
条件, 条件, ... = コマンド
~/.config/ranger/rifle.conf
mime ^text, label editor = vim "$@"
たとえば上記なら次の意味となる。「MIMEがtextから始まりrangerにてEキーで起動したとき、vim "選択ファイルパス1 選択ファイルパス2 ..."を実行する」
引数の項で書いたとおり$1, $@などが使える。これはrangerで選択したファイルパスである。また、以下の変数もranger内で定義されるらしい。
| 変数 | 値 |
|---|---|
${EDITOR} |
vim |
${PAGER} |
less |
コマンド部分をもう少し複雑にしたいときもある。やはりshellの技術を使う。
| 方法 | 記述 |
|---|---|
| そのまま | ${EDITOR} "$1" |
| 外部ファイル化 | bash ~/a.sh "$@" |
| 複数行スクリプトを文字列で | bash -c "echo A && ~/a.sh' '$1" |
${VISUAL:-${EDITOR}}
${VISUAL:-${EDITOR}} -- "$@"とは何か。
rifle.conf内に${VISUAL:-${EDITOR}}の記述がある。これはshell構文の変数展開。変数${VISUAL}を使う。なければ${EDITOR}を使う。
Linuxの慣習? として変数VISUAL, EDITORなどにvimなどのテキストエディタコマンド名を入れることがある。つまりテキストエディタにファイルパスを渡して実行する。
ちなみにLinuxの中でもDebianはEDITOR等が空である。代わりにsensible-editorコマンドでその役割をするらしい。よって${VISUAL:-${EDITOR:-sensible-editor}}のように変更するほうが動作する環境が増える。sensible-editorで起動するエディタを決定するにはselect-editorコマンドを使う。
-- "$@"
rifle.conf内で-- "$@"という表記をよくみる。この--が謎。
# mime ^text, label editor = ${VISUAL:-$EDITOR} -- "$@"
--がないものもある。
ext pdf, has llpp, X, flag f = llpp "$@"
set --というのがあり、空白文字を分割して位置引数としてセットできるらしい。それのことか?
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12
- python 2.7.13, pip 9.0.1
- python3 3.5.3, pip3 9.0.1
- ranger 1.9.2
$ uname -a Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux