Evite que CtrlP se abra en NERDTree

9

Yo uso ambos CtrlPy NERDTreeen mi Vim. Cuando abro un archivo usando la CtrlPfunción de búsqueda, a veces se abre en la ventana NERDTree (y siempre si la ventana NERD es la activa).

¿Cómo puedo evitar CtrlPabrir archivos en NERDTree y forzarlo a abrirlos en la ventana principal? Intenté CtrlPrevisar los documentos en Vim, pero no pude encontrar la manera.

Estas son todas las configuraciones relacionadas con NERDTree y CtrlP en mi .vimrc:

let g:netrw_liststyle    = 3
let NERDTreeShowHidden   = 1
let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files -co --exclude-standard']

command E Ex

map <C-t> :NERDTreeTabsToggle<CR>
nmap <Leader>r :NERDTreeFocus<cr>R<c-w><c-p>:CtrlPClearCache<cr>
Sheharyar
fuente

Respuestas:

6

Finalmente encontré una manera de hacer esto que no implica cerrar NERDTree todo el tiempo.

Hice una función que recorre las ventanas abiertas hasta que encuentra un búfer de escritura, luego ejecuta ctrl-p allí:

function! CtrlPCommand()
    let c = 0
    let wincount = winnr('$')
    " Don't open it here if current buffer is not writable (e.g. NERDTree)
    while !empty(getbufvar(+expand("<abuf>"), "&buftype")) && c < wincount
        exec 'wincmd w'
        let c = c + 1
    endwhile
    exec 'CtrlP'
endfunction

let g:ctrlp_cmd = 'call CtrlPCommand()'

Debería funcionar para cualquier panel, por ejemplo MiniBufferExplorer.

DJ Madeira
fuente
Excelente, gracias por compartir. ¿Has considerado quizás contribuir eso a Ctrl-P directamente?
bobylito
3

Me he tropezado con este también muchas veces:

Lo resolví reasignando <c-p>para cerrar NERDTree (si está abierto) y luego abriendo CtrlP.

Pon esto en tu .vimrc:

let g:ctrlp_map = ''                      
nnoremap <c-p> :NERDTreeClose\|CtrlP<CR>  

Explicación: La primera línea hace que CtrlP no sobrescriba su mapeo personalizado. Y el segundo se ejecuta cerca de NERDTree antes de abrir CtrlP.

jonasl
fuente
3

De la respuesta de @jonasl, también podrías hacer:

let g:ctrlp_cmd = ':NERDTreeClose\|CtrlP'
cmcginty
fuente
2

Para ampliar la respuesta de @DJ Madeira, hice esta función reutilizable, ya que también estoy usando ctrl + l para la lista MRU

" CtrlP
" Use this function to prevent CtrlP opening files inside non-writeable 
buffers, e.g. NERDTree
function! SwitchToWriteableBufferAndExec(command)
    let c = 0
    let wincount = winnr('$')
    " Don't open it here if current buffer is not writable (e.g. NERDTree)
    while !empty(getbufvar(+expand("<abuf>"), "&buftype")) && c < wincount
        exec 'wincmd w'
        let c = c + 1
    endwhile
    exec a:command
endfunction

" Disable default mapping since we are overriding it with our command
let g:ctrlp_map = ''
nnoremap <C-p> :call SwitchToWriteableBufferAndExec('CtrlP')<CR>
nnoremap <C-l> :call SwitchToWriteableBufferAndExec('CtrlPMRUFiles')<CR>
Paweł Duda
fuente
1

Las funciones de otras respuestas no funcionaron para mí, pero encontré una solución simple que funciona si siempre mantienes NERDTree abierto como yo. No hay ningún comando para desenfocar NERDTree, pero podemos enfocarlo y luego cambiar a la ventana anterior para asegurarnos de que esté desenfocado. Tenga en cuenta que esto hará que se abra si no fue así.

let g:ctrlp_map = ''
map <C-P> :NERDTreeFocus<CR>:wincmd w<CR>:CtrlP<CR>
Michael Grischenko
fuente