VIMで以前のファイルとは異なるパスで新しいタブを開くと、NERDTreeは以前のファイルと同じディレクトリ階層のままです。
現在のルートディレクトリを新しく開いたファイルのディレクトリに変更するための同期ショートカットはありますか?
NERDTree固有の方法があるかどうかはわかりませんが、いつでも 作業ディレクトリが現在のファイルのディレクトリに設定されるようにVimを構成できます :
autocmd BufEnter * lcd %:p:h
これで、新しいタブでファイルを開いた後に行う必要があるのは、:NERDTreeToggle
新しいタブ自体に。
NERDTreeで現在のバッファーを表示するには、次のマッピングを使用します。
map <leader>r :NERDTreeFind<cr>
ボスのように最後に%記号を投げる
:NERDTree %
これは私の.vimrcにあります、マップします Ctrl+o 現在のバッファのディレクトリでオタクを切り替えるには:
map <C-o> :NERDTreeToggle %<CR>
私は既存の回答の両方を教育的に理解し、2つをうまく組み合わせて、多くの人々がIDEに期待するような動作を実現しました。開いているウィンドウ/バッファーをクリックし、そのファイルをNERDTreeで強調表示します。これを〜/ .vimrcに入れます:
autocmd BufEnter * if &modifiable | NERDTreeFind | wincmd p | endif
これは何をしますか:
autocmd BufEnter
-バッファ(NERDTreeウィンドウを含む)にフォーカスするたびに実行されますif &modifiable
-NERDTreeウィンドウをクリックしても、何もしません(NERDTreeウィンドウは変更できません)wincmd p
-NERDTreeFindは、カーソルをNERDTreeにフォーカスしたままにします。これにより、最初にフォーカスしたウィンドウに戻りますこれはany変更できない他のバッファでは機能しないことに注意してください-しかし、それは一般的に良いことです。それ以外の場合(たとえば):help
vimで、NERDTreeはヘルプファイルが格納されているディレクトリを見つけてフォーカスします。
この1行のソリューションは最初はうまく機能しましたが、ファイルを開いたときにNERDTreeがアクティブになることがすぐにわかりました。その結果、NERDTreeが閉じられなくなりました。 NERDTreeをフルタイムで使用したくない場合は、代わりにこれを.vimrcに入れます。
" returns true iff is NERDTree open/active
function! rc:isNTOpen()
return exists("t:NERDTreeBufName") && (bufwinnr(t:NERDTreeBufName) != -1)
endfunction
" calls NERDTreeFind iff NERDTree is active, current window contains a modifiable file, and we're not in vimdiff
function! rc:syncTree()
if &modifiable && rc:isNTOpen() && strlen(expand('%')) > 0 && !&diff
NERDTreeFind
wincmd p
endif
endfunction
autocmd BufEnter * call rc:syncTree()
私は昨日この質問に遭遇し、数時間掘り下げた後、 Pull Request を scroolooseのオタクリポジトリに送信しました NERDツリールートを現在の作業ディレクトリに変更するNERDTreeCWD
commandを導入します(2012-11-12の更新:PRは上流のマスターにマージされました。更新されたバージョン)。この変更により、この質問は次のコードで簡単に解決できます。
autocmd BufEnter * silent! if bufname('%') !~# 'NERD_tree_' | cd %:p:h | NERDTreeCWD | wincmd p | endif
@shinzuiや@LambartのNERDTreeFind
のアプローチと比較すると、これはまさに質問のとおりです。 NERDTreeFind
を使用すると、オタクツリーのスクロール位置が変更され、結果が常に同じになるわけではありません(CWDがNERDツリールートにある場合は、ノードを展開するだけで、ノードを展開するだけです)。
@Yaser Sulaimanの回答と比較すると、このソリューションは常にNERDツリーウィンドウを開いており、簡単にコード化できます。 NERDツリーウィンドウが既に開かれている場合、NERDTreeToggle
を使用して2回起動する必要があります(最初に既存のウィンドウを閉じてから再度開きます)。残念ながら、2回目の起動ではcwd処理全体がスキップされます。
これは:NERDTreeToggle
のように動作しますが、現在NERDTreeで開いているファイルを表示します。ファイルをまだ開いていない場合(つまり、コマンドラインでvim
と入力したばかりの場合)、NERDTreeは/home
を表示します。
これを.vimrcに入れてください:
" Open NERDTree in the directory of the current file (or /home if no file is open)
nmap <silent> <C-i> :call NERDTreeToggleInCurDir()<cr>
function! NERDTreeToggleInCurDir()
" If NERDTree is open in the current buffer
if (exists("t:NERDTreeBufName") && bufwinnr(t:NERDTreeBufName) != -1)
exe ":NERDTreeClose"
else
exe ":NERDTreeFind"
endif
endfunction
私は両方のソリューションを NERDTreeを使用して現在のディレクトリを変更する から適用します:cd
を使用してNERDTree作業ディレクトリを現在のディレクトリに設定し、C
を使用してNERDTreeルートノードをカレントディレクトリ
Matthiasが投稿した回答は、1つの問題に対する優れた回答であることがわかりました。これは、いくつかのEdgeケースではうまく機能しません。以下の変更で少しうまくいきます:
function! NERDTreeToggleInCurDir()
" If NERDTree is open in the current buffer
if (exists("t:NERDTreeBufName") && bufwinnr(t:NERDTreeBufName) != -1)
exe ":NERDTreeClose"
elseif bufname('%')
exe ":NERDTreeFind"
else
exe ":NERDTreeCWD"
endif
endfunction
このプラグインはあなたが望むものだと思います https://github.com/jistr/vim-nerdtree-tabs