Dừng CtrlP mở trong NERDTree


8

Tôi sử dụng cả hai CtrlPNERDTreetrong Vim của tôi. Khi tôi mở tệp bằng CtrlPtính năng tìm kiếm, đôi khi nó sẽ mở trong cửa sổ NERDTree (và luôn luôn nếu cửa sổ NERD là hoạt động).

Làm cách nào tôi có thể dừng CtrlPmở các tệp trong NERDTree và buộc nó mở chúng trong cửa sổ chính? Tôi đã thử xem qua các CtrlPtài liệu trong Vim, nhưng không thể tìm ra cách.

Đây là tất cả các cấu hình liên quan đến NERDTree và CtrlP trong .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>

Câu trả lời:


6

Cuối cùng cũng tìm ra cách để làm điều này mà không liên quan đến việc đóng NERDTree mọi lúc.

Tôi đã thực hiện một chức năng xoay vòng qua các cửa sổ đang mở cho đến khi nó tìm thấy một bộ đệm có thể ghi, sau đó chạy 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()'

Nên hoạt động cho bất kỳ bảng điều khiển nào, ví dụ MiniBufferExplorer.


Tuyệt vời, cảm ơn đã chia sẻ. Bạn đã xem xét có thể đóng góp điều đó cho Ctrl-P trực tiếp chưa?
bobylito

3

Tôi cũng đã vấp phải cái này quá nhiều lần:

Tôi đã giải quyết nó bằng cách ánh xạ lại <c-p>để đóng NERDTree (nếu mở) và sau đó mở CtrlP.

Đặt cái này trong .vimrc của bạn:

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

Giải thích: Dòng đầu tiên làm cho CtrlP không ghi đè lên ánh xạ tùy chỉnh của bạn. Và cái thứ hai chạy gần trên NERDTree trước khi mở CtrlP.


3

Từ câu trả lời @jonasl, bạn cũng có thể làm:

let g:ctrlp_cmd = ':NERDTreeClose\|CtrlP'

2

Để mở rộng câu trả lời của @DJ Madeira, tôi đã thực hiện chức năng này có thể sử dụng lại được, vì tôi cũng đang sử dụng ctrl + l cho danh sách 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>

1

Các hàm từ các câu trả lời khác không hoạt động với tôi, nhưng tôi đã tìm thấy một giải pháp đơn giản hoạt động nếu bạn luôn giữ NERDTree mở như tôi. Không có lệnh để không tập trung NERDTree, nhưng chúng ta có thể tập trung vào nó và sau đó chuyển sang cửa sổ trước để đảm bảo nó không tập trung. Lưu ý rằng điều này sẽ khiến nó mở nếu không.

let g:ctrlp_map = ''
map <C-P> :NERDTreeFocus<CR>:wincmd w<CR>:CtrlP<CR>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.