在命令行中我喜欢使用ranger来管理文件。ranger的操作风格与vim类似,我很喜欢。vim中有很多优秀的文件管理插件。今天介绍一下我在使用defx时的心得,分享一下配置。
defx插件
项目主页
https://github.com/Shougo/defx.nvim
关于
Defx 是一个用于 Neovim/Vim 浏览文件的插件。它取代了已弃用的 vimfiler 插件。
概念
-
不依赖于 denite.nvim
-
Vim8/neovim 兼容(Vim8 需要 nvim-yarp)
-
由 Python3 实现
-
没有双重过滤器功能
-
栏目特色
-
源功能,如 denite.nvim
-
选项
-
突出显示由列定义
-
很少的命令(仅:Defx 命令?)
-
扩展重命名
-
标记
-
需要 Windows 支持者
-
最大功能不喜欢其他文件管理器
安装
注意: defx 需要 Neovim 0.4.0+ 或 Vim8.2+ 和 Python3.6.1+。如果您不确定您是否有此要求,请参阅 要求。
For vim-plug
if has('nvim')
Plug 'Shougo/defx.nvim', { 'do': ':UpdateRemotePlugins' }
else
Plug 'Shougo/defx.nvim'
Plug 'roxma/nvim-yarp'
Plug 'roxma/vim-hug-neovim-rpc'
endif
要求
defx 需要 Python3.6.1+ 和 Neovim(0.4.0+) 或带有 if_python3 的 Vim8.2+。如果 :echo has(“python3”)返回1,那么你有 python 3 支持;否则,请参见下文。
注意:推荐使用最新的 Neovim,因为它更快。
您可以使用 pip 启用 Python3 接口:
pip3 install --user pynvim
请为 Vim8 安装 nvim-yarp 插件。 https://github.com/roxma/nvim-yarp
请为 Vim8 安装 vim-hug-neovim-rpc 插件。 https://github.com/roxma/vim-hug-neovim-rpc
关于图标
如果你发现没有像有截图上的那样有图标,安装下面两个插件就可以解决不显示图标的问题。
"显示dev图片
Plug 'ryanoasis/vim-devicons'
Plug 'kristijanhusak/defx-icons'
对应项目地址:
然后你还需要给你的终端配置字体,可以参考:https://blog.csdn.net/lxyoucan/article/details/115695733
配置
快捷键的设置,主要为了与ranger保持一至,常用操作是:
项目 | 快捷键 |
---|---|
下移 | j 或者 <Down> |
上移 | k 或者 <Up> |
上一层 | h 或者 <Left> |
打开 | l 或者 <Right> |
复制 | yy |
剪切 | dd |
粘贴 | pp |
删除 | dD |
新建目录 | K |
新建文件 | N |
选择文件 | <Space> 或者 M |
全选文件 | * 或者 vv |
复制文件路径 | YY |
打开或关闭文件夹 | o |
执行shell 命令(如:mkdir mv cp等) | ! |
指定窗口中打开文件(需要安装t9md/vim-choosewin) | i |
配置如下:
" Define mappings
"cnoreabbrev sf Defx -listed -new
" \ -columns=indent:mark:icon:icons:filename:git:size
" \ -buffer-name=tab`tabpagenr()`<CR>
nnoremap <silent>sf :<C-u>Defx -listed -resume
\ -columns=indent:mark:icon:icons:filename:git:size
\ -buffer-name=tab`tabpagenr()`
\ `expand('%:p:h')` -search=`expand('%:p')`<CR>
nnoremap <silent>fi :<C-u>Defx -new `expand('%:p:h')` -search=`expand('%:p')`<CR>
autocmd FileType defx call s:defx_my_settings()
function! s:defx_my_settings() abort
" Define mappings
nnoremap <silent><buffer><expr> <CR>
\ defx#do_action('open')
nnoremap <silent><buffer><expr> yy
\ defx#do_action('copy')
nnoremap <silent><buffer><expr> dd
\ defx#do_action('move')
nnoremap <silent><buffer><expr> pp
\ defx#do_action('paste')
nnoremap <silent><buffer><expr> l
\ defx#do_action('open')
nnoremap <silent><buffer><expr> <Right>
\ defx#do_action('open')
nnoremap <silent><buffer><expr> E
\ defx#do_action('open', 'vsplit')
nnoremap <silent><buffer><expr> n
\ defx#do_action('open', 'pedit')
nnoremap <silent><buffer><expr> i
\ defx#do_action('open', 'choose')
nnoremap <silent><buffer><expr> o
\ defx#do_action('open_or_close_tree')
nnoremap <silent><buffer><expr> K
\ defx#do_action('new_directory')
nnoremap <silent><buffer><expr> N
\ defx#do_action('new_file')
nnoremap <silent><buffer><expr> M
\ defx#do_action('new_multiple_files')
nnoremap <silent><buffer><expr> C
\ defx#do_action('toggle_columns',
\ 'mark:indent:icon:filename:type:size:time')
nnoremap <silent><buffer><expr> S
\ defx#do_action('toggle_sort', 'time')
nnoremap <silent><buffer><expr> dD
\ defx#do_action('remove')
nnoremap <silent><buffer><expr> a
\ defx#do_action('rename')
nnoremap <silent><buffer><expr> !
\ defx#do_action('execute_command')
nnoremap <silent><buffer><expr> x
\ defx#do_action('execute_system')
nnoremap <silent><buffer><expr> YY
\ defx#do_action('yank_path')
nnoremap <silent><buffer><expr> .
\ defx#do_action('toggle_ignored_files')
nnoremap <silent><buffer><expr> ;
\ defx#do_action('repeat')
nnoremap <silent><buffer><expr> h
\ defx#do_action('cd', ['..'])
nnoremap <silent><buffer><expr> <Left>
\ defx#do_action('cd', ['..'])
nnoremap <silent><buffer><expr> ~
\ defx#do_action('cd')
nnoremap <silent><buffer><expr> q
\ defx#do_action('quit')
nnoremap <silent><buffer><expr> <Space>
\ defx#do_action('toggle_select') . 'j'
nnoremap <silent><buffer><expr> m
\ defx#do_action('toggle_select') . 'j'
nnoremap <silent><buffer><expr> vv
\ defx#do_action('toggle_select_all')
nnoremap <silent><buffer><expr> *
\ defx#do_action('toggle_select_all')
nnoremap <silent><buffer><expr> j
\ line('.') == line('$') ? 'gg' : 'j'
nnoremap <silent><buffer><expr> k
\ line('.') == 1 ? 'G' : 'k'
nnoremap <silent><buffer><expr> <C-l>
\ defx#do_action('redraw')
nnoremap <silent><buffer><expr> <C-g>
\ defx#do_action('print')
nnoremap <silent><buffer><expr> cd
\ defx#do_action('change_vim_cwd')
endfunction
call defx#custom#column('icon', {
\ 'directory_icon': '▸',
\ 'opened_icon': '▾',
\ 'root_icon': ' ',
\ })
call defx#custom#column('git', 'indicators', {
\ 'Modified' : 'M',
\ 'Staged' : '✚',
\ 'Untracked' : '✭',
\ 'Renamed' : '➜',
\ 'Unmerged' : '═',
\ 'Ignored' : '☒',
\ 'Deleted' : '✖',
\ 'Unknown' : '?'
\ })
指定窗口中打开文件
这一点我单独列出来说一下,因为我觉得这个对我来说非常的实用。可以选择文件在哪个窗口打开,这个是我一直想要的功能。实现起来很简单。
安装插件
Plug 't9md/vim-choosewin'
配置
" if you want to use overlay feature
let g:choosewin_overlay_enable = 1
好了,这下可以愉快的使用i来在指定窗口打开想要打开的文件啦。
总结
这样配置下来,在vim中使用defx的感觉基本与ranger差不多了。用起来很顺手。
虽然vim中也可以直接使用ranger,可以参考:《vim中使用ranger强强联手更快更强》
https://blog.csdn.net/lxyoucan/article/details/116486176
毕竟defx是vim 的插件与vim结合的相对更紧,可配置的地方更多。
在vim中使用ranger如下图所示:
defx如下图所示:
从界面上可以看出defx的图标有不同的颜色更鲜艳。defx可以在指定窗口打开文件,这点我很喜欢。而且在vim中定义的一些按键映射直接就可以使用比如:<C - j> ⇒ 5j 这个我经常用,直接就可以使用了。
而ranger作为一个专业的文件管理器,文件管理相关的细节会更多。各有优缺点,选哪个呢?作为vim中的文件管理器,两都都非常够用。
小孩子才做选择,我都要。用哪个看心情好了。
灵感源于
https://github.com/craftzdog/dotfiles-public/blob/master/.config/nvim/plugins/defx.rc.vim