ranger 是一個基於文本的文件管理器,以 Python 編寫。不同層級的目錄分別在一個面板的三列中進行展示. 可以通過快捷鍵, 書籤, 滑鼠以及歷史命令在它們之間移動. 當選中文件或目錄時, 會自動顯示文件或目錄的內容.
主要特性有: vi 風格的快捷鍵, 書籤, 選擇, 標籤, 選項卡, 命令歷史, 創建符號連結的能力, 多種終端模式, 以及任務視圖. ranger 可以定製命令和快捷鍵,包括綁定到外部腳本,ranger 還有自己的文件打開工具——rifle(1)。
安裝
安裝 ranger包 包,或其開發版 ranger-gitAUR。
用法
在終端裡執行 ranger
來啟動 ranger。
快捷鍵 | 命令 |
---|---|
? |
打開幫助手冊或列出快捷鍵、命令以及設置項 |
l , Enter
|
打開文件 |
j , k
|
選擇當前目錄中的文件 |
h , l
|
在目錄樹中上移和下移 |
q |
退出 |
定製
第一次啟動 ranger 會創建一個目錄 ~/.config/ranger/
。可以使用以下命令複製默認配置文件到這個目錄:
$ ranger --copy-config=all
Afterwards, set RANGER_LOAD_DEFAULT_RC=false
as an environment variable to avoid loading the global configuration in addition to the local.
了解一些基本的 python 知識可能對定製 ranger 會有幫助。
-
rc.conf
- 選項設置和快捷鍵 -
commands.py
- 能通過:
執行的命令 -
rifle.conf
- 指定不同類型的文件的默認打開程序。
rc.conf
只需要包含與默認配置文件不同的部分,因為它們都會被加載。對於 commands.py
,如果你沒有包含整個文件,把下面這一行加入到文件起始處:
from ranger.api.commands import *
更多配置選項請參考 ranger(1)。
移動到回收站
如果想添加一個把文件移動到目錄 ~/.local/share/Trash/files/
的快捷鍵 DD
,amend the configuration file as follows:
~/.config/ranger/rc.conf
... map DD shell mv %s /home/${USER}/.local/share/Trash/files/ ...
或使用 glib2包 軟體包提供的 GIO 命令:
map DD shell gio trash %s
一般的圖形文件管理器都支持查看或清空回收站,此外還可以使用 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
。
Color highlight in file previews
Install the python-pygments包 package, then copy /usr/share/doc/ranger/config/scope.sh
to ~/.config/ranger/scope.sh
and edit the variable PYGMENTIZE_STYLE
in the configuration file of ranger to your liking. The complete list of supported themes can be obtained via 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" -- "$@"
提示與技巧
存檔相關
解壓縮
下面的命令實現了解壓當前目錄下選中的項目:
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)
對於使用 7z 的用戶, 可以在添加以下命令後, 選中壓縮包然後執行 ":extract" 或通過綁定的快捷鍵來解壓
class extract(Command): """:extract <paths> Extract archives using 7z """ def execute(self): import os fail=[] for i in self.fm.thistab.get_selection(): ExtractProg='7z x' if i.path.endswith('.zip'): # zip encoding issue ExtractProg='unzip -O gbk' elif i.path.endswith('.tar.gz'): ExtractProg='tar xvf' elif i.path.endswith('.tar.xz'): ExtractProg='tar xJvf' elif i.path.endswith('.tar.bz2'): ExtractProg='tar xjvf' if os.system('{0} "{1}"'.format(ExtractProg, i.path)): fail.append(i.path) if len(fail) > 0: self.fm.notify("Fail to extract: {0}".format(' '.join(fail)), duration=10, bad=True) self.fm.redraw_window()
PS: 如果需要解壓 ZIP 壓縮包還需要安裝 unzip-iconvAUR[損壞的連結:package not found](為了解決中文亂碼問題)
壓縮
以下命令允許用戶將當前目錄下選中的文件通過":compress <package name>"命令壓縮。它還支持通過當前目錄名和為擴展名追加幾種可能性來建議名稱。
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]
外部驅動
外部驅動可以通過 udev 或 [udisks] 自動掛載。The default key mappings to go to common mount points /media
and /run/media/$USER
are gm
and gi
respectively.
Hidden files
You can toggle the visibility of hidden files with the following command: :set show_hidden!
, or use :set show_hidden true
to make hidden files visible.
To make this permanent, add the setting to your configuration file:
rc.conf
set show_hidden true
Alternatively, hidden files can be toggled by pressing zh
.
鏡像掛載
以下命令假設你正在使用 CDemu 作為你的鏡像掛載器和一些掛載虛擬驅動器到指定位置 (如 '/media/virtualrom') ,類似於 autofs的系統。不要忘記根據你的系統設置修改掛載路徑.
為了從 ranger 裡把鏡像掛載到 cdemud 虛擬驅動器, 需要選中鏡像文件然後在終端輸入 ':mount'。根據你的設置,掛載可能會需要一些時間(我的需要長達一分鐘的時間). 以下命令使用自定義的 loader 會等待加載過程結束然後通過後台在第 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.env.cwd.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)
PDF文件預覽
在默認情況下,ranger
將會以文本的形式預覽PDF文件。然後,你可以通過先將PDF文件轉換為圖片,再以圖片的方式預覽PDF文件。ranger
將圖片預覽保存在 ~/.cache/ranger/
目錄下。你需要手動創建這個目錄,或者在~/.config/ranger/rc.conf
將preview_images
設置為true
來讓ranger
在下一次啟動時自動創建這個目錄。然而,請注意你並不需要將preview_images
一直設置為true
來以圖片的方式預覽PDF文件,只要有 ~/.cache/ranger
就可以了。
為了啟用這個功能,你可以在/usr/share/doc/ranger/config/scope.sh
去掉相應行的注釋,或者在你本地文件~/.config/ranger/scope.sh
中增加/取消注釋這些行。
在當前目錄打開新標籤
你可能已經注意到有兩個快捷鍵能夠以家目錄為默認目錄創建新的標籤 (gn
和 Ctrl+n
). 不妨重新綁定 Ctrl+n
:
rc.conf
map <c-n> eval fm.tab_new('%d')
Shell tips
目錄同步
ranger 提供了一個 shell function /usr/share/doc/ranger/examples/shell_automatic_cd.sh
. 執行 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
. 其中unset RANGERCD
是必要的, 否則在終端中啟動一個subshell將會重新啟動ranger
.
Preventing nested ranger instances
You can start a shell in the current directory with S
, when you exit the shell you get back to your ranger instance.
When you however forget that you already are in a ranger shell and start ranger again you end up with ranger running a shell running ranger.
To prevent this you can create the following function in your shell's startup file:
ranger() { if [ -z "$RANGER_LEVEL" ]; then /usr/bin/ranger "$@" else exit fi }
疑難解答
Artifacts in image preview
無邊框邊欄可能在圖片預覽中產生條紋。[1][失效連結 2023-05-07 ⓘ] 在 ~/.config/ranger/rc.conf
設置:
set draw_borders true
可以解決這個問題