我在Vim中同时使用CtrlPNERDTree。当我使用CtrlP搜索功能打开文件时,有时会在NERDTree窗口中打开文件(并且总是在NERD窗口处于活动状态的情况下)。

如何阻止CtrlP在NERDTree中打开文件,并强迫它在主窗口中打开它们?我曾尝试过Vim中的CtrlP文档,但找不到解决方法。

这些都是.vimrc中与NERDTree和CtrlP相关的所有配置:

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>


#1 楼

最终找到了一种无需一直关闭NERDTree的方法。

我创建了一个函数,该函数在打开的窗口中循环直到找到可写缓冲区,然后在其中运行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()'


应适用于任何面板,例如MiniBufferExplorer。

评论


太好了,谢谢分享。您是否考虑过直接将其贡献给Ctrl-P?

– bobylito
17年7月30日在16:41

#2 楼

我对此跳闸了太多次了:

我通过重新映射<c-p>来关闭NERDTree(如果已打开)然后打开CtrlP来解决了这个问题。这在您的.vimrc中:

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


说明:
第一行使CtrlP不会覆盖您的自定义映射。
第二行关闭在打开CtrlP之前在NERDTree上运行。

#3 楼

通过@jonasl答案,您还可以执行以下操作:

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


#4 楼

为了扩展@DJ Madeira的答案,我使此函数可重复使用,因为我还在MRU列表中使用ctrl + l

" 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>


#5 楼

来自其他答案的功能对我不起作用,但是我发现一个简单的解决方案,如果您始终像我一样一直打开NERDTree,则该解决方案会起作用。没有使NERDTree失去焦点的命令,但是我们可以使其集中焦点,然后切换到上一个窗口以确保其没有焦点。请注意,如果没有打开,这将导致它打开。

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