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

Screencast

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