Defx, Alternatif Vim File Explorer selain NERDTree
Latar Belakang
Di Vim “world”, ada beberapa nama-nama plugin yang sudah tersohor di kalangan pengguna Vim. Dan biasanya menjadi plugin pilihan pertama oleh Vim user ketika baru bargabung dengan komunitas Vim. Tentu saja, yang menyebabkan hal tersebut adalah, karena biasanya di dalam tutorial, baik blog maupun vlog yang mereka lihat menginformasikan untuk memasang nama-nama plugin tersebut.
Salah satu plugin tersohor tersebut adalah NERDTree. NERDTree digunakan sebagai file explorer pengganti Netrw (default vim file explorer).
Saya pun, sejak awal menggunakan Vim, sudah menggunakan NERDTree, sampai-sampai saya tidak mengetahui bagaimana cara menggunakan Netrw.
Catatan kali ini tentang, proses migrasi saya dari NERDTree ke Defx.nvim.
Menurut yang tertulis di halaman GitHub README dari Defx, plugin ini diciptakan untuk menggantikan vimfiler yang sudah deprecated.
Penjelasan mengenai konsep dari Defx, dapat teman-teman baca di sini.
Requirement
neovim 0.4.x
atau vim 8.2.x
dengan python 3.6.x
.
Instalasi
Saya menggunakan vim-plug sebagai plugin manager.
1if has('nvim')2 Plug 'Shougo/defx.nvim', { 'do': ':UpdateRemotePlugins' }3else4 Plug 'Shougo/defx.nvim'5 Plug 'roxma/nvim-yarp'6 Plug 'roxma/vim-hug-neovim-rpc'7endif
Saya juga menambahkan 2 plugin tambahan untuk icon dan git status.
1Plug 'kristijanhusak/defx-icons'2Plug 'kristijanhusak/defx-git'
Konfigurasi Defx
Jangan kaget, kalau di halaman GitHub README tidak tersedia contoh-contoh konfigurasi.
Teman-teman dapat melihat contoh konfigurasi pada:
:help defx-examples
Namun, pada catatan kali ini, saya akan langsung memberikan konfigurasi yang saya pergunakan.
1if exists('g:plugs["defx.nvim"]')2 autocmd FileType defx call s:defx_my_settings()3 autocmd BufWritePost * call defx#redraw()4 autocmd BufEnter * call s:open_defx_if_directory()56 call defx#custom#option('_', {7 \ 'winwidth' : 40,8 \ 'split' : 'vertical',9 \ 'direction' : 'topleft',10 \ 'buffer_name' : 'defx',11 \ 'columns' : 'git:indent:icons:filename',12 \ 'show_ignored_files' : 0,13 \ 'toggle' : 1,14 \ 'resume' : 1,15 \ 'auto_cd' : 1,16 \ })1718 call defx#custom#column('icon', {19 \ 'directory_icon' : ' ',20 \ 'opened_icon' : ' ',21 \ })2223 call defx#custom#column('filename', {24 \ 'min_width': 40,25 \ 'max_width': 1000,26 \ })2728 " Open Defx when open a directory29 function! s:open_defx_if_directory()30 try31 let l:full_path = expand(expand('%:p'))32 catch33 return34 endtry3536 if isdirectory(l:full_path)37 execute "Defx `expand('%:p')` | bd " . expand('%:r')38 endif39 endfunction4041 function! s:defx_my_settings() abort42 " Define mappings43 nnoremap <silent><buffer><expr> <CR> defx#is_directory() ? defx#do_action('open_or_close_tree') : defx#do_action('drop')44 nnoremap <silent><buffer><expr> <2-LeftMouse>45 \ defx#do_action('drop')46 nnoremap <silent><buffer><expr> <2-RightMouse>47 \ defx#do_action('open_or_close_tree')48 nnoremap <silent><buffer><expr> c49 \ defx#do_action('copy')50 nnoremap <silent><buffer><expr> m51 \ defx#do_action('move')52 nnoremap <silent><buffer><expr> p53 \ defx#do_action('paste')54 nnoremap <silent><buffer><expr> V55 \ defx#do_action('drop', 'vsplit')56 nnoremap <silent><buffer><expr> S57 \ defx#do_action('drop', 'split')58 nnoremap <silent><buffer><expr> P59 \ defx#do_action('open', 'pedit')60 nnoremap <silent><buffer><expr> o61 \ defx#do_action('open_or_close_tree')62 nnoremap <silent><buffer><expr> K63 \ defx#do_action('new_directory')64 nnoremap <silent><buffer><expr> N65 \ defx#do_action('new_file')66 nnoremap <silent><buffer><expr> M67 \ defx#do_action('new_multiple_files')68 nnoremap <silent><buffer><expr> T69 \ defx#do_action('toggle_sort', 'time')70 nnoremap <silent><buffer><expr> d71 \ defx#do_action('remove')72 nnoremap <silent><buffer><expr> r73 \ defx#do_action('rename')74 nnoremap <silent><buffer><expr> !75 \ defx#do_action('execute_command')76 nnoremap <silent><buffer><expr> x77 \ defx#do_action('execute_system')78 nnoremap <silent><buffer><expr> yp79 \ defx#do_action('yank_path')80 nnoremap <silent><buffer><expr> .81 \ defx#do_action('toggle_ignored_files')82 nnoremap <silent><buffer><expr> ;83 \ defx#do_action('repeat')84 nnoremap <silent><buffer><expr> <Backspace>85 \ defx#do_action('cd', ['..'])86 nnoremap <silent><buffer><expr> ~87 \ defx#do_action('cd')88 nnoremap <silent><buffer><expr> q89 \ defx#do_action('quit')90 nnoremap <silent><buffer><expr> <Space>91 \ defx#do_action('toggle_select') . 'j'92 nnoremap <silent><buffer><expr> *93 \ defx#do_action('toggle_select_all')94 nnoremap <silent><buffer><expr> j95 \ line('.') == line('$') ? 'gg' : 'j'96 nnoremap <silent><buffer><expr> k97 \ line('.') == 1 ? 'G' : 'k'98 nnoremap <silent><buffer><expr> <C-r>99 \ defx#do_action('redraw')100 nnoremap <silent><buffer><expr> <C-g>101 \ defx#do_action('print')102 nnoremap <silent><buffer><expr> cd103 \ defx#do_action('change_vim_cwd')104 endfunction105106endif
Penjelasan
1autocmd FileType defx call s:defx_my_settings()
Baris di atas bertujuan untuk memanggil fungsi s:defx_my_settings
apabila file type dari buffer yang dibuka bernilai defx
.
1autocmd BufWritePost * call defx#redraw()
Baris di atas bertujuan untuk memanggil fungsi defx#redraw()
apabila seluruh buffer sudah di-write ke file –mungkin maksudnya di-save.
1autocmd BufEnter * call s:open_defx_if_directory()
Baris di atas bertujuan untuk memanggil fungsi s:open_defx_if_directory()
ketika vim dipanggil dengan atribut bernilai direktori misal: $ vim .config/nvim
.
1call defx#custom#option('_', {2 \ 'winwidth' : 40,3 \ 'split' : 'vertical',4 \ 'direction' : 'topleft',5 \ 'buffer_name' : 'defx',6 \ 'columns' : 'git:indent:icons:filename',7 \ 'show_ignored_files' : 0,8 \ 'toggle' : 1,9 \ 'resume' : 1,10 \ 'auto_cd' : 1,11 \ })
Baris di atas bertujuan untuk mengkonfigurasi fungsi defx#custom#option()
.
Saya akan menjelaskan bagian-bagian yang sekiranya tidak dipahami,
winwidth
, untuk membuat vertical split selebar 40px.
toggle
, untuk mengaktifkan fitur toggling, apabila :Defx
dipanggil.
columns
, untuk mendefisikan apa saja isi (konten) dari column defx
.
resume
, untuk mengaktifkan fitur resume –artinya, abaila kita menutup buffer Defx dan membukanya kembali, Defx akan mengingat posisi terakhir cursor kita berada.
auto_cd
, untuk mengaktifkan fungsi berganti direktori (change directory) ketika menafigasikan Defx untuk masuk atau keluar dari direktori. Catatan: hanya berfungsi apabila menggunakan fungsi defx#do_action('drop')
.
1call defx#custom#column('icon', {2 \ 'directory_icon' : ' ',3 \ 'opened_icon' : ' ',4 \ })
Baris di atas berfungsi untuk menghilangkan tanda panah yang secara default disertakan oleh Defx. Hal ini saya lakukan karena saya menggunakan plugin defx-icons yang akan memberikan icon-icon pada setiap direktori dan file.
1call defx#custom#column('filename', {2 \ 'min_width': 40,3 \ 'max_width': 1000,4 \ })
Baris di atas bertujuan untuk menghandle minimal & maximal lebar dari window pane agar filename tidak terpotong (truncated).
ini adalah judul yang sangat...panjang sekali.md
1function! s:open_defx_if_directory()2 try3 let l:full_path = expand(expand('%:p'))4 catch5 return6 endtry78 if isdirectory(l:full_path)9 execute "Defx `expand('%:p')` | bd " . expand('%:r')10 endif11endfunction
Baris di atas bertujuan untuk mendefisikan fungsi s:open_defx_if_directory()
. Fungsi ini digunakan untuk menghandle Defx agar terbuka ketika vim digunakan untuk membuka direktori –bukan file.
Catatan: masih terdapat banyak kekurangan pada fungsi ini.
1function! s:defx_my_settings() abort2 ...3endfunction
Baris di atas bertujuan untuk mendefinisikan keyboard mapping yang digunakan.
Kita dapat merubah-rubah sesuai preferensi pribadi masing-masing.
Konfigurasi Defx-icons
1" defx-icons23let g:defx_icons_enable_syntax_highlight = 14let g:defx_icons_column_length = 25let g:defx_icons_directory_icon = ''6let g:defx_icons_mark_icon = ''7let g:defx_icons_copy_icon = ''8let g:defx_icons_move_icon = ''9let g:defx_icons_parent_icon = ''10let g:defx_icons_default_icon = ''11let g:defx_icons_directory_symlink_icon = ''1213" Options below are applicable only when using 'tree' feature14let g:defx_icons_draw_tree_structure = 115let g:defx_icons_root_opened_tree_icon = ''16let g:defx_icons_nested_opened_tree_icon = ''17let g:defx_icons_nested_closed_tree_icon = ''1819" Define the default higlight color for defx-icons20hi default link DefxIconsMarkIcon Statement21hi default link DefxIconsCopyIcon WarningMsg22hi default link DefxIconsMoveIcon ErrorMsg23hi default link DefxIconsDirectory Directory24hi default link DefxIconsParentDirectory Directory25hi default link DefxIconsSymlinkDirectory Directory26hi default link DefxIconsOpenedTreeIcon Directory27hi default link DefxIconsNestedTreeIcon Directory28hi default link DefxIconsClosedTreeIcon Directory
Konfigurasi defx-git
1" defx-git23if exists('g:plugs["defx-git"]')4 call defx#custom#column('git', 'column_length', 1)56 call defx#custom#column('git', 'raw_mode', 0)78 call defx#custom#column('git', 'indicators', {9 \ 'Modified' : 'M',10 \ 'Staged' : '+',11 \ 'Untracked' : '*',12 \ 'Renamed' : 'R',13 \ 'Unmerged' : '=',14 \ 'Ignored' : 'i',15 \ 'Deleted' : 'X',16 \ 'Unknown' : '?'17 \ })1819 hi Defx_git_Untracked ctermfg=214 ctermbg=NONE20 hi Defx_git_Ignored ctermfg=214 ctermbg=NONE21 hi Defx_git_Unknown ctermfg=214 ctermbg=NONE22 hi Defx_git_Renamed ctermfg=214 ctermbg=NONE23 hi Defx_git_Modified ctermfg=214 ctermbg=NONE24 hi Defx_git_Unmerged ctermfg=214 ctermbg=NONE25 hi Defx_git_Deleted ctermfg=214 ctermbg=NONE26 hi Defx_git_Staged ctermfg=214 ctermbg=NONE27endif
Hasilnya
Kalau diperhatikan, kenapa status bar saya dapat berbeda ketika berada di buffer Defx?
Jawabannya ada di post setelah ini.
Credit
Terima kasih kepada Elianiva dan teh Tsara Fatma, untuk catatan di blognya.
Pesan Penulis
Sepertinya, segini dulu yang dapat saya tuliskan.
Untuk konfigurasi Defx milik saya yang lebih terbaru, dapat teman-teman kunjungi di sini.
Mudah-mudahan dapat bermanfaat.
Terima kasih.
(^_^)
Referensi
- github.com/crow-translate/crow-translate
Diakses tanggal: 2020/10/27