やってみる

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

ファイラrangerのインストールと設定(1.9.2)

 便利ツールだがインストールと設定が煩雑なのでまとめた。

ranger

 rangerはTUIファイルマネージャ。軽量。Python製。vim風の操作。

 外部ツールを使って以下のようなこともできる。

  • 画像ファイルのプレビュー
  • テキストファイルのプレビュー(シンタックス・ハイライト)

外部ツール

グループ ツール
TextBrowser w3m lynx elinks
SyntaxHighlight highlight Pygments
Archve atool unrar
文字コード解析 chardet
画像をASCII文字表示 img2txt
クリップボード xsel xclip pbcopy
画像メタデータ表示 exiftool
動画メタデータ表示 mediainfo ffmpegthumbnailer
PDFをテキスト化 pdftotext
画像編集ツール ImageMagick (identify, convert)

手順

  1. インストール
  2. 設定

 なお、面倒ならインストールと設定を自動化する以下スクリプトを使う。詳細は後述。

install_ranger.sh

#!/bin/bash
set -Ceu
#-----------------------------------------------------------------------------
# install_ranger.sh
# 作成日時: 2019-03-16 12:53:39
#-----------------------------------------------------------------------------
Install() {
    # 罠
    # * apt, pip, どちらもスペース区切りで複数やると勝手に途中で終了することがある。1個ずつやること。
    # * 実行コマンド名とインストール名が異なるものがある。`pip search ranger-fm`などでパッケージ名を検索して見つけること。

#  pip3 install ranger-fm Pygments lynx elinks atool unrar-free pymediainfo xpdf-python chardet img2txt
#  pip install ranger-fm Pygments lynx elinks atool unrar pymediainfo xpdf-python chardet img2txt
    sudo pip3 install ranger-fm
#  sudo pip3 install Pygments
#  sudo pip3 install pyhighlight
    sudo pip3 install lynx
    sudo pip3 install elinks
    sudo pip3 install atool
    sudo pip3 install unrar
    sudo pip3 install pymediainfo
    sudo pip3 install xpdf-python
    sudo pip3 install chardet
    sudo pip3 install img2txt

#  sudo apt install -y xsel w3m xpdf caca-utils
#  sudo apt install -y xsel exiftool mediainfo w3m pdftotext mutool caca-utils ImageMagick
    sudo apt install -y xsel
    sudo apt install -y exiftool
    sudo apt install -y mediainfo
    sudo apt install -y w3m
    sudo apt install -y highlight

    #E: パッケージ pdftotext が見つかりません
    # Debianでは xpdf という名前でインストールする。実行コマンド名は pdftotext
#  sudo apt install -y pdftotext
    sudo apt install -y xpdf
#  sudo apt install -y mutool
    #E: パッケージ mutool が見つかりません
    # $ apt search mutool
    # mupdf-tools/stable,stable,stable,stable,stable 1.9a+ds1-4+deb9u4 armhf
    #   command line tools for the MuPDF viewer
    sudo apt install -y mupdf-tools
    sudo apt install -y caca-utils
    sudo apt install -y imagemagick
    sudo apt install -y ffmpegthumbnailer
    # 画像表示に対応したターミナル
    sudo apt install -y terminology

    # Linux.Debian.Raspbianでは存在しないものがいくつかある
    # 注意、'exiftool' の代わりに 'libimage-exiftool-perl' を選択します
    # E: パッケージ pdftotext が見つかりません
    # E: パッケージ mutool が見つかりません
    # $ exiftool
    # bash: exiftool: コマンドが見つかりません
    # img2txtはcaca-utilsに含まれているはずなのにない。
    # $ img2txt
    # bash: img2txt: コマンドが見つかりません

    # すべてaptで入れるときは以下。(欠点: 1. 最新版ではない 2. unrarはビルド必要のため入れられない 注意: 1. 一部別物(pygments:highlight) 2. 一部名前が違う(img2txt:caca-utils))
    # sudo apt install -y ranger w3m lynx highlight atool mediainfo xpdf caca-utils
    # ranger ハイライト設定 /home/pi/.config/ranger/scope.sh は Pygments でなく highlight。highlightはpipにない。pyhighlightがそれかと思ったが違った。
    # 変数: HIGHLIGHT_STYLE='pablo'
    # highlight --list-themes
    # http://www.andre-simon.de/doku/highlight/en/theme-samples.php
    # ターミナルの色は通常8色のみ。
    # $ tput colors
    # 8
    # これを256色にするには以下。
    # $ export TERM=xterm-256color
    # $ tput colors
    # 256
#  sudo apt install -y highlight
}
Setup() {
    [[ -f ~/.config/ranger/rc.conf ]] && echo "設定ファイルは既存のため終了します。"; exit;

    # rangerの設定ファイル出力
    ranger --copy-config=all

    # rc.confの設定
    rcconf=~/.config/ranger/rc.conf
    sed -i -e 's/^set draw_borders .*$/set draw_borders both/g' "${rcconf}"
    sed -i -e 's/^set preview_images .*$/set preview_images true/g' "${rcconf}"
    sed -i -e 's/^set show_hidden .*$/set show_hidden true/g' "${rcconf}"

    # rifle.confの設定
    local rifle=~/.config/ranger/rifle.conf
    targets=$(cat << 'EOS'
ext py  = python -- "$1"
ext pl  = perl -- "$1"
ext rb  = ruby -- "$1"
ext js  = node -- "$1"
ext sh  = sh -- "$1"
ext php = php -- "$1"
EOS
)
    echo "$targets" | ( while read target; do sed -i -e 's/^'"${target}"'$/'"${target}"' | less/g' "${rifle}"; done;)
    #echo "$targets" | ( while read target; do echo "$target" | sed -e 's/^'"${target}"'$/'"${target}"' | less/g'; done;)

    # ~/.bashrcに256色にする設定がなければ追記
    append='export TERM=xterm-256color'
    [[ -z $(cat ~/.bashrc | grep "^${append}$") ]] && echo "$append" >> ~/.bashrc
    #   サブシェルのネスト防止(`S`でサブシェル起動したらネストしないよう`exit`で終了する。)
    #   表示継続(`du`コマンド等は一瞬で表示が消えてしまい役に立たない。これを回避する)
    append='ranger() { [ -n "$RANGER_LEVEL" ] && exit || LESS="$LESS -+F -+X" command ranger "$@"; }'
    [[ -z $(cat ~/.bashrc | grep "^${append}$") ]] && echo "$append" >> ~/.bashrc
    #   `S`でrangerのサブシェルに入ったらプロンプト表示に(ranger)と表示する
    append='[ -n "$RANGER_LEVEL" ] && PS1="(RANGER) $PS1"'
    [[ -z $(cat ~/.bashrc | grep "^${append}$") ]] && echo "$append" >> ~/.bashrc
}
Run() {
    Install
    Setup
}
Run

 シンタックスハイライトしたいなら以下も参照してインストールすること。

