🔖

rangerのインストール方法と初期設定

2023/08/08に公開

ターミナル上で動作するファイルマネージャ。
初期設定が必要だがファイルマネージャ機能以外にもグラフィカルなディレクトリ移動も搭載している。
また選択しているファイルに応じてプレビューする機能なども搭載。


インストール方法

rangerそのものと、依存パッケージをインストールと初期設定

sudo apt install -y ranger w3m lynx highlight atool mediainfo xpdf caca-utils
ranger --copy-config=all

※pipパッケージとしても提供されているので管理者でない場合はpipコマンドでインストール。

pip install ranger-fm
ranger --copy-config=all

rangerコマンドでファイルマネージャ画面を起動することができる。
終了はqキーを押下することで可能。


ディレクトリ移動機能

~/.bashrcに以下を書き込むことでCtrl + orangerを起動し、更にqキーで終了時に現在表示しているディレクトリに自動的に移動することができる。
また、sfiht + srangerを起動した状態でシェルを起動(サブシェル)することができる($ (in ranger)と表示される)。

~/.bashrc
# ranger settings
# Compatible with ranger 1.5.3 through 1.7.*
#
# Change the prompt when you open a shell from inside ranger
#
# Add this line to your .bashrc for it to work.

[ -n "$RANGER_LEVEL" ] && PS1="$PS1"'(in ranger) '

# ranger_cd
ranger_cd() {
    temp_file="$(mktemp -t "ranger_cd.XXXXXXXXXX")"
    ranger --choosedir="$temp_file" -- "${@:-$PWD}"
    if chosen_dir="$(cat -- "$temp_file")" && [ -n "$chosen_dir" ] && [ "$chosen_dir" != "$PWD" ]; then
        cd -- "$chosen_dir"
    fi
    rm -f -- "$temp_file"
}

# This binds Ctrl-O to ranger_cd:
if which ranger >& /dev/null && [[ -t 1 ]]; then
    bind '"\C-o":"ranger_cd\C-m"'
fi

pluginの導入

以下で公式で展開されているpluginを導入できる。

git clone https://github.com/ranger/ranger.git
mkdir ~/.config/ranger/plugins
cp ./ranger/examples/plugin_file_filter.py ~/.config/ranger/plugins
cp ./ranger/examples/plugin_hello_world.py ~/.config/ranger/plugins
cp -r ./ranger/ranger/colorschemes ~/.config/ranger

カスタマイズ

以下を実行することで見栄えを変更することができる(自分用)。

sed -i 's/set show_hidden false/set show_hidden true/' ~/.config/ranger/rc.conf
sed -i 's/set draw_borders none/set draw_borders both/' ~/.config/ranger/rc.conf
sed -i 's/set preview_directories true/set preview_directories false/' ~/.config/ranger/rc.conf
sed -i 's/set line_numbers false/set line_numbers true/' ~/.config/ranger/rc.conf
sed -i 's/set dirname_in_tabs false/set dirname_in_tabs true/' ~/.config/ranger/rc.conf
sed -i 's/set one_indexed false/set one_indexed true/' ~/.config/ranger/rc.conf
# sed -i 's/set colorscheme default/set colorscheme solarized/' ~/.config/ranger/rc.conf

以下のように見栄えが変わる。

  • 隠しファイルを表示
  • 境界線の表示
  • サブディレクトリのプレビューを非表示
  • ファイルに行番号を表示
  • タブ表示時にタブに現在のディレクトリを表示
  • 行番号を1から開始
  • コメントアウト: rangerのテーマをsolarizedに変更。
    他にdefault, jungle, snowが選択可能
    2023/08/03現在、solarizedはエラーが出て使えなくなっている模様。

他にも設定できる項目が非常に多いので詳細についてはreferencesに記載しているリンクを参照。


コマンドの追加

~/.config/ranger/commands.pyに追記することでranger起動時に
使用可能なコマンドを追加することができる。

圧縮コマンドの追加

以下で圧縮コマンドの実装方法が展開されている。
https://wiki.archlinux.org/title/Ranger#Compression

追加用ヒアドキュメント
cat >> ~/.config/ranger/commands.py << EOF

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, read=True)

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

    def tab(self, tabnum):
        """ 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]
EOF

例えば圧縮したいファイルを選択した状態で: -> compress hoge.zipのように入力すれば
hoge.zipで保存される。


fzfの統合

設定後に: -> fzf_selectで現在のディレクトリ配下のファイルを再帰的に検索することができる。
fzfのインストール方法についてはこちらを参照。

追加用ヒアドキュメント
cat >> ~/.config/ranger/commands.py << EOF

class fzf_select(Command):
    """
    :fzf_select
    Find a file using fzf.
    With a prefix argument to select only directories.

    See: https://github.com/junegunn/fzf
    """

    def execute(self):
        import subprocess
        import os
        from ranger.ext.get_executables import get_executables

        if 'fzf' not in get_executables():
            self.fm.notify('Could not find fzf in the PATH.', bad=True)
            return

        fd = None
        if 'fdfind' in get_executables():
            fd = 'fdfind'
        elif 'fd' in get_executables():
            fd = 'fd'

        if fd is not None:
            hidden = ('--hidden' if self.fm.settings.show_hidden else '')
            exclude = "--no-ignore-vcs --exclude '.git' --exclude '*.py[co]' --exclude '__pycache__'"
            only_directories = ('--type directory' if self.quantifier else '')
            fzf_default_command = '{} --follow {} {} {} --color=always'.format(
                fd, hidden, exclude, only_directories
            )
        else:
            hidden = ('-false' if self.fm.settings.show_hidden else r"-path '*/\.*' -prune")
            exclude = r"\( -name '\.git' -o -name '*.py[co]' -o -fstype 'dev' -o -fstype 'proc' \) -prune"
            only_directories = ('-type d' if self.quantifier else '')
            fzf_default_command = 'find -L . -mindepth 1 {} -o {} -o {} -print | cut -b3-'.format(
                hidden, exclude, only_directories
            )

        env = os.environ.copy()
        env['FZF_DEFAULT_COMMAND'] = fzf_default_command
        env['FZF_DEFAULT_OPTS'] = '--height=40% --layout=reverse --ansi --preview="{}"'.format('''
            (
                batcat --color=always {} ||
                bat --color=always {} ||
                cat {} ||
                tree -ahpCL 3 -I '.git' -I '*.py[co]' -I '__pycache__' {}
            ) 2>/dev/null | head -n 100
        ''')

        fzf = self.fm.execute_command('fzf --no-multi', env=env,
                                      universal_newlines=True, stdout=subprocess.PIPE)
        stdout, _ = fzf.communicate()
        if fzf.returncode == 0:
            selected = os.path.abspath(stdout.strip())
            if os.path.isdir(selected):
                self.fm.cd(selected)
            else:
                self.fm.select_file(selected)
EOF

以下でキーバインドも追加

echo 'map <A-f> fzf_select' >> ~/.config/ranger/rc.conf

Alt + fで起動可能


よく使うコマンド

アクション コマンド 備考
ファイルのリネーム ファイルを選択した状態でF2 or a リネーム後はEnterで確定
実行権限を付与 ファイルを選択した状態で+ -> x
新規ファイルの作成 : -> edit
圧縮ファイルの解凍 圧縮ファイルを選択した状態で1(数字の1) -> l(アルファベットのL) zip, tar.gzを解凍できることを確認
millermultipaneの切り替え ~ multipaneは各タブを水平分割開くことができる
新規タブを開く, 作成したタブに移動 alt + 数字 アクティブなタブを閉じたい場合はqを押下

references

Discussion