您当前的位置: 首页 > 

终端中的文件管理器ranger【视频】

发布时间:2021-04-14 07:34:12 ,浏览量:5

自从用了vim后,感觉到了终端中的应用程序也可以有类似于图形化的操作和鼠标支持。无论是谁,在使用电脑的时候总是离不开文件操作的,那么有没有什么简单易用的类似于图形化的文件管理工具呢?

视频教程:
https://www.bilibili.com/video/BV1up4y1b7iJ/

ranger

安装

在archlinux中安装

sudo pacman -S  --noconfirm ranger

安装依赖

sudo pacman -S  --noconfirm libcaca highlight atool lynx w3m elinks  mediainfo

在macOS中安装
安装ranger,可以使用基本的功能

brew install ranger

安装依赖,这样可以使用一些扩展的功能,主要是预览相关的。

brew install libcaca highlight atool lynx w3m elinks poppler transmission mediainfo exiftool

在CentOS中安装
稍微麻烦一些,另开一篇文章。
《CentOS安装Ranger》 https://blog.csdn.net/lxyoucan/article/details/115699624

使用

  • 支持鼠标操作
  • 文本文件上按回车可以直接打开vim编辑文件
  • 响应非常快,非常快

配置ranger使其支持图片浏览

创建imgcat

vim imgcat

并写入以下内容:

#!/bin/bash # tmux requires unrecognized OSC sequences to be wrapped with DCS tmux; #ST, and for all ESCs into be replaced with ESC ESC. It # only accepts ESC backslash for ST. We use TERM instead of TMUX because TERM # gets passed through ssh. function print_osc() { if [[ $TERM == screen* ]]; then printf "\033Ptmux;\033\033]" else printf "\033]" fi } # More of the tmux workaround described above. function print_st() { if [[ $TERM == screen* ]]; then printf "\a\033\\" else printf "\a" fi } function load_version() { if [ -z ${IMGCAT_BASE64_VERSION+x} ]; then IMGCAT_BASE64_VERSION=$(base64 --version 2>&1) export IMGCAT_BASE64_VERSION fi } function b64_encode() { load_version if [[ $IMGCAT_BASE64_VERSION =~ GNU ]]; then # Disable line wrap base64 -w0 else base64 fi } function b64_decode() { load_version if [[ $IMGCAT_BASE64_VERSION =~ fourmilab ]]; then BASE64ARG=-d elif [[ $IMGCAT_BASE64_VERSION =~ GNU ]]; then BASE64ARG=-di else BASE64ARG=-D fi base64 $BASE64ARG } # print_image filename inline base64contents print_filename #   filename: Filename to convey to client #   inline: 0 or 1 #   base64contents: Base64-encoded contents #   print_filename: If non-empty, print the filename #                   before outputting the image function print_image() { print_osc printf '1337;File=' if [[ -n $1 ]]; then printf "name=%s;" "$(printf "%s" "$1" | b64_encode)" fi printf "%s" "$3" | b64_decode | wc -c | awk '{printf "size=%d",$1}' printf ";inline=%s" "$2" printf ":" printf "%s" "$3" print_st printf '\n' if [[ -n $4 ]]; then echo "$1" fi } function error() { echo "ERROR: $*" 1>&2 } function show_help() { echo "Usage: imgcat [-p] filename ..." 1>&2 echo "   or: cat filename | imgcat" 1>&2 } function check_dependency() { if ! (builtin command -V "$1" >/dev/null 2>&1); then echo "imgcat: missing dependency: can't find $1" 1>&2 exit 1 fi } ## Main if [ -t 0 ]; then has_stdin=f else has_stdin=t fi # Show help if no arguments and no stdin. if [ $has_stdin = f ] && [ $# -eq 0 ]; then show_help exit fi check_dependency awk check_dependency base64
check_dependency wc # Look for command line flags. while [ $# -gt 0 ]; do case "$1" in -h | --h | --help) show_help exit ;; -p | --p | --print) print_filename=1 ;; -u | --u | --url) check_dependency curl encoded_image=$(curl -s "$2" | b64_encode) || ( error "No such file or url $2" exit 2 ) has_stdin=f
        print_image "$2" 1 "$encoded_image" "$print_filename" set -- "${@:1:1}" "-u" "${@:3}" if [ "$#" -eq 2 ]; then exit fi ;; -*) error "Unknown option flag: $1" show_help exit 1 ;; *) if [ -r "$1" ]; then has_stdin=f
            print_image "$1" 1 "$(b64_encode <"$1")" "$print_filename" else error "imgcat: $1: No such file or directory" exit 2 fi ;; esac shift done # Read and print stdin if [ $has_stdin = t ]; then print_image "" 1 "$(cat | b64_encode)" "" fi exit 0

