ranger

提供: ArchWiki
2021年4月13日 (火) 13:01時点におけるKgx (トーク | 投稿記録)による版 (→‎ファイルをごみ箱に移動: スペースを削除)
ナビゲーションに移動 検索に移動

関連記事

ranger は Python で書かれているテキストベースのファイルマネージャです。ディレクトリは3つのカラムに分けて表示されます。キーストロークやブックマーク、マウスやコマンド履歴を使ってディレクトリを移動することができます。選択したファイルは自動的にプレビューが表示されディレクトリは中身が表示されます。

ranger の特徴: vi スタイルのキーバインド、ブックマーク、選択、タグ、タブ、コマンド履歴、シンボリックリンクを作成可能、複数あるコンソールモード、タスク表示。ranger のコマンドやキーバインドはカスタマイズすることができ、外部スクリプトを呼び出すこともできます。よく似たファイルマネージャに Vifm があり、2つのペインと vi スタイルのキーバインドを使用しますが、機能の数はやや劣ります。

インストール

ranger公式リポジトリからインストールできます。開発版を使いたい場合は AUR から ranger-gitAUR をインストールしてください。

使用方法

ranger を起動するには、まずターミナルを起動して、そこから ranger を実行してください。

キー コマンド
? マニュアルを開く、キーバインド・コマンド・設定を表示
l, Enter ファイルを起動
j, k 現在のディレクトリ内のファイルを選ぶ
h, l 上または下の階層のディレクトリへ移動

設定

起動後、ranger~/.config/ranger ディレクトリを作成します。デフォルト設定をこのディレクトリにコピーしたいときは次のコマンドを実行してください:

ranger --copy-config=all
  • rc.conf - スタートアップコマンドとキーバインド
  • commands.py - : で起動するコマンド
  • rifle.conf - 特定のファイルを起動した時に使われるアプリケーション

デフォルトファイルもロードされるので rc.conf にはデフォルトファイルとの差異部分だけを記述します。commands.py には、ファイル全体をインクルードしない場合、一番最初に以下の行を記述します:

from ranger.api.commands import *

作成したディレクトリ ~/.Trash/DD でファイルを移動するキーバインドを追加するには、~/.config/ranger/rc.conf に以下を追記します:

map DD shell mv -t /home/${USER}/.Trash %s

設定に関する詳細は man ranger を見て下さい。

ファイルをごみ箱に移動

DD を使用してごみ箱ディレクトリ ~/.local/share/Trash/files/ にファイルを移動するキーバインドを追加するには、設定ファイルを次のように変更します。

~/.config/ranger/rc.conf
...
map DD shell mv %s /home/${USER}/.local/share/Trash/files/
...

または、 glib2 パッケージで提供されている GIO コマンドラインツールを使用します。

map DD shell gio trash %s

ごみ箱 の中を見たり、空にするには通常、 nautilus のようなグラフィカルファイルマネージャがサポートしていますが、 gio list trash:// というコマンドでゴミ箱の中を見て、 gio trash--empty というコマンドでゴミ箱を空にすることもできます。

コマンドの定義

上記の例の続きに、以下のエントリを ~/.config/ranger/commands.py に追加することでゴミ箱 (~/.Trash) を空にできます:

class empty(Command):
    """:empty

    Empties the trash directory ~/.Trash
    """

    def execute(self):
        self.fm.run("rm -rf /home/myname/.Trash/{*,.[^.]*}")

使用するには :empty と入力して Enter を押してください。タブ補完も使えます。

警告: [^.] がこのコマンドの本質的部分です。書き忘れると ..* にマッチする全ファイル・ディレクトリ、すなわちホームディレクトリが全て削除されます。

カラースキーム

~/.config/rangercolorschemes サブフォルダを作成してください:

$ mkdir ~/.config/ranger/colorschemes

それから新しい newscheme.py を上記のフォルダにコピーします。~/.config/ranger/rc.conf ファイルからデフォルトカラースキームを変更してください:

set colorscheme newscheme

ファイルプレビューでのカラーハイライト

python-pygments パッケージをインストールし、 /usr/share/doc/ranger/config/scope.sh~/.config/ranger/scope.sh にコピーして、 ranger の構成ファイル内の変数 PYGMENTIZE_STYLE を必要に応じて編集します。サポートされているテーマの完全なリストは pygmentize -L style から取得できます。

ファイルの関連付け

~/.config/ranger/rifle.conf を編集してください。先の行が早く実行されるので、ファイルの先頭に追記するようにしてください。例えば、tex ファイルを kile で開くには以下のエントリを記述します:

ext tex = kile "$@"

