やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

rangerの設定 rifle.confの書き方

 rangerはTUIファイラ。

rifle.conf

 rifleはランチャ。どのファイルをどの外部アプリで起動するかを決定する。rifle.confrifle設定ファイル。

構文

 ~/.config/ranger/rifle.confの先頭コメントを参照。

# Syntax:
#   <condition1> , <condition2> , ... = command
  1. 条件
  2. コマンド

 =より前は条件=より後は実行コマンド。条件に一致したときにコマンドを実行する。

 これに従って以下を読み取ってみる。

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 1113 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 1113 22:04 /etc/alternatives/editor -> /bin/nano

 /bin/nanoは実行ファイル。TUI(CUI)テキストエディタ

$ ls -l /bin/nano
-rwxr-xr-x 1 root root 181780  111  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 "$@"

 たとえば上記なら次の意味となる。「MIMEtextから始まり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の中でもDebianEDITOR等が空である。代わりに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