把imgcat放到path中方便调用

# 设置可执行权限 chmod +x imgcat # 复制到path之中 cp imgcat /usr/local/bin/

做完这一步,就可以使用imgcat 图片文件.png来在iterm2终端中显示图片了。

如果您是第一次使用游侠,请生成游侠配置文件。

ranger --copy-config=all

现在,您可以转到~/.config/ranger生成的文件中:

cd ~/.config/ranger
➜  ranger ls -la
总用量 132
drwxr-xr-x 2 itkey users 4096  4月 13 16:25 . drwxr-xr-x 6 itkey users 4096  4月 13 16:07 .. -rw-r--r-- 1 itkey users 62106  4月 13 16:25 commands_full.py
-rw-r--r-- 1 itkey users 2763  4月 13 16:25 commands.py
-rw-r--r-- 1 itkey users 24193  4月 13 16:25 rc.conf
-rw-r--r-- 1 itkey users 14071  4月 13 16:25 rifle.conf
-rwxr-xr-x 1 itkey users 13758  4月 13 16:25 scope.sh

让我们快速浏览它们:

  • commands.py:与以下命令一起启动的命令 :
  • commands_full.py:全套命令
  • rc.conf:配置和绑定
  • rifle.conf:文件关联(用于打开文件的程序)
  • scope.sh:负责各种文件预览

目前,对我们来说唯一重要的文件是rc.conf。在您喜欢的编辑器中将其打开,并更改以下两行,如下所示:
set preview_images false修改成set preview_images true
set preview_images_method w3m修改成set preview_images_method iterm2

配置环境变量

vim ~/.zshrc在环境变量中增加 下面一行

export RANGER_LOAD_DEFAULT_RC=FALSE

预览高度显示

安装highlight后预览就自动高度显示了,不用额外配置

sudo pacman -S  --noconfirm highlight

常用操作

大部分操作与vim类似,常用操作如下:

yy复制
dd剪切
pp粘贴
cw重命名方法1
a重命名方法2

增加图标显示

效果如下

设置方法:
https://github.com/alexanderjeurissen/ranger_devicons

从github下载代码:

git clone https://github.com/alexanderjeurissen/ranger_devicons ~/.config/ranger/plugins/ranger_devicons echo "default_linemode devicons" >> $HOME/.config/ranger/rc.conf

第二行,意思编辑rc.conf文件,并在文件中加入:

default_linemode devicons

重新进入ranger就发现可以有图标了,这样观感就好了很多了。

如果出现字体乱码可以参考:
《macOS中iTerm或终端字体乱码解决办法》https://blog.csdn.net/lxyoucan/article/details/115695733

显示边框线

编辑rc.conf文件

#显示边框线 set draw_borders true 

解决卡住

在macOS中如果开着文件预览,在快速切换文件的过程中,有极高的概率会卡住。遇到这个问题我是这么解决的。

  • 关闭文件预览修改rc.confset preview_files false这样基本就没有卡住的情况了
  • 如果不想关闭文件预览,我就不太想关,感觉有时还是挺实用的,如果遇到卡住不能动可以按Ctrl - C即可解除卡住的情况。
    可以按W查看运行日志,知道为什么会卡,按w显示当前的任务列表。

仅预览2MB以下的文件,降低卡住概率

目前我发现卡住基本是因为预览大文件导致的,预览大文件(10MB以上的文体之类)在没有预览完成时,不停的jk浏览文件,这样就会卡住。
修改rc.conf

# 只预览2MB以内的文件 set preview_max_size 2048000

经过这个设置后,我发现卡住的概率极大的减少。如果遇到大于2MB需要预览可以手动按i。

配置优化

修改配色风格

default, jungle, snow, solarized四种可选

