Hentikan CtrlP dari pembukaan di NERDTree

9

Saya menggunakan keduanya CtrlPdan NERDTreedi Vim saya. Ketika saya membuka file menggunakan CtrlPfitur pencarian, kadang-kadang terbuka di jendela NERDTree (dan selalu jika jendela NERD adalah yang aktif).

Bagaimana saya bisa berhenti CtrlPmembuka file di NERDTree, dan memaksanya untuk membukanya di jendela utama? Saya sudah mencoba membaca CtrlPdokumen di Vim, tetapi tidak dapat menemukan cara.

Ini semua konfigurasi terkait NERDTree dan CtrlP di .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
sumber

Jawaban:

6

Akhirnya menemukan cara untuk melakukan ini yang tidak melibatkan penutupan NERDTree sepanjang waktu.

Saya membuat fungsi yang menggilir melalui jendela yang terbuka sampai menemukan buffer yang dapat ditulis, kemudian menjalankan ctrl-p di sana:

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

Seharusnya berfungsi untuk panel apa pun, misalnya MiniBufferExplorer.

DJ Madeira
sumber
Luar biasa, terima kasih sudah berbagi. Sudahkah Anda mempertimbangkan untuk berkontribusi langsung ke Ctrl-P?
bobylito
3

Saya sudah terlalu sering melakukan yang ini:

Saya telah memecahkannya dengan memetakan kembali <c-p>untuk menutup NERDTree (jika terbuka) dan kemudian membuka CtrlP.

Letakkan ini di .vimrc Anda:

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

Penjelasan: Baris pertama membuat CtrlP tidak menimpa pemetaan khusus Anda. Dan yang kedua berjalan dekat pada NERDTree sebelum membuka CtrlP.

Jonasl
sumber
3

Dari jawaban @jonasl, Anda juga dapat melakukan:

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

Untuk memperluas jawaban @DJ Madeira, saya membuat fungsi ini dapat digunakan kembali, karena saya juga menggunakan ctrl + l untuk daftar 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
sumber
1

Fungsi dari jawaban lain tidak berfungsi untuk saya, tetapi saya menemukan solusi sederhana yang berfungsi jika Anda selalu membuka NERDTree seperti yang saya lakukan. Tidak ada perintah untuk membatalkan fokus NERDTree, tetapi kita dapat memfokuskannya dan kemudian beralih ke jendela sebelumnya untuk memastikan itu tidak fokus. Perhatikan bahwa ini akan membuatnya terbuka jika tidak.

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