1. インストール

 パッケージマネージャからインストールする。

1-1. パッケージマネージャ

No パッケージマネージャ コマンド 補足
1 OSパッケージマネージャ Linux.Debian.Raspbian: apt バージョンが古い
2 Pythonパッケージマネージャ pip, pip3 最新版

 パッケージマネージャによって以下のような違いがある。非常に混乱する。

  • バージョンが違う
  • パッケージ名が違う

 ここでは最新版をインストールしたいのでpipにてインストールする。pip3でも同じと思われる。

 以下でそれぞれのパッケージマネージャにてrangerを検索。バージョンを比較する。

apt search ranger | grep 'ranger'
pip search ranger-fm | grep 'ranger-fm'

 2019-03-16時点で以下のようになった。aptのほうが古い。

ranger/stable,stable,stable,stable,stable 1.7.1-1 all
ranger-fm (1.9.2)                      - Vim-like file manager

1-1-1. pip

sudo pip3 install ranger-fm
sudo pip3 install Pygments
sudo pip3 install lynx
sudo pip3 install elinks
sudo pip3 install atool
sudo pip3 install unrar
sudo pip3 install chardet
sudo pip3 install img2txt

 他、pip(pip3)には存在せず、aptでしか入れられないものを以下でインストールする。

 シンタックス・ハイライトするならPygmentsでなくhighlightのほうが高速。