# default, jungle, snow, solarized set colorscheme jungle

显示行号

用习惯vim的我,还是喜欢有行号的,可以 行号j k快速跳转

# Possible values: false, absolute, relative. set line_numbers relative

行号默认是从0开始的,设置成从1开始

# Start line numbers from 1 instead of 0 set one_indexed true 

没预览时不折叠预览区

因为我设置了只预览2MB以下的文件,如果遇到大文件不预览。默认情况下窗口会自动变大,看起来不舒服,那就把它关掉吧!

# 没有文件预览时,是否折叠右侧窗口 set collapse_preview false 

强制在root中开启文件预览

可能是为了安全考虑,ranger默认在root用户中不启动预览功能。如何在root用户中也开启预览呢?
我在这里找到了解决办法:https://bbs.archlinux.org/viewtopic.php?id=183674

具体操作如下:
ranger按gR 进入ranger安装目录,找到ranger/core/main.py


找到Running as root, disabling the file previews.

这样操作完成后,发现在ROOT下面也可以正常预览文件了。

iterm2中alt+数字 无效

在iterm2中使用alt+数字创建tab页面无效,设置了set xterm_alt_key true依然无效。
最终解决办法:

退出ranger保留路径方法一

环境变量(如:~/.zshrc)中加入如下的函数。

# ranger 自动进入目录 function ranger-cd { # 创建一个临时文件并存储 tempfile="$(mktemp -t tmp.XXXXXX)" # 运行ranger并要求其将最后一条路径输出到临时文件 ranger --choosedir="$tempfile" "${@:-$(pwd)}" # 如果临时文件存在,则读取并且临时文件的内容不等于当前路径 test -f "$tempfile" && if [ "$(cat -- "$tempfile")" != "$(echo -n `pwd`)" ]; then # 将目录更改为临时文件中的路径 cd -- "$(cat "$tempfile")" fi # 这行删除临时文件不是非常必要,因为Linux应该在下次启动时处理它 rm -f -- "$tempfile" } alias rcd=ranger-cd

下次使用rcd运行ranger,退出ranger后会自动cd 进ranger浏览的目录。

退出ranger保留路径方法二(推荐)

环境变量(如:~/.zshrc),加入下面一行。

alias nav='ranger --choosedir=$HOME/.rangerdir; LASTDIR=`cat $HOME/.rangerdir`; cd "$LASTDIR"' 

下次使用nav运行ranger,退出ranger后会自动cd 进ranger浏览的目录。

这种方法更简单明了,推荐使用。

使用体验总结

archlinux中使用目前没有遇到过卡顿的情况,但是在macOS中多次遇到卡死的情况。应该主要跟预览有关吧。

  • 如果不小心点到gif图片会卡死,界面无法操作,要等一会儿才可以。
  • 在macOS中使用ranger打开视频文本时也遇到过卡死的情况。

关闭图片预览功能就可以解决了,这个bug有可能是跟iterm2的图片预览功能有关吧。

快捷键解释

