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
此外,設定 RANGER_LOAD_DEFAULT_RC=false 環境變量可以避免在加載本地配置時同時加載全局配置。
了解一些基本的 python 知識可能對定製 ranger 會有幫助。
-
rc.conf- 選項設置和快捷鍵 -
commands.py- 能通過:執行的命令 -
rifle.conf- 指定不同類型的文件的默認打開程序。
rc.conf 只需要包含與默認配置文件不同的部分,因為它們都會被加載。對於 commands.py,如果你沒有包含整個文件,把下面這一行加入到文件起始處:
from ranger.api.commands import *
更多配置選項請參考 ranger(1)。
移動到回收站
如果想添加一個把文件移動到目錄 ~/.local/share/Trash/files/ 的快捷鍵 DD,將相關配置修改為以下配置:
~/.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。
文件預覽色彩高亮
安裝 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" -- "$@"
提示與技巧
存檔相關
解壓縮
下面的命令實現了解壓當前目錄下選中的項目:
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 自動掛載。跳轉到共有掛載點 /media 和 /run/media/$USER 的快捷鍵分別為 gm 和 gi。
隱藏文件
使用以下命令切換隱藏文件的可見性:
:set show_hidden!
顯示隱藏的文件:
:set show_hidden true
要固定該設置,請將該設置添加到配置文件:
rc.conf
set show_hidden true
此外,可使用 zh 快捷鍵切換隱藏文件的可見性。
鏡像掛載
以下命令假設你正在使用 CDemu 作為你的鏡像掛載器,掛載虛擬驅動器到指定位置(如 /media/virtualrom),類似於 autofs 文件系統,不要忘記根據你的系統設置修改掛載路徑。
為從 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.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 提示
目錄同步
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.
阻止嵌套 ranger 實例
使用快捷鍵 S 以在當前目錄啟動一個 shell,當您退出 shell 時則會回到 ranger。
然而,您可能會忘記您處於 ranger 啟動的 shell 中,導致在需要使用 ranger 時又在 ranger shell 中啟動了新的 ranger 實例,造成嵌套。
欲阻止該行為,您可以在您的 shell 的配置文件添加以下函數:
ranger() {
if [ -z "$RANGER_LEVEL" ]; then
/usr/bin/ranger "$@"
else
exit
fi
}