xdg-utils で全てのファイルを開くようにするには:

has xdg-open, flag f = xdg-open "$1"

ヒントとテクニック

圧縮ファイル

以下のコマンドでは atool を使ってアーカイブの操作を行います。

アーカイブの解凍

以下のコマンドは圧縮ファイルをコピー (yy) して適切なディレクトリで :extracthere を実行します:

import os
from ranger.core.loader import CommandLoader

class extracthere(Command):
    def execute(self):
        """ Extract copied files to current directory """
        copied_files = tuple(self.fm.copy_buffer)

        if not copied_files:
            return

        def refresh(_):
            cwd = self.fm.get_directory(original_path)
            cwd.load_content()

        one_file = copied_files[0]
        cwd = self.fm.thisdir
        original_path = cwd.path
        au_flags = ['-X', cwd.path]
        au_flags += self.line.split()[1:]
        au_flags += ['-e']

        self.fm.copy_buffer.clear()
        self.fm.cut_buffer = False
        if len(copied_files) == 1:
            descr = "extracting: " + os.path.basename(one_file.path)
        else:
            descr = "extracting files from: " + os.path.basename(one_file.dirname)
        obj = CommandLoader(args=['aunpack'] + au_flags \
                + [f.path for f in copied_files], descr=descr)

        obj.signal_bind('after', refresh)
        self.fm.loader.add(obj)

圧縮

次のコマンドを使用すると、ユーザーは現在のディレクトリにあるいくつかのファイルをマークしてから :compress パッケージの名前 パッケージ名で圧縮できます。現在のディレクトリの名前を取得し、拡張子に圧縮形式を追加することにより、いくつかの圧縮形式の提案をサポートします。 atool をインストールする必要があります。インストールされていない場合、アーカイブを作成するときにエラーメッセージが表示されます。

import os
from ranger.core.loader import CommandLoader

class compress(Command):
    def execute(self):
        """ Compress marked files to current directory """
        cwd = self.fm.thisdir
        marked_files = cwd.get_selection()

        if not marked_files:
            return

        def refresh(_):
            cwd = self.fm.get_directory(original_path)
            cwd.load_content()

        original_path = cwd.path
        parts = self.line.split()
        au_flags = parts[1:]

        descr = "compressing files in: " + os.path.basename(parts[1])
        obj = CommandLoader(args=['apack'] + au_flags + \
                [os.path.relpath(f.path, cwd.path) for f in marked_files], descr=descr)

        obj.signal_bind('after', refresh)
        self.fm.loader.add(obj)

    def tab(self):
        """ Complete with current folder name """

        extension = ['.zip', '.tar.gz', '.rar', '.7z']
        return ['compress ' + os.path.basename(self.fm.thisdir.path) + ext for ext in extension]

外付けドライブ

外付けドライブは udevudisks で自動的にマウントさせることができます。gm (go, media) を押すことで /media にマウントされたドライブに簡単にアクセスできます。

隠しファイル

次のコマンドで隠しファイルの表示を切り替えることができます :set show_hidden! または :set show_hidden true を使用して隠しファイルを表示します。 これを永続的にするには、設定を構成ファイルに追加します。

rc.conf
set show_hidden true

または、zh を押して隠しファイルを切り替えることもできます。

イメージのマウント

以下のコマンドではイメージのマウントに CDemu を使用し、仮想ドライブを特定の場所 (この例では '/media/virtualrom') にマウントするために autofs などのシステムを利用します。マウントパスはあなたの設定に合わせて変更するようにしてください。

ranger から cdemud 仮想ドライブにイメージをマウントするには、イメージファイルを選択してコンソールに ':mount' と入力します。実際のマウントには設定によって多少時間がかかるので、カスタムローダーを使ってマウントディレクトリがマウントされるまで待機してからタブ 9 で裏で開くようにします。

import os, time
from ranger.core.loader import Loadable
from ranger.ext.signals import SignalDispatcher
from ranger.ext.shell_escape import *

class MountLoader(Loadable, SignalDispatcher):
    """
    Wait until a directory is mounted
    """
    def __init__(self, path):
        SignalDispatcher.__init__(self)
        descr = "Waiting for dir '" + path + "' to be mounted"
        Loadable.__init__(self, self.generate(), descr)
        self.path = path

    def generate(self):
        available = False
        while not available:
            try:
                if os.path.ismount(self.path):
                    available = True
            except:
                pass
            yield
            time.sleep(0.03)
        self.signal_emit('after')

