Pare de CtrlP de abrir no NERDTree

9

Eu uso os dois CtrlPe NERDTreeno meu Vim. Quando abro um arquivo usando o CtrlPrecurso de pesquisa, ele às vezes é aberto na janela NERDTree (e sempre se a janela NERD for a ativa).

Como posso parar CtrlPde abrir arquivos no NERDTree e forçá-lo a abri-los na janela principal? Eu tentei examinar os CtrlPdocumentos no Vim, mas não consegui descobrir uma maneira.

Estas são todas as configurações relacionadas ao NERDTree e CtrlP no meu .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
fonte

Respostas:

6

Finalmente, encontrei uma maneira de fazer isso que não envolve o fechamento do NERDTree o tempo todo.

Eu criei uma função que percorre as janelas abertas até encontrar um buffer gravável e executa o ctrl-p lá:

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()'

Deve funcionar para qualquer painel, por exemplo, MiniBufferExplorer.

DJ Madeira
fonte
Excelente, obrigado por compartilhar. Você já pensou em contribuir com isso diretamente para o Ctrl-P?
bobylito
3

Eu também tropecei nessa também:

Eu o resolvi <c-p>remapeando o NERDTree para fechamento (se aberto) e, em seguida, abrindo CtrlP.

Coloque isso no seu .vimrc:

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

Explicação: A primeira linha faz com que o CtrlP não substitua seu mapeamento personalizado. E o segundo é executado próximo ao NERDTree antes de abrir o CtrlP.

jonasl
fonte
3

Na resposta @jonasl, você também pode:

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

Para expandir a resposta do @DJ Madeira, tornei essa função reutilizável, pois também estou usando ctrl + l na 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
fonte
1

As funções de outras respostas não funcionaram para mim, mas eu encontrei uma solução simples que funciona se você sempre mantiver o NERDTree aberto como eu. Não há nenhum comando para desfocar o NERDTree, mas podemos focalizá-lo e depois mudar para a janela anterior para garantir que ele não esteja focado. Observe que isso fará com que seja aberto se não estiver.

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