跳转至内容

ranger

来自 ArchWiki

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

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

最接近的竞争对手是 lfVifm

安装

安装 ranger 软件包。

用法

要启动 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/")

要使用它,输入 :empty 并按 Enter,可根据需要使用 Tab 补全。

配色方案

Ranger 自带四种配色方案:default, jungle, snowsolarized。您可以使用以下命令更改配色方案

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 包名 来压缩当前目录下的多个文件。它支持通过获取当前目录的基名并附加几种可能的扩展名来提供名称建议。您需要安装 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')。不要忘记更改挂载路径以反映您的系统设置

要从 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 文件预览

PDF 文本预览

默认情况下,ranger 将 PDF 文件预览为文本,无需额外配置。

PDF 图像预览

您可以在 ranger 中将 PDF 文件预览为图像,方法是先将 PDF 文件转换为图像。为了使此功能正常工作,您需要安装 pdftoppm(1),它是 poppler 软件包的一部分。

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 到最后浏览的文件夹。

如果您从图形启动器启动 ranger(例如 $TERMCMD -e ranger,其中 TERMCMD 是一个 X 终端),则无法使用 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,而该 shell 又运行着 ranger。

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

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

Wayland 上的图像预览

Ueberzugpp 作为 ueberzug 的直接替代品,增加了对 Wayland 的支持。它并不支持所有 Wayland 合成器,请检查您的合成器是否受支持。参见 [1]

~/.config/ranger/rc.conf
set preview_images_method ueberzug

如果预览的是低质量像素图像,请将层输出更改为 kitty,即使没有安装 kitty。

~/.config/ueberzugpp/config.json
{ "layer": { "output": "kitty"  } }

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.