Tips (original) (raw)
How to map a command to open a buffer parent directory or current working directory when the buffer is not a file
Use <C-r>=...<CR> to specify a special function like below:
nnoremap ee :Fern =smart_path()
" Return a parent directory of the current buffer when the buffer is a file. " Otherwise it returns a current working directory. function! s:smart_path() abort if !empty(&buftype) || bufname('%') =~# '^[^:]+://' return fnamemodify('.', ':p') endif return fnamemodify(expand('%'), ':p:h') endfunction
How to customize fern buffer
Use FileType autocmd to initialize fern buffer like:
function! s:init_fern() abort echo "This function is called ON a fern buffer WHEN initialized"
" Open node with 'o' nmap o (fern-action-open)
" Add any code to customize fern buffer endfunction
augroup fern-custom autocmd! * autocmd FileType fern call s:init_fern() augroup END
Define NERDTree like mappings
Use s:init_fern() above like:
function! s:init_fern() abort " Define NERDTree like mappings nmap o (fern-action-open:edit) nmap go (fern-action-open:edit)p nmap t (fern-action-open:tabedit) nmap T (fern-action-open:tabedit)gT nmap i (fern-action-open:split) nmap gi (fern-action-open:split)p nmap s (fern-action-open:vsplit) nmap gs (fern-action-open:vsplit)p nmap ma (fern-action-new-path) nmap P gg
nmap C (fern-action-enter) nmap u (fern-action-leave) nmap r (fern-action-reload) nmap R gg(fern-action-reload) nmap cd (fern-action-cd) nmap CD gg(fern-action-cd)
nmap I (fern-action-hidden-toggle)
nmap q :quit endfunction
https://github.com/preservim/nerdtree/blob/master/doc/NERDTree.txt#L247-L293
Note that some features are missing.
Perform expand or collapse directory
Use fern#smart#leaf like below:
function! s:init_fern() abort nmap \ (fern-my-expand-or-collapse) \ fern#smart#leaf( \ "<Plug>(fern-action-collapse)", \ "<Plug>(fern-action-expand)", \ "<Plug>(fern-action-collapse)", \ )
nmap l (fern-my-expand-or-collapse) endfunction
Perform enter in explorer style but expand in drawer style
Use fern#smart#drawer like below:
function! s:init_fern() abort nmap \ (fern-my-expand-or-enter) \ fern#smart#drawer( \ "<Plug>(fern-open-or-expand)", \ "<Plug>(fern-open-or-enter)", \ ) nmap \ (fern-my-collapse-or-leave) \ fern#smart#drawer( \ "<Plug>(fern-action-collapse)", \ "<Plug>(fern-action-leave)", \ ) nmap l (fern-my-expand-or-enter) nmap h (fern-my-collapse-or-leave) endfunction
Perform tcd on the root node after enter or leave action
Use <Plug>(fern-wait) to wait enter or leave action like:
nmap (fern-my-enter-and-tcd) \ (fern-action-enter) \ (fern-wait) \ (fern-action-tcd:root)
nmap (fern-my-leave-and-tcd) \ (fern-action-leave) \ (fern-wait) \ (fern-action-tcd:root)
Perform tcd on the root node on BufEnter autocmd
Use feedkeys() to execute the <Plug>(fern-action-tcd:root) like:
augroup my_fern_tcd autocmd! * autocmd BufEnter call feedkeys("<Plug>(fern-action-tcd:root)") augroup END
Enter a project root via ^
See https://github.com/lambdalisue/fern-mapping-project-top.vim
function! s:fern_init() abort " Find and enter project root nnoremap \ (fern-my-enter-project-root) \ :call fern#helper#call(funcref('map_enter_project_root')) nmap \ ^ \ fern#smart#scheme( \ "^", \ { \ 'file': "<Plug>(fern-my-enter-project-root)", \ } \ ) endfunction
function! s:map_enter_project_root(helper) abort " NOTE: require 'file' scheme let root = a:helper.get_root_node() let path = root._path let path = finddir('.git/..', path . ';') execute printf('Fern %s', fnameescape(path)) endfunction
Open bookmark:/// and return via <C-^>
function! s:fern_init() abort " Open bookmark:/// nnoremap \ (fern-my-enter-bookmark) \ :Fern bookmark:/// nmap \ <C-^> \ fern#smart#scheme( \ "<Plug>(fern-my-enter-bookmark)", \ { \ 'bookmark': "<C-^>", \ }, \ ) endfunction
Use fern as a default directory browser (hijack netrw)
Use https://github.com/lambdalisue/fern-hijack.vim
Stay after open
Use <C-w><C-p> like
nmap (my-fern-open-and-stay) (fern-action-open)
Close fern after open
Use :FernDo to execute close command after open. Note that <Plug>(fern-close-drawer) is a global mapping.
nnoremap (fern-close-drawer) :FernDo close -drawer -stay nmap (fern-action-open-and-close) \ (fern-action-open) \ (fern-close-drawer)
Start fern.vim on Vim startup with a particular directory
augroup my-fern-startup autocmd! * autocmd VimEnter * ++nested Fern ~/ augroup END
Preview leaf content by j/k like VS code

function! s:fern_preview_init() abort nmap \ (fern-my-preview-or-nop) \ fern#smart#leaf( \ "<Plug>(fern-action-open:edit)<C-w>p", \ "", \ ) nmap j \ fern#smart#drawer( \ "j<Plug>(fern-my-preview-or-nop)", \ "j", \ ) nmap k \ fern#smart#drawer( \ "k<Plug>(fern-my-preview-or-nop)", \ "k", \ ) endfunction
augroup my-fern-preview autocmd! * autocmd FileType fern call s:fern_preview_init() augroup END
" You need this otherwise you cannot switch modified buffer set hidden
See https://github.com/lambdalisue/fern.vim/issues/193 for more detail