Empêcher CtrlP de s'ouvrir dans NERDTree

9

J'utilise les deux CtrlPet NERDTreedans mon Vim. Lorsque j'ouvre un fichier à l'aide de la CtrlPfonction de recherche, il s'ouvre parfois dans la fenêtre NERDTree (et toujours si la fenêtre NERD est la fenêtre active).

Comment puis-je m'arrêter CtrlPd'ouvrir des fichiers dans NERDTree et le forcer à les ouvrir dans la fenêtre principale? J'ai essayé de parcourir les CtrlPdocuments dans Vim, mais je n'ai pas réussi à trouver un moyen.

Ce sont toutes les configurations liées à NERDTree et CtrlP dans mon .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
la source

Réponses:

6

Enfin trouvé un moyen de le faire qui n'implique pas de fermer NERDTree tout le temps.

J'ai créé une fonction qui parcourt les fenêtres ouvertes jusqu'à ce qu'elle trouve un tampon inscriptible, puis y exécute ctrl-p:

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

Devrait fonctionner pour n'importe quel panneau, par exemple MiniBufferExplorer.

DJ Madeira
la source
Excellent, merci pour le partage. Avez-vous envisagé de contribuer directement à Ctrl-P?
bobylito
3

J'ai trébuché sur celui-ci trop de fois aussi:

Je l'ai résolu en <c-p>remappant le NERDTree à la fermeture (s'il est ouvert), puis en ouvrant CtrlP.

Mettez ceci dans votre .vimrc:

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

Explication: La première ligne empêche CtrlP d'écraser votre mappage personnalisé. Et le second tourne sur NERDTree avant d'ouvrir CtrlP.

jonasl
la source
3

De la réponse @jonasl, vous pouvez également faire:

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

Pour développer la réponse de @DJ Madeira, j'ai rendu cette fonction réutilisable, car j'utilise également ctrl + l pour la liste 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
la source
1

Les fonctions d'autres réponses ne fonctionnaient pas pour moi, mais j'ai trouvé une solution simple qui fonctionne si vous gardez toujours NERDTree ouvert comme je le fais. Il n'y a pas de commande pour défocaliser NERDTree, mais nous pouvons le focaliser puis passer à la fenêtre précédente pour nous assurer qu'il n'est pas focalisé. Notez que cela entraînera son ouverture s'il ne l'était pas.

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