ranger
ranger 是一个用 Python 编写的基于文本的文件管理器。目录在一个具有三列的窗格中显示。通过按键、书签、鼠标或命令历史记录在它们之间移动。当前选中的文件预览和目录内容会自动显示。
特性包括:vi 风格的键绑定、书签、选择、标签、标签页、命令历史、创建符号链接的能力、多种控制台模式以及任务视图。ranger 具有可自定义的命令和键绑定,包括对外部脚本的绑定。Ranger 还自带了一个 文件打开器,即 rifle(1)。
最接近的竞争对手是 lf 和 Vifm。
安装
用法
要启动 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, snow 和 solarized。您可以使用以下命令更改配色方案
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" -- "$@"
技巧与提示
归档文件
这些命令使用 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]
外部驱动器
外部驱动器可以通过 udev 或 udisks 自动挂载。前往常用挂载点 /media 和 /run/media/$USER 的默认键映射分别为 gm 和 gi。
隐藏文件
您可以使用以下命令切换隐藏文件的可见性::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)
在当前文件夹中打开新标签页
您可能已经注意到有两个在主目录下打开新标签页的快捷键(gn 和 Ctrl+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" } }