class mount(Command):
    def execute(self):
        selected_files = self.fm.thisdir.get_selection()

        if not selected_files:
            return

        space = ' '
        self.fm.execute_command("cdemu -b system unload 0")
        self.fm.execute_command("cdemu -b system load 0 " + \
                space.join([shell_escape(f.path) for f in selected_files]))
 
        mountpath = "/media/virtualrom/"

        def mount_finished(path):
            currenttab = self.fm.current_tab
            self.fm.tab_open(9, mountpath)
            self.fm.tab_open(currenttab)

        obj = MountLoader(mountpath)
        obj.signal_bind('after', mount_finished)
        self.fm.loader.add(obj)

現在のフォルダを新しいタブで開く

ホームを新しいタブで開くショートカットは2つ存在します (gnCtrl+n)。Ctrl+n のバインドを変更する場合:

rc.conf
map <c-n>  eval fm.tab_new('%d')

PDF ファイルのプレビュー

PDF ファイルを画像に変換することで ranger で PDF ファイルをプレビューできます。Ranger は画像のプレビューを ~/.cache/ranger/ に保存します。

まず、画像プレビューを有効化してください:

~/.config/ranger/rc.conf
# Use one of the supported image preview protocols
set preview_images true

Ranger は w3m などを使って画像をプレビューします。利用可能な方法については ~/.config/ranger/rc.conf を見てください。

そして、以下の pdf プレビューコマンドを追加してください:

~/.config/ranger/scope.sh
# Image previews, if enabled in ranger.
if [ "$preview_images" = "True" ]; then
    case "$mimetype" in
        application/pdf)
             pdftoppm -jpeg -singlefile "$path" "${cached//.jpg}" && exit 6;;
    esac
fi

上記の例では popplerpdftoppm ユーティリティを使って画像プレビューを作成しています。ghostscriptimagemagick など他の方法も利用可能です。

シェルの小技

パスの同期

Ranger はシェル関数 /usr/share/doc/ranger/examples/bash_automatic_cd.sh を提供しています。ranger ではなく ranger-cd を実行すると、最後に閲覧したフォルダに自動的に cd されます。

グラフィカルランチャーから Ranger を起動した場合 ($TERMCMD -e ranger など、TERMCMD は X ターミナル)、ranger-cd は使えません。実行可能属性を付与したスクリプトを作成して:

ranger-launcher.sh
#!/bin/sh
export RANGERCD=true
$TERMCMD

シェルの設定のできるだけ最後に以下を追加してください:

.shellrc
$RANGERCD && unset RANGERCD && ranger-cd

これで RANGERCD 変数が設定されている場合のみ ranger-cd が起動します。この変数を unset するようにしてください。そうしないとターミナルからサブシェルを起動したときに自動的に ranger が再起動してしまいます。

ranger からシェルを起動

前の方法を使用すると、最後に参照したパスのシェルに切り替えることができます。ただし、いくつかの理由(多くの開かれたタブ、進行中のコピーなど)のために ranger を終了したくない場合があります。ranger sessionを失うことなく、ranger(デフォルトではS)からシェルを開始できます。残念ながら、シェルは現在のフォルダーに自動的に切り替わりません。繰り返しますが、これは実行可能スクリプトで解決できます。

shellcd
#!/bin/sh
export AUTOCD="$(realpath "$1")"

$SHELL

前と同様に、シェル構成の最後にこれを追加します:

shellrc
cd "$AUTOCD"

これで、レンジャーのシェルバインディングを変更できます:

rc.conf
map S shell shellcd %d

もしくは、シェルの history ファイルを利用することもできます。例えば、zsh の場合:

shellcd
## Prepend argument to zsh dirstack.
BUF="$(realpath "$1")
$(grep -v "$(realpath "$1")" "$ZDIRS")"
echo "$BUF" > "$ZDIRS"

zsh

ZDIRS はあなたのディレクトリスタックに置き換えてください。

シンプルな方法
rc.conf
map S shell bash -c "cd %d; bash"

上記の設定は他のシェルでも使えます。(デフォルト設定のように) シェルを実行するかわりに、シェルの中で cd を実行してから、インタラクティブシェルを起動して使用できるようにしています。

ranger が現在のシェルで動いていない場合にのみ ranger の新しいインスタンスを起動

シェルのスタートアップファイルに以下を記述してください:

rg() {
    if [ -z "$RANGER_LEVEL" ]
    then
        ranger
    else
        exit
    fi
}

rg を実行して ranger を起動・復帰してください。

トラブルシューティング

画像のプレビューでブロックノイズ

カラムのボーダーをなくすと画像プレビューでストライプが見えることがあります [1]~/.config/ranger/rc.conf に以下を設定:

set draw_borders true

参照