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

124 篇文章 9 订阅
68 篇文章 4 订阅

自从用了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;
# <sequence> ST, and for all ESCs in <sequence> to 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.conf set preview_files false 这样基本就没有卡住的情况了
  • 如果不想关闭文件预览,我就不太想关,感觉有时还是挺实用的,如果遇到卡住不能动可以按 Ctrl - C 即可解除卡住的情况。
    可以按W查看运行日志,知道为什么会卡,按w显示当前的任务列表。

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

目前我发现卡住基本是因为预览大文件导致的,预览大文件(10MB以上的文体之类)在没有预览完成时,不停的j k 浏览文件,这样就会卡住。
修改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冻结文件(只读模式)
<c-r>重置reset
<c-l>重新渲染窗口
<c-c>abort
<escape>change_mode normal
~set viewmode!
idisplay_file
<alt>jscroll_preview 1
<alt>kscroll_preview -1
<alt>``<right>tab_move 1
<alt>``<left>tab_move -1
<alt>1打开标签页1
<alt>2打开标签页 2
<alt>3tab_open 3
<alt>4tab_open 4
<alt>5tab_open 5
<alt>6tab_open 6
<alt>7tab_open 7
<alt>8tab_open 8
<alt>9tab_open 9
<alt>rtab_shift 1
<alt>ltab_shift -1
?help
W查看运行日志
wtaskview_open
S打开命令行shell $SHELL
:console
;console
!console shell%space
@console -p6 shell %%s
#console shell -p%space
sconsole shell%space
rchain draw_possible_programs; console open_with%space
fconsole find%space
cdconsole cd%space
cw重命名console rename%space
ctsearch_next order=tag
cs按文件大小排序search_next order=size
ci按文件类型排序search_next order=mimetype
cc按创建时间排序search_next order=ctime
cm按修改时间排序search_next order=mtime
casearch_next order=atime
<c-p>查命令历史chain console; eval fm.ui.console.history_move(-1)
Mf显示文件名称linemode filename
Milinemode fileinfo
Mm显示时间linemode mtime
Mhlinemode humanreadablemtime
Mplinemode permissions
Mslinemode sizemtime
MHlinemode sizehumanreadablemtime
Mtlinemode metatitle
ttag_toggle
uttag_remove
uv取消选择mark_files all=True val=False
uV反选toggle_visual_mode reverse=True
uduncut
uyuncut
uqtab_restore
um<any>unset_bookmark %any
um<bg>draw_bookmarks
"<any>tag_toggle tag=%any
<space>mark_files toggle=True
v全选或反选mark_files all=True toggle=True
V选择模式toggle_visual_mode
<f1>help
<f2>rename_append
<f3>display_file
<f4>edit
<f5>copy
<f6>cut
<f7>console mkdir%space
<f8>console delete
<f10>exit
<up>move up=1
<down>move down=1
<left>move left=1
<right>move right=1
<home>move to=0
<end>move to=-1
<pagedown>move down=1 pages=True
<pageup>move up=1 pages=True
<c-j>move right=1
<insert>console touch%space
kmove up=1
jmove down=1
hmove left=1
lmove right=1
ggmove to=0
ghcd ~
gecd /etc
gucd /usr
gdcd /dev
glcd -r .
gLcd -r %f
gocd /opt
gvcd /var
gmcd /media
gieval fm.cd(’/run/media/’ + os.getenv(‘USER’))
gMcd /mnt
gscd /srv
gpcd /tmp
grcd /
gReval fm.cd(ranger.RANGERDIR)
g/cd /
g?cd /usr/share/doc/ranger
gttab_move 1
gTtab_move -1
gntab_new
gctab_close
Gmove to=-1
<c-f>move down=1 pages=True
<c-b>move up=1 pages=True
Jmove down=0.5 pages=True
Kmove up=0.5 pages=True
<c-d>move down=0.5 pages=True
<c-u>move up=0.5 pages=True
Hhistory_go -1
Lhistory_go 1
]move_parent 1
[move_parent -1
}traverse
{traverse_backwards
)jump_non
Eedit
dushell -p du --max-depth=1 -h --apparent-size
dUshell -p du --max-depth=1 -h --apparent-size | sort -rh
dDconsole delete
dTconsole trash
ddcut
dacut mode=add
drcut mode=remove
dtcut mode=toggle
dggeval fm.cut(dirarg=dict(to=0), narg=quantifier)
dGeval fm.cut(dirarg=dict(to=-1), narg=quantifier)
djeval fm.cut(dirarg=dict(down=1), narg=quantifier)
dkeval fm.cut(dirarg=dict(up=1), narg=quantifier)
dcget_cumulative_size
yp复制文件全路径
yd复制文件目录路径
yn复制文件名
y.复制文件名不包含扩展名
yy复制文件
yacopy mode=add
yrcopy mode=remove
ytcopy mode=toggle
yggeval fm.copy(dirarg=dict(to=0), narg=quantifier)
yGeval fm.copy(dirarg=dict(to=-1), narg=quantifier)
yjeval fm.copy(dirarg=dict(down=1), narg=quantifier)
ykeval fm.copy(dirarg=dict(up=1), narg=quantifier)
=chmod
arename_append
Aeval fm.open_console('rename ’ + fm.thisfile.relative_path.replace("%", “%%”))
Ieval fm.open_console('rename ’ + fm.thisfile.relative_path.replace("%", “%%”), position=7)
pp粘贴
po粘贴 强制覆盖
pPpaste append=True
pOpaste overwrite=True append=True
pl粘贴软链接paste_symlink relative=False
pLpaste_symlink relative=True
phlpaste_hardlink
phtpaste_hardlinked_subtree
pdconsole paste dest=
p <any>paste dest=%any_path
p' <any>paste dest=%any_path
/console search%space
nsearch_next
Nsearch_next forward=False
<c-n>tab_new
<c-w>tab_close
<c-i>向右切换tab页面与gt功能一样 tab_move 1
<s-tab>向左切换tab页面与gT功能一样 tab_move -1
or反转排序set sort_reverse!
ozset sort=random
os根据文件大小排序 chain set sort=size; set sort_reverse=False
ob根据文件名称排序 chain set sort=basename; set sort_reverse=False
onchain set sort=natural; set sort_reverse=False
om根据修改时间排序chain set sort=mtime; set sort_reverse=False
occhain set sort=ctime; set sort_reverse=False
oachain set sort=atime; set sort_reverse=False
otchain set sort=type; set sort_reverse=False
oechain set sort=extension; set sort_reverse=False
oSchain set sort=size; set sort_reverse=True
oBchain set sort=basename; set sort_reverse=True
oNchain set sort=natural; set sort_reverse=True
oMchain set sort=mtime; set sort_reverse=True
oCchain set sort=ctime; set sort_reverse=True
oAchain set sort=atime; set sort_reverse=True
oTchain set sort=type; set sort_reverse=True
oE根据扩展名排序 chain set sort=extension; set sort_reverse=True
zcset collapse_preview!
zd切换目录是否排在文件前面set sort_directories_first!
zhset show_hidden!
zIset flushinput!
zi切换是否预览图片set preview_images!
zm切换是否允许鼠标set mouse_enabled!
zp切换是否预览文件set preview_files!
zP切换是否预览目录set preview_directories!
zsset sort_case_insensitive!
zuset autoupdate_cumulative_size!
zvset use_preview_script!
zf过滤文件console filter%space
zz过滤文件console filter%space
<c-h>切换是否显示隐藏set show_hidden!
<backspace>切换是否显示隐藏set show_hidden!
<backspace2>切换是否显示隐藏set show_hidden!
.d只显示目录filter_stack add type d
.f只显示文件filter_stack add type f
.lfilter_stack add type l
.mconsole filter_stack add mime%space
.nconsole 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
.rfilter_stack rotate
.cfilter_stack clear
.*filter_stack decompose
.pfilter_stack pop
filter_stack show
```enter_bookmark %any
```draw_bookmarks
<any>enter_bookmark %any
<bg>draw_bookmarks
m<any>set_bookmark %any
m<bg>draw_bookmarks
+urshell -f chmod u+r %s
+uwshell -f chmod u+w %s
+uxshell -f chmod u+x %s
+uXshell -f chmod u+X %s
+usshell -f chmod u+s %s
+utshell -f chmod u+t %s
+grshell -f chmod g+r %s
+gwshell -f chmod g+w %s
+gxshell -f chmod g+x %s
+gXshell -f chmod g+X %s
+gsshell -f chmod g+s %s
+gtshell -f chmod g+t %s
+orshell -f chmod o+r %s
+owshell -f chmod o+w %s
+oxshell -f chmod o+x %s
+oXshell -f chmod o+X %s
+osshell -f chmod o+s %s
+otshell -f chmod o+t %s
+arshell -f chmod a+r %s
+awshell -f chmod a+w %s
+axshell -f chmod a+x %s
+aXshell -f chmod a+X %s
+asshell -f chmod a+s %s
+atshell -f chmod a+t %s
+rshell -f chmod u+r %s
+wshell -f chmod u+w %s
+xshell -f chmod u+x %s
+Xshell -f chmod u+X %s
+sshell -f chmod u+s %s
+tshell -f chmod u+t %s
-urshell -f chmod u-r %s
-uwshell -f chmod u-w %s
-uxshell -f chmod u-x %s
-uXshell -f chmod u-X %s
-usshell -f chmod u-s %s
-utshell -f chmod u-t %s
-grshell -f chmod g-r %s
-gwshell -f chmod g-w %s
-gxshell -f chmod g-x %s
-gXshell -f chmod g-X %s
-gsshell -f chmod g-s %s
-gtshell -f chmod g-t %s
-orshell -f chmod o-r %s
-owshell -f chmod o-w %s
-oxshell -f chmod o-x %s
-oXshell -f chmod o-X %s
-osshell -f chmod o-s %s
-otshell -f chmod o-t %s
-arshell -f chmod a-r %s
-awshell -f chmod a-w %s
-axshell -f chmod a-x %s
-aXshell -f chmod a-X %s
-asshell -f chmod a-s %s
-atshell -f chmod a-t %s
-rshell -f chmod u-r %s
-wshell -f chmod u-w %s
-xshell -f chmod u-x %s
-Xshell -f chmod u-X %s
-sshell -f chmod u-s %s
-tshell -f chmod u-t %s
Keybindingsin `console’
<c-i>eval fm.ui.console.tab()
<s-tab>eval fm.ui.console.tab(-1)
<escape>eval fm.ui.console.close()
<c-j>eval fm.ui.console.execute()
<c-l>redraw_window
<c-c>eval fm.ui.console.close()
<up>eval fm.ui.console.history_move(-1)
<down>eval fm.ui.console.history_move(1)
<left>eval fm.ui.console.move(left=1)
<right>eval fm.ui.console.move(right=1)
<home>eval fm.ui.console.move(right=0, absolute=True)
<end>eval fm.ui.console.move(right=-1, absolute=True)
<alt>beval fm.ui.console.move_word(left=1)
<alt>feval fm.ui.console.move_word(right=1)
<alt>``<left>eval fm.ui.console.move_word(left=1)
alt>```eval fm.ui.console.move_word(right=1)
<alt>deval fm.ui.console.delete_word(backward=False)
<backspace>eval fm.ui.console.delete(-1)
<delete>eval fm.ui.console.delete(0)
<c-w>eval fm.ui.console.delete_word()
<c-k>eval fm.ui.console.delete_rest(1)
<c-u>eval fm.ui.console.delete_rest(-1)
<c-y>eval fm.ui.console.paste()
<c-g>eval fm.ui.console.close()
<c-p>eval fm.ui.console.history_move(-1)
<c-n>eval fm.ui.console.history_move(1)
<c-b>eval fm.ui.console.move(left=1)
<c-f>eval fm.ui.console.move(right=1)
<c-a>eval fm.ui.console.move(right=0, absolute=True)
<c-e>eval fm.ui.console.move(right=-1, absolute=True)
<c-d>eval fm.ui.console.delete(0)
<c-h>eval fm.ui.console.delete(-1)
backspace2>`eval fm.ui.console.delete(-1)
allow_quantifiers>`false
Keybindingsin `pager’
<down>pager_move down=1
<up>pager_move up=1
<left>pager_move left=4
<right>pager_move right=4
<home>pager_move to=0
<end>pager_move to=-1
<pagedown>pager_move down=1.0 pages=True
<pageup>pager_move up=1.0 pages=True
<c-d>pager_move down=0.5 pages=True
<c-u>pager_move up=0.5 pages=True
kpager_move up=1
<c-p>pager_move up=1
jpager_move down=1
<c-n>pager_move down=1
<c-j>pager_move down=1
hpager_move left=4
lpager_move right=4
gpager_move to=0
Gpager_move to=-1
dpager_move down=0.5 pages=True
upager_move up=0.5 pages=True
npager_move down=1.0 pages=True
fpager_move down=1.0 pages=True
<c-f>pager_move down=1.0 pages=True
<space>pager_move down=1.0 pages=True
ppager_move up=1.0 pages=True
bpager_move up=1.0 pages=True
<c-b>pager_move up=1.0 pages=True
<c-l>redraw_window
<escape>pager_close
qpager_close
Qpager_close
ipager_close
<f3>pager_close
Eedit_file
Keybindingsin `taskview’
<up>taskview_move up=1
<down>taskview_move down=1
<home>taskview_move to=0
<end>taskview_move to=-1
<pagedown>eval -q fm.ui.taskview.task_move(-1)
<pageup>eval -q fm.ui.taskview.task_move(0)
<c-d>taskview_move down=0.5 pages=True
<c-u>taskview_move up=0.5 pages=True
ktaskview_move up=1
<c-p>taskview_move up=1
jtaskview_move down=1
<c-n>taskview_move down=1
<c-j>taskview_move down=1
gtaskview_move to=0
Gtaskview_move to=-1
utaskview_move up=0.5 pages=True
ntaskview_move down=1.0 pages=True
ftaskview_move down=1.0 pages=True
<c-f>taskview_move down=1.0 pages=True
<space>taskview_move down=1.0 pages=True
ptaskview_move up=1.0 pages=True
btaskview_move up=1.0 pages=True
<c-b>taskview_move up=1.0 pages=True
Jeval -q fm.ui.taskview.task_move(-1)
Keval -q fm.ui.taskview.task_move(0)
ddeval -q fm.ui.taskview.task_remove()
<delete>eval -q fm.ui.taskview.task_remove()
<c-l>redraw_window
<escape>taskview_close
qtaskview_close
Qtaskview_close
wtaskview_close
<c-c>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

  • 19
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
以下是使用 PyTorch 实现的深度学习优化器 Ranger 的代码: ```python import math from torch.optim.optimizer import Optimizer import torch.optim as optim class Ranger(Optimizer): def __init__(self, params, lr=1e-3, alpha=0.5, k=6, N_sma_threshhold=5, betas=(0.95, 0.999), eps=1e-5, weight_decay=0): defaults = dict(lr=lr, alpha=alpha, k=k, N_sma_threshhold=N_sma_threshhold, betas=betas, eps=eps, weight_decay=weight_decay) super().__init__(params, defaults) def __setstate__(self, state): super().__setstate__(state) def step(self, closure=None): loss = None if closure is not None: loss = closure() # Gradient centralization for group in self.param_groups: for p in group['params']: if p.grad is None: continue grad = p.grad.data if grad.is_sparse: raise RuntimeError('Ranger optimizer does not support sparse gradients') grad_data = grad.data if len(grad_data.shape) > 1: mean = torch.mean(grad_data, dim=tuple(range(1, len(grad_data.shape))), keepdim=True) var = torch.var(grad_data, dim=tuple(range(1, len(grad_data.shape))), keepdim=True) grad_data = (grad_data - mean) / (torch.sqrt(var) + group['eps']) p.grad.data = grad_data # Perform optimization step beta1, beta2 = group['betas'] N_sma_threshhold = group['N_sma_threshhold'] grad_ema_beta = 1 - beta1 sqr_ema_beta = 1 - beta2 step_size = group['lr'] eps = group['eps'] k = group['k'] alpha = group['alpha'] weight_decay = group['weight_decay'] for group in self.param_groups: for p in group['params']: if p.grad is None: continue grad = p.grad.data if grad.is_sparse: raise RuntimeError('Ranger optimizer does not support sparse gradients') state = self.state[p] # State initialization if len(state) == 0: state['step'] = 0 state['exp_avg'] = torch.zeros_like(p.data) state['exp_avg_sq'] = torch.zeros_like(p.data) state['SMA'] = 0 exp_avg, exp_avg_sq = state['exp_avg'], state['exp_avg_sq'] SMA = state['SMA'] state['step'] += 1 # Gradient centralization grad_data = grad.data if len(grad_data.shape) > 1: mean = torch.mean(grad_data, dim=tuple(range(1, len(grad_data.shape))), keepdim=True) var = torch.var(grad_data, dim=tuple(range(1, len(grad_data.shape))), keepdim=True) grad_data = (grad_data - mean) / (torch.sqrt(var) + eps) grad = grad_data bias_correction1 = 1 - beta1 ** state['step'] bias_correction2 = 1 - beta2 ** state['step'] step_size = step_size * math.sqrt(bias_correction2) / bias_correction1 # Compute exponential moving average of gradient and squared gradient exp_avg = beta1 * exp_avg + grad_ema_beta * grad exp_avg_sq = beta2 * exp_avg_sq + sqr_ema_beta * grad * grad # Compute SMA SMA_prev = SMA SMA = alpha * SMA + (1 - alpha) * exp_avg_sq.mean() # Update parameters if state['step'] <= k: # Warmup p.data.add_(-step_size * exp_avg / (torch.sqrt(exp_avg_sq) + eps)) else: if SMA > SMA_prev or state['step'] <= N_sma_threshhold: # If SMA is increasing, skip lookahead and perform RAdam step denom = torch.sqrt(exp_avg_sq) + eps p.data.add_(-step_size * exp_avg / denom) else: # Lookahead slow_state = state['slow_buffer'] if len(slow_state) == 0: slow_state['step'] = 0 slow_state['exp_avg'] = torch.zeros_like(p.data) slow_state['exp_avg_sq'] = torch.zeros_like(p.data) slow_state['SMA'] = 0 for key in state.keys(): if key != 'slow_buffer': slow_state[key] = state[key].clone() slow_exp_avg, slow_exp_avg_sq = slow_state['exp_avg'], slow_state['exp_avg_sq'] slow_SMA = slow_state['SMA'] slow_state['step'] += 1 # Gradient centralization grad_data = grad.data if len(grad_data.shape) > 1: mean = torch.mean(grad_data, dim=tuple(range(1, len(grad_data.shape))), keepdim=True) var = torch.var(grad_data, dim=tuple(range(1, len(grad_data.shape))), keepdim=True) grad_data = (grad_data - mean) / (torch.sqrt(var) + eps) grad = grad_data # Compute exponential moving average of gradient and squared gradient slow_exp_avg = beta1 * slow_exp_avg + grad_ema_beta * grad slow_exp_avg_sq = beta2 * slow_exp_avg_sq + sqr_ema_beta * grad * grad # Compute SMA slow_SMA_prev = slow_SMA slow_SMA = alpha * slow_SMA + (1 - alpha) * slow_exp_avg_sq.mean() # Update parameters if slow_state['step'] <= k: # Warmup pass else: if slow_SMA > slow_SMA_prev or slow_state['step'] <= N_sma_threshhold: # If SMA is increasing, skip lookahead and perform RAdam step denom = torch.sqrt(slow_exp_avg_sq) + eps p.data.add_(-step_size * slow_exp_avg / denom) else: # Lookahead p.data.add_(-step_size * (exp_avg + slow_exp_avg) / (2 * torch.sqrt((beta2 * exp_avg_sq + sqr_ema_beta * slow_exp_avg_sq) / (1 - bias_correction2 ** state['step'])) + eps)) # Weight decay if weight_decay != 0: p.data.add_(-step_size * weight_decay * p.data) return loss ``` 以上的代码实现了 Ranger 优化器,其包括了 RAdam 和 LookAhead 的结合,以及动态学习率和权重衰减等技巧。可以将其应用于 PyTorch 的深度学习模型训练
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值