回答:
それを行うNERDTree固有の方法があるかどうかはわかりませんが、作業ディレクトリを現在のファイルのディレクトリに設定するようにVimをいつでも構成できます。
autocmd BufEnter * lcd %:p:h
これで、新しいタブでファイルを開いた後にしなければならないことはすべて:NERDTreeToggle
、新しいタブ自体にあります。
次のマッピングを使用して、NERDTreeの現在のバッファーを表示します。
map <leader>r :NERDTreeFind<cr>
<leader>
何ですか?
ボスのように最後に%記号を投げる
:NERDTree %
私はこれを私の.vimrcに持っています、それはCtrl+ oをマッピングして、現在のバッファのディレクトリ内のnerdtreeを切り替えます:
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にフォーカスしたままにします。これにより、元々注目していたウィンドウに戻ります注これは動作しませんその任意の変更はできません他のバッファ-しかし、それは一般的に良いことです。そうしないと(たとえば):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()
isNTFocused()
何ですか?&modifiable
小切手はそのケースをカバーしていませんか?
Function name must start with a capital or "s:": rc:isNTOpen()
スコープを拡張するプラグインを使用していますか?
.vimrc
そのコードを書いた古いものを置き忘れました。を使用した理由を思い出せませんrc:
が、他の関数との名前の競合を避けるための名前空間のことだと思います。私が思い出す限り、それに関連するプラグインは特に使用していませんでした。ドキュメントを調べるか、そのままにしてみて、何かが壊れていないかどうかを確認する必要があります。しかし、関数名の1つがNerdTreeまたは他の場所で競合していると思います。ほぼ5年間で誰も質問していないので、私はそれが簡単なものだと感じています。:)
私は掘るの数時間後、私はsubmited、昨日この質問に出くわしたプル要求をするレポscroolooseのnerdtree導入NERDTreeCWD
2012年11月12日に現在の作業ディレクトリ(Updateに変更NERDツリーのルートというコマンドを:PRはにマージされましたアップストリームマスター、更新されたバージョンで使用できる必要があります)。この変更により、この問題は次のコードで簡単に解決できます。
autocmd BufEnter * silent! if bufname('%') !~# 'NERD_tree_' | cd %:p:h | NERDTreeCWD | wincmd p | endif
@shinzuiと@LambartのNERDTreeFind
アプローチと比較すると、これはまさに質問がしたことです。を使用NERDTreeFind
すると、nerdtreeのスクロール位置が変更され、結果は常に同じではありません(CWDがNERDツリーのルートにある場合、ノードを単に展開する代わりに展開します)。
@Yaser Sulaimanの答えと比較すると、このソリューションでは常にNERDツリーウィンドウが開いており、簡単にコード化できます。NERDツリーウィンドウが既に開かれている場合、using 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ルートノードを現在のディレクトリに設定するために使用します
このプラグインはあなたが望むものだと思いますhttps://github.com/jistr/vim-nerdtree-tabs
Matthiasが投稿した回答は、1つの問題に対する素晴らしい回答であることがわかりました。それは、いくつかのエッジケースではうまく機能しません。以下の変更により、少し良くなります。
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
<Leader>f