sudo apt install -y xsel
sudo apt install -y exiftool
sudo apt install -y mediainfo
sudo apt install -y w3m
sudo apt install -y highlight

sudo apt install -y xpdf
sudo apt install -y mupdf-tools
sudo apt install -y caca-utils
sudo apt install -y imagemagick
sudo apt install -y ffmpegthumbnailer

1-2. 起動

 ターミナルで以下のコマンドを打つと起動する。

ranger

 バージョン情報やヘルプは以下。

ranger --version
ranger --help

2. 設定

  1. デフォルト設定ファイル作成
  2. ターミナル設定

2-0. デフォルト設定ファイル作成

ranger --copy-config=all

 ~/.config/ranger/配下に以下の設定ファイルが作成されたはず。

ファイル 設定内容
rc.conf ranger起動時に設定されるオプション、コマンドの設定
rifle.conf ファイル起動時に使用するアプリケーションの設定
scope.sh ファイルのプレビュー表示の設定
commands_full.py :で入力できるコマンドすべて
commands.py :で入力できるコマンド(ユーザが任意で作成)

 これをカスタマイズする。

2-1. rc.conf

  1. テキストエディタで開く
  2. set draw_borders等で検索する
  3. 編集する

 面倒なら以下コマンドで一発。

rcconf=~/.config/ranger/rc.conf
sed -i -e 's/^set draw_borders .*$/set draw_borders both/g' "${rcconf}"
sed -i -e 's/^set preview_images .*$/set preview_images true/g' "${rcconf}"
sed -i -e 's/^set show_hidden .*$/set show_hidden true/g' "${rcconf}"
2-1-1. 境界線

before

set draw_borders none

after

set draw_borders both

 both以外だと画像を表示した後に再描画がされずに残ってしまう。

 もっとも、bothでも再描画に問題がある。画像が表示された後、その領域に何かのテキストを表示させるまで画像が残ってしまう。他の設定値separators, outline, noneはテキスト表示後も部分的に残ってしまう。bothが最もマシなだけ。いずれにせよ、今回試した最新バージョン1.9.2では画像表示させた部分が正しく再描画されない。

 なお、古いバージョンではtruefalseしか無かった模様。このときもtrueにしないと再描画されないバグがあった。バージョン1.9.2の今回でも未だに修正されていない。

 私としては境界線を表示しないまま正しく再描画して欲しい。

2-1-2. 画像表示

before

set preview_images false

after

set preview_images true

 ターミナルアプリによっては表示できない。Raspbian標準のlxterminalでは画像表示されない。terminologyなら表示される。

sudo apt install -y terminology

 画面キャプチャを取得しようとしたがscrotでは正しく取得できなかった。画像部分だけが表示されない状態になってしまった。raspi2pngによるキャプチャが必要。raspi2pngにてスクリーン全体をキャプチャしてGIMPで切り抜いた画像が以下。

f:id:ytyaru:20190317222108p:plain

 また、先述の通り再描画バグがある。画像表示後にテキスト表示するまで画像が残り続けてしまう。テキストを表示しても空行箇所は再描画されない。

f:id:ytyaru:20190317223847p:plain

 空行のところに画像が残ってしまっている。

 正しくはそれぞれ以下のように表示されるはず。

f:id:ytyaru:20190317223926p:plain

f:id:ytyaru:20190317223934p:plain

 画像表示に問題あり。これは誰が悪いのか。ranger, w3m, terminologyのどれかだと思う。

2-1-3. 隠しファイル表示

 .bashrcなど.から始まるファイルなどを表示する。

before

set show_hidden false

after

set show_hidden true

2-2. scope.sh

  1. ハイライト処理
  2. プログラム実行結果の表示
2-2-1. ハイライト処理

 ファイル種別ごとにおける処理の実装。

 たとえばシンタックス・ハイライトの処理は以下。

...
handle_mime() {
    local mimetype="${1}"
    case "${mimetype}" in
        # Text
        text/* | */xml)
...
            highlight --replace-tabs="${HIGHLIGHT_TABWIDTH}" --out-format="${highlight_format}" \
                --style="${HIGHLIGHT_STYLE}" --force -- "${FILE_PATH}" && exit 5
            #pygmentize -f "${pygmentize_format}" -O "style=${PYGMENTIZE_STYLE}" -- "${FILE_PATH}" && exit 5
