-
-
Notifications
You must be signed in to change notification settings - Fork 49
Tips
Alisue edited this page Feb 2, 2020
·
40 revisions
How to map a commnad 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 <sielnt> <Leader>ee :<C-u>Fern <C-r>=<SID>smart_path()<CR><CR>
" 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')
endfunctio
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 <buffer> o <Plug>(fern-action-open)
" Add any code to customize fern buffer
endfunction
augroup fern-custom
autocmd! *
autocmd FileType fern call s:init_fern()
augroup END
Use s:init_fern()
above like:
function! s:init_fern() abort
" Define NERDTree like mappings
nmap <buffer> o <Plug>(fern-action-open:edit)
nmap <buffer> go <Plug>(fern-action-open:edit)<C-w>p
nmap <buffer> t <Plug>(fern-action-open:tabedit)
nmap <buffer> T <Plug>(fern-action-open:tabedit)gT
nmap <buffer> i <Plug>(fern-action-open:split)
nmap <buffer> gi <Plug>(fern-action-open:split)<C-w>p
nmap <buffer> s <Plug>(fern-action-open:vsplit)
nmap <buffer> gs <Plug>(fern-action-open:vsplit)<C-w>p
nmap <buffer> P gg
nmap <buffer> C <Plug>(fern-action-enter)
nmap <buffer> u <Plug>(fern-action-leave)
nmap <buffer> r <Plug>(fern-action-reload)
nmap <buffer> R gg<Plug>(fern-action-reload)<C-o>
nmap <buffer> cd <Plug>(fern-action-cd)
nmap <buffer> CD gg<Plug>(fern-action-cd)<C-o>
nmap <buffer> I <Plug>(fern-action-hide-toggle)
nmap <buffer> q :<C-u>quit<CR>
endfunction
https://github.com/preservim/nerdtree/blob/master/doc/NERDTree.txt#L247-L293
Note that some features are missing.
Use fern#smart#leaf
like below:
function! s:init_fern() abort
nmap <buffer><expr>
\ <Plug>(fern-my-expand-or-collapse)
\ fern#smart#leaf(
\ "\<Plug>(fern-action-collapse)",
\ "\<Plug>(fern-action-expand)",
\ "\<Plug>(fern-action-collapse)",
\ )
nmap <buffer><nowait> l <Plug>(fern-my-expand-or-collapse)
endfunction
Use fern#smart#drawer
like below:
function! s:init_fern() abort
nmap <buffer><expr>
\ <Plug>(fern-my-expand-or-enter)
\ fern#smart#drawer(
\ "\<Plug>(fern-open-or-expand)",
\ "\<Plug>(fern-open-or-enter)",
\ )
nmap <buffer><expr>
\ <Plug>(fern-my-collapse-or-leave)
\ fern#smart#drawer(
\ "\<Plug>(fern-action-collapse)",
\ "\<Plug>(fern-action-leave)",
\ )
nmap <buffer><nowait> l <Plug>(fern-my-expand-or-enter)
nmap <buffer><nowait> h <Plug>(fern-my-collapse-or-leave)
endfunction
Use fern#smart#drawer
like below:
function! s:init_fern() abort
nmap <buffer><expr>
\ <Plug>(fern-my-open-or-enter)
\ fern#smart#drawer(
\ "\<Plug>(fern-open-or-enter)\<Plug>(fern-action-tcd)",
\ "\<Plug>(fern-open-or-enter)",
\ )
nmap <buffer><expr>
\ <Plug>(fern-my-leave)
\ fern#smart#drawer(
\ "\<Plug>(fern-action-leave)\<Plug>(fern-action-tcd)",
\ "\<Plug>(fern-action-leave)",
\ )
nmap <buffer><nowait> <Return> <Plug>(fern-my-open-or-enter)
nmap <buffer><nowait> <Backspace> <Plug>(fern-my-leave)
nmap <buffer><nowait> <C-m> <Plug>(fern-my-open-or-enter)
nmap <buffer><nowait> <C-h> <Plug>(fern-my-leave)
endfunction
function! s:fern_init() abort
" Find and enter project root
nnoremap <buffer><silent>
\ <Plug>(fern-my-enter-project-root)
\ :<C-u>call fern#helper#call(funcref('<SID>map_enter_project_root'))<CR>
nmap <buffer><expr><silent>
\ ^
\ 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 <buffer><silent>
\ <Plug>(fern-my-enter-bookmark)
\ :<C-u>Fern bookmark:///<CR>
nmap <buffer><expr><silent>
\ <C-^>
\ fern#smart#scheme(
\ "\<Plug>(fern-my-enter-bookmark)",
\ {
\ 'bookmark': "\<C-^>",
\ },
\ )
endfunction
" Disable netrw
let g:loaded_netrw = 1
let g:loaded_netrwPlugin = 1
let g:loaded_netrwSettings = 1
let g:loaded_netrwFileHandlers = 1
augroup my-fern-hijack
autocmd!
autocmd BufEnter * ++nested call s:hijack_directory()
augroup END
function! s:hijack_directory() abort
let path = expand('%')
if !isdirectory(path)
return
endif
Fern %
endfunction