ranger

出自 ArchWiki

ranger 是一个用 Python 编写的基于文本的文件管理器。目录在一个窗格中以三列显示。可以通过按键、书签、鼠标或命令历史记录在它们之间移动。文件预览和目录内容会自动显示在当前选定的项目上。

功能包括:vi 风格的按键绑定、书签、选择、标记、标签页、命令历史记录、创建符号链接的能力、多种控制台模式和任务视图。ranger 具有可自定义的命令和按键绑定,包括绑定到外部脚本。Ranger 还自带 文件打开器 rifle(1)

最接近的竞争对手是 lfVifm

安装

安装 ranger 软件包,或者 ranger-gitAUR 获取开发版本。

用法

要启动 ranger,请启动一个终端并运行 ranger

命令
? 打开手册或列出快捷键绑定、命令和设置
l, Enter 启动文件
j, k 选择当前目录中的文件
h, l 在目录树中向上和向下移动

配置

启动后,ranger 会创建一个目录 ~/.config/ranger。要将默认配置复制到此目录,请执行以下命令

$ ranger --copy-config=all

之后,将 RANGER_LOAD_DEFAULT_RC=false 设置为环境变量,以避免加载全局配置和本地配置。

  • rc.conf - 启动命令和快捷键绑定
  • commands.py - 使用 : 启动的命令
  • rifle.conf - 启动给定类型文件时使用的应用程序。

rc.conf 只需要包含与默认文件的更改,因为两者都会被加载。对于 commands.py,如果您不包含整个文件,请在顶部放置此行

from ranger.api.commands import *

有关常规配置,请参阅 ranger(1)

移至回收站

要添加一个快捷键绑定,使用 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 清空它。

定义命令

继续上面的示例,添加以下条目以清空回收站目录 ~/.Trash

~/.config/ranger/commands.py
...

class empty(Command):
    """:empty

    Empties the trash directory ~/.Trash
    """

    def execute(self):
        self.fm.run("rm -rf /home/myname/.Trash/")

要使用它,输入 :emptyEnter,并根据需要使用 Tab 补全。

配色方案

Ranger 带有四种配色方案:defaultjunglesnowsolarized。您可以使用以下命令更改您的配色方案

set colorscheme scheme

自定义配色方案可以放在 ~/.config/ranger/colorschemes 中。

文件预览中的颜色高亮

安装 python-pygments 软件包,然后将 /usr/share/doc/ranger/config/scope.sh 复制到 ~/.config/ranger/scope.sh 并编辑 ranger 配置文件中的变量 PYGMENTIZE_STYLE 以符合您的喜好。可以通过 pygmentize -L style 获取支持主题的完整列表。

文件关联

Ranger 使用自己的文件打开器,称为 rifle。它在 ~/.config/ranger/rifle.conf 中配置。如果它不存在,请运行 ranger --copy-config=rifle。例如,以下行使 kile 成为 tex 文件的默认程序

ext tex = kile "$@"

要使用 xdg-utils 打开所有文件,请确保您的 $EDITOR$PAGER 已设置并添加

else = xdg-open "$1"
label editor = "$EDITOR" -- "$@"
label pager  = "$PAGER" -- "$@"

技巧与提示

本文或章节需要语言、wiki 语法或风格方面的改进。请参阅 Help:Style 以供参考。

原因: 风格不良 (在 Talk:Ranger 中讨论)

压缩文件

这些命令使用 atool 执行压缩文件操作。

解压压缩文件

以下命令实现了将选定项目解压到当前目录。

import os
from ranger.core.loader import CommandLoader

class extract_here(Command):
    def execute(self):
        """ extract selected files to current directory."""
        cwd = self.fm.thisdir
        marked_files = tuple(cwd.get_selection())

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

        one_file = marked_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(marked_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 marked_files], descr=descr,
                            read=True)

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

压缩

以下命令允许用户通过标记当前目录中的多个文件,然后调用 :compress package name 来压缩它们。它通过获取当前目录的基本名称并附加扩展名的几种可能性来支持名称建议。您需要安装 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, 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]

外部驱动器

可以使用 udevudisks 自动挂载外部驱动器。转到常用挂载点 /media/run/media/$USER 的默认快捷键映射分别是 gmgi

隐藏文件

您可以使用以下命令切换隐藏文件的可见性::set show_hidden!,或使用 :set show_hidden true 使隐藏文件可见。

要使其永久生效,请将设置添加到您的配置文件

rc.conf
set show_hidden true

或者,可以通过按 zh 切换隐藏文件。

镜像挂载

以下命令假定您正在使用 CDemu 作为您的镜像挂载器和某种像 autofs 这样的系统,它将虚拟驱动器挂载到指定位置(在本例中为 '/media/virtualrom')。不要忘记更改 mountpath 以反映您的系统设置

要从 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)

在当前文件夹中打开新标签页

您可能已经注意到,有两个快捷方式可以在主目录中打开新标签页(gnCtrl+n)。让我们重新绑定 Ctrl+n

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

PDF 文件预览

默认情况下,ranger 会将 PDF 文件预览为文本。但是,您可以通过首先将 PDF 文件转换为图像,在 ranger 中将 PDF 文件预览为图像。Ranger 将图像预览存储在 ~/.cache/ranger/ 中。您需要手动创建此目录,或者在 ~/.config/ranger/rc.conf 中将 preview_images 设置为 true,以告诉 ranger 在下次启动时自动创建它。但是请注意,预览 PDF 文件为图像,并不需要一直将 preview_images 设置为 true,只需要 ~/.cache/ranger 目录即可。

要启用此功能,请取消注释 /usr/share/doc/ranger/config/scope.sh 中相应的行,或者在您的本地文件 ~/.config/ranger/scope.sh 中添加/取消注释这些行。

Shell 技巧

同步路径

Ranger 提供了一个 shell 函数 /usr/share/doc/ranger/examples/shell_automatic_cd.sh。运行 ranger_cd 而不是 ranger 将自动 cd 到上次浏览的文件夹。

如果您从图形启动器(例如 $TERMCMD -e ranger,其中 TERMCMD 是 X 终端)启动 ranger,则无法使用 ranger_cd。相反,创建一个可执行脚本

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

并在 shell 配置的末尾添加以下内容

.shellrc
$RANGERCD && unset RANGERCD && ranger_cd

只有在设置了 RANGERCD 变量时,才会启动 ranger_cd。再次取消设置此变量非常重要,否则从此终端启动子 shell 将自动重新启动 ranger

防止 ranger 实例嵌套

您可以使用 S 在当前目录中启动 shell,当您退出 shell 时,您将返回到您的 ranger 实例。

但是,当您忘记您已经在 ranger shell 中并再次启动 ranger 时,您最终会得到 ranger 运行 shell 运行 ranger。

为了防止这种情况,您可以在您的 shell 启动文件中创建以下函数

ranger() {
    if [ -z "$RANGER_LEVEL" ]; then
        /usr/bin/ranger "$@"
    else
        exit
    fi
}

参见