快捷键 说明
Q 全部退出
q 退出
ZZ 退出
ZQ 退出
R 刷新reload_cwd
F 冻结文件(只读模式)
重置reset
重新渲染窗口
abort
change_mode normal
~ set viewmode!
i display_file
j scroll_preview 1
k scroll_preview -1
`` tab_move 1
`` tab_move -1
1 打开标签页1
2 打开标签页 2
3 tab_open 3
4 tab_open 4
5 tab_open 5
6 tab_open 6
7 tab_open 7
8 tab_open 8
9 tab_open 9
r tab_shift 1
l tab_shift -1
? help
W 查看运行日志
w taskview_open
S 打开命令行shell $SHELL
: console
; console
! console shell%space
@ console -p6 shell %%s
# console shell -p%space
s console shell%space
r chain draw_possible_programs; console open_with%space
f console find%space
cd console cd%space
cw 重命名console rename%space
ct search_next order=tag
cs 按文件大小排序search_next order=size
ci 按文件类型排序search_next order=mimetype
cc 按创建时间排序search_next order=ctime
cm 按修改时间排序search_next order=mtime
ca search_next order=atime
查命令历史chain console; eval fm.ui.console.history_move(-1)
Mf 显示文件名称linemode filename
Mi linemode fileinfo
Mm 显示时间linemode mtime
Mh linemode humanreadablemtime
Mp linemode permissions
Ms linemode sizemtime
MH linemode sizehumanreadablemtime
Mt linemode metatitle
t tag_toggle
ut tag_remove
uv 取消选择mark_files all=True val=False
uV 反选toggle_visual_mode reverse=True
ud uncut
uy uncut
uq tab_restore
um unset_bookmark %any
um draw_bookmarks
" tag_toggle tag=%any
mark_files toggle=True
v 全选或反选mark_files all=True toggle=True
V 选择模式toggle_visual_mode
help
rename_append
display_file
edit
copy
cut
console mkdir%space
console delete
exit
move up=1
move down=1
move left=1
move right=1
move to=0
move to=-1
move down=1 pages=True
move up=1 pages=True
move right=1
console touch%space
k move up=1
j move down=1
h move left=1
l move right=1
gg move to=0
gh cd ~
ge cd /etc
gu cd /usr
gd cd /dev
gl cd -r .
gL cd -r %f
go cd /opt
gv cd /var
gm cd /media
gi eval fm.cd(’/run/media/’ + os.getenv(‘USER’))
gM cd /mnt
gs cd /srv
gp cd /tmp
gr cd /
gR eval fm.cd(ranger.RANGERDIR)
g/ cd /
g? cd /usr/share/doc/ranger
gt tab_move 1
gT tab_move -1
gn tab_new
gc tab_close
G move to=-1
move down=1 pages=True
move up=1 pages=True
J move down=0.5 pages=True
K move up=0.5 pages=True
move down=0.5 pages=True
move up=0.5 pages=True
H history_go -1
L history_go 1
] move_parent 1
[ move_parent -1
} traverse
{ traverse_backwards
) jump_non
E edit
du shell -p du --max-depth=1 -h --apparent-size
dU shell -p du --max-depth=1 -h --apparent-size | sort -rh
dD console delete
dT console trash
dd cut
da cut mode=add
dr cut mode=remove
dt cut mode=toggle
dgg eval fm.cut(dirarg=dict(to=0), narg=quantifier)
dG eval fm.cut(dirarg=dict(to=-1), narg=quantifier)
dj eval fm.cut(dirarg=dict(down=1), narg=quantifier)
dk eval fm.cut(dirarg=dict(up=1), narg=quantifier)
dc get_cumulative_size
yp 复制文件全路径
yd 复制文件目录路径
yn 复制文件名
y. 复制文件名不包含扩展名
yy 复制文件
ya copy mode=add
yr copy mode=remove
yt copy mode=toggle
ygg eval fm.copy(dirarg=dict(to=0), narg=quantifier)
yG eval fm.copy(dirarg=dict(to=-1), narg=quantifier)
yj eval fm.copy(dirarg=dict(down=1), narg=quantifier)
yk eval fm.copy(dirarg=dict(up=1), narg=quantifier)
= chmod
a rename_append
A eval fm.open_console('rename ’ + fm.thisfile.relative_path.replace("%", “%%”))
I eval fm.open_console('rename ’ + fm.thisfile.relative_path.replace("%", “%%”), position=7)
pp 粘贴
po 粘贴 强制覆盖
pP paste append=True
pO paste overwrite=True append=True
pl 粘贴软链接paste_symlink relative=False
pL paste_symlink relative=True
phl paste_hardlink
pht paste_hardlinked_subtree
pd console paste dest=
p paste dest=%any_path
p' paste dest=%any_path
/ console search%space
n search_next
N search_next forward=False
tab_new
tab_close
向右切换tab页面与gt功能一样 tab_move 1
向左切换tab页面与gT功能一样 tab_move -1
or 反转排序set sort_reverse!
oz set sort=random
os 根据文件大小排序 chain set sort=size; set sort_reverse=False
ob 根据文件名称排序 chain set sort=basename; set sort_reverse=False
on chain set sort=natural; set sort_reverse=False
om 根据修改时间排序chain set sort=mtime; set sort_reverse=False
oc chain set sort=ctime; set sort_reverse=False
oa chain set sort=atime; set sort_reverse=False
ot chain set sort=type; set sort_reverse=False
oe chain set sort=extension; set sort_reverse=False
oS chain set sort=size; set sort_reverse=True
oB chain set sort=basename; set sort_reverse=True
oN chain set sort=natural; set sort_reverse=True
oM chain set sort=mtime; set sort_reverse=True
oC chain set sort=ctime; set sort_reverse=True
oA chain set sort=atime; set sort_reverse=True
oT chain set sort=type; set sort_reverse=True
oE 根据扩展名排序 chain set sort=extension; set sort_reverse=True
zc set collapse_preview!
zd 切换目录是否排在文件前面set sort_directories_first!
zh set show_hidden!
zI set flushinput!
zi 切换是否预览图片set preview_images!
zm 切换是否允许鼠标set mouse_enabled!
zp 切换是否预览文件set preview_files!
zP 切换是否预览目录set preview_directories!
zs set sort_case_insensitive!
zu set autoupdate_cumulative_size!
zv set use_preview_script!
zf 过滤文件console filter%space
zz 过滤文件console filter%space
切换是否显示隐藏set show_hidden!
切换是否显示隐藏set show_hidden!
切换是否显示隐藏set show_hidden!
.d 只显示目录filter_stack add type d
.f 只显示文件filter_stack add type f
.l filter_stack add type l
.m console filter_stack add mime%space
.n console filter_stack add name%space
.# console filter_stack add hash%space
." filter_stack add duplicate
.’ filter_stack add unique
.| filter_stack add or
.& filter_stack add and
.! filter_stack add not
.r filter_stack rotate
.c filter_stack clear
.* filter_stack decompose
.p filter_stack pop
filter_stack show
``` enter_bookmark %any
``` draw_bookmarks
enter_bookmark %any
draw_bookmarks
m set_bookmark %any
m draw_bookmarks
+ur shell -f chmod u+r %s
+uw shell -f chmod u+w %s
+ux shell -f chmod u+x %s
+uX shell -f chmod u+X %s
+us shell -f chmod u+s %s
+ut shell -f chmod u+t %s
+gr shell -f chmod g+r %s
+gw shell -f chmod g+w %s
+gx shell -f chmod g+x %s
+gX shell -f chmod g+X %s
+gs shell -f chmod g+s %s
+gt shell -f chmod g+t %s
+or shell -f chmod o+r %s
+ow shell -f chmod o+w %s
+ox shell -f chmod o+x %s
+oX shell -f chmod o+X %s
+os shell -f chmod o+s %s
+ot shell -f chmod o+t %s
+ar shell -f chmod a+r %s
+aw shell -f chmod a+w %s
+ax shell -f chmod a+x %s
+aX shell -f chmod a+X %s
+as shell -f chmod a+s %s
+at shell -f chmod a+t %s
+r shell -f chmod u+r %s
+w shell -f chmod u+w %s
+x shell -f chmod u+x %s
+X shell -f chmod u+X %s
+s shell -f chmod u+s %s
+t shell -f chmod u+t %s
-ur shell -f chmod u-r %s
-uw shell -f chmod u-w %s
-ux shell -f chmod u-x %s
-uX shell -f chmod u-X %s
-us shell -f chmod u-s %s
-ut shell -f chmod u-t %s
-gr shell -f chmod g-r %s
-gw shell -f chmod g-w %s
-gx shell -f chmod g-x %s
-gX shell -f chmod g-X %s
-gs shell -f chmod g-s %s
-gt shell -f chmod g-t %s
-or shell -f chmod o-r %s
-ow shell -f chmod o-w %s
-ox shell -f chmod o-x %s
-oX shell -f chmod o-X %s
-os shell -f chmod o-s %s
-ot shell -f chmod o-t %s
-ar shell -f chmod a-r %s
-aw shell -f chmod a-w %s
-ax shell -f chmod a-x %s
-aX shell -f chmod a-X %s
-as shell -f chmod a-s %s
-at shell -f chmod a-t %s
-r shell -f chmod u-r %s
-w shell -f chmod u-w %s
-x shell -f chmod u-x %s
-X shell -f chmod u-X %s
-s shell -f chmod u-s %s
-t shell -f chmod u-t %s
Keybindings in `console’
eval fm.ui.console.tab()
eval fm.ui.console.tab(-1)
eval fm.ui.console.close()
eval fm.ui.console.execute()
redraw_window
eval fm.ui.console.close()
eval fm.ui.console.history_move(-1)
eval fm.ui.console.history_move(1)
eval fm.ui.console.move(left=1)
eval fm.ui.console.move(right=1)
eval fm.ui.console.move(right=0, absolute=True)
eval fm.ui.console.move(right=-1, absolute=True)
b eval fm.ui.console.move_word(left=1)
f eval fm.ui.console.move_word(right=1)
`` eval fm.ui.console.move_word(left=1)
alt>``` eval fm.ui.console.move_word(right=1)
d eval fm.ui.console.delete_word(backward=False)
eval fm.ui.console.delete(-1)
eval fm.ui.console.delete(0)
eval fm.ui.console.delete_word()
eval fm.ui.console.delete_rest(1)
eval fm.ui.console.delete_rest(-1)
eval fm.ui.console.paste()
eval fm.ui.console.close()
eval fm.ui.console.history_move(-1)
eval fm.ui.console.history_move(1)
eval fm.ui.console.move(left=1)
eval fm.ui.console.move(right=1)
eval fm.ui.console.move(right=0, absolute=True)
eval fm.ui.console.move(right=-1, absolute=True)
eval fm.ui.console.delete(0)
eval fm.ui.console.delete(-1)
backspace2>` eval fm.ui.console.delete(-1)
allow_quantifiers>` false
Keybindings in `pager’
pager_move down=1
pager_move up=1
pager_move left=4
pager_move right=4
pager_move to=0
pager_move to=-1
pager_move down=1.0 pages=True
pager_move up=1.0 pages=True
pager_move down=0.5 pages=True
pager_move up=0.5 pages=True
k pager_move up=1
pager_move up=1
j pager_move down=1
pager_move down=1
pager_move down=1
h pager_move left=4
l pager_move right=4
g pager_move to=0
G pager_move to=-1
d pager_move down=0.5 pages=True
u pager_move up=0.5 pages=True
n pager_move down=1.0 pages=True
f pager_move down=1.0 pages=True
pager_move down=1.0 pages=True
pager_move down=1.0 pages=True
p pager_move up=1.0 pages=True
b pager_move up=1.0 pages=True
pager_move up=1.0 pages=True
redraw_window
pager_close
q pager_close
Q pager_close
i pager_close
pager_close
E edit_file
Keybindings in `taskview’
taskview_move up=1
taskview_move down=1
taskview_move to=0
taskview_move to=-1
eval -q fm.ui.taskview.task_move(-1)
eval -q fm.ui.taskview.task_move(0)
taskview_move down=0.5 pages=True
taskview_move up=0.5 pages=True
k taskview_move up=1
taskview_move up=1
j taskview_move down=1
taskview_move down=1
taskview_move down=1
g taskview_move to=0
G taskview_move to=-1
u taskview_move up=0.5 pages=True
n taskview_move down=1.0 pages=True
f taskview_move down=1.0 pages=True
taskview_move down=1.0 pages=True
taskview_move down=1.0 pages=True
p taskview_move up=1.0 pages=True
b taskview_move up=1.0 pages=True
taskview_move up=1.0 pages=True
J eval -q fm.ui.taskview.task_move(-1)
K eval -q fm.ui.taskview.task_move(0)
dd eval -q fm.ui.taskview.task_remove()
eval -q fm.ui.taskview.task_remove()
redraw_window
taskview_close
q taskview_close
Q taskview_close
w taskview_close
taskview_close

参考

《RANGER IMAGE PREVIEW ON OSX WITH ITERM2》
https://www.everythingcli.org/ranger-image-preview-on-osx-with-iterm2/
《File icons for the Ranger file manager》https://github.com/alexanderjeurissen/ranger_devicons
《Add filetype glyphs (icons) 》https://github.com/ranger/ranger/issues/298
《osx can’t use alt- to switch tab》https://github.com/ranger/ranger/issues/420
《如何退出Ranger文件浏览器回到命令提示符,但保留当前目录?》
https://qastack.cn/superuser/1043806/how-to-exit-the-ranger-file-explorer-back-to-command-prompt-but-keep-the-current-directory

关注
打赏
查看更多评论

暂无认证

  • 5浏览

    0关注

    115983博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录