...

 デフォルトではhighlightコマンドにてハイライトしている。Pygmentsを使いたければhighlightコマンドをコメントアウトしてpygmentizeコメントアウトを解除すればいい。

 また、各コマンドの引数も指定できる。highlight--style${HIGHLIGHT_STYLE}である。デフォルトではHIGHLIGHT_STYLE='pablo'となっている。この値はhighlight --list-themesで一覧できる。

2-2-2. プログラム実行結果の表示

 rangerではソースコードを即実行できる。だが結果の表示が一瞬で消えてしまう。これを改善する設定をする。

 rangerを起動してpythonソースコードファイルを選択中にr, 2, <Enter>とするとPythonインタプリタが実行される。だが、結果の表示が一瞬で消えてしまう。そこでlessコマンドを使って表示するよう改善する。なお、less"${PAGER}"でも可。

   # rifle.confの設定
    local rifle=~/.config/ranger/rifle.conf
    targets=$(cat << 'EOS'
ext py  = python -- "$1"
ext pl  = perl -- "$1"
ext rb  = ruby -- "$1"
ext js  = node -- "$1"
ext sh  = sh -- "$1"
ext php = php -- "$1"
EOS
)
    echo "$targets" | ( while read target; do sed -i -e 's/^'"${target}"'$/'"${target}"' | less/g' "${rifle}"; done;)
}

 ようするに以下。

before

ext py  = python -- "$1"

after

ext py  = python -- "$1" | less

 末尾に| lessを付与してやる。これをperl, rubyなどに対しても行う。

2-3. ターミナル設定

2-3-1. 256色

 シンタックス・ハイライトするとき256色にする。(デフォルトは8色)

~/.bashrc

# 2019-03-16 ターミナルで256色使う $ tput colors
export TERM=xterm-256color

 コマンドで追記したいなら以下。未記入なら追記する。

append='export TERM=xterm-256color'
[[ -z $(cat ~/.bashrc | grep "^${append}$") ]] && echo "$append" >> ~/.bashrc

 ~/.bashrcに上記コマンドを追記しておけば常に256色モードでターミナルが起動する。シンタックス・ハイライトするとき256色使いたいなら設定すべし。256色に対応したターミナルアプリである必要がある。Raspbian標準のlxterminalは対応する。

 シンタックス・ハイライターは以下でインストールする。

sudo apt install -y highlight

 他にもsudo pip3 install Pygmentsがある。しかしPygmentsは動作が遅い。表示までに数秒かかってしまう。

2-3-2. ranger改善

   #   サブシェルのネスト防止(`S`でサブシェル起動したらネストしないよう`exit`で終了する。)
    #   表示継続(`du`コマンド等は一瞬で表示が消えてしまい役に立たない。これを回避する)
    append='ranger() { [ -n "$RANGER_LEVEL" ] && exit || LESS="$LESS -+F -+X" command ranger "$@"; }'
    [[ -z $(cat ~/.bashrc | grep "^${append}$") ]] && echo "$append" >> ~/.bashrc
    #   `S`でrangerのサブシェルに入ったらプロンプト表示に(ranger)と表示する
    append='[ -n "$RANGER_LEVEL" ] && PS1="(RANGER) $PS1"'
    [[ -z $(cat ~/.bashrc | grep "^${append}$") ]] && echo "$append" >> ~/.bashrc

 コメントの通り。

所感

 使えるまでが辛い。インストール、設定、キー覚える。ここまでのハードルが高い。これを超えたら高速で快適。

 設定ダイアログがないのが辛い。設定ファイルを眺めてテキスト編集しかない。「設定ファイルはどこか」「何の設定があるか」「何の値が入りうるか」を調べるので手間どる。

 自前で挙動を実装できるのは素敵。ファイル種別ごとの起動はシェル、:によるコマンドはPythonで実装する。scope.shcommands.py。だがそれだけの技術が必要。

対象環境

  • 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

前回まで

 以前1.8.1のときのrangerについて色々やった。設定などが微妙に変わっていたので改めてやってみた。