Vim:NERDTreeを現在開いているタブファイルパスと同期する方法は?


60

VIMで以前のファイルとは異なるパスで新しいタブを開くと、NERDTreeは以前のファイルと同じディレクトリ階層のままです。

現在のルートディレクトリを新しく開いたファイルのディレクトリに変更するための同期ショートカットはありますか?

回答:



116

次のマッピングを使用して、NERDTreeの現在のバッファーを表示します。

 map <leader>r :NERDTreeFind<cr>

3
これは非常に便利だと思うので、.vimrcに行きました。覚えやすくするために、他のバインディングを使用したかったのです。そして、私はNERDTreeでこれに対するバインディングがすでにあることを発見しました <Leader>f
ベンゼン

1
驚くばかり!私が探していたものの例。
mawaldne

これについて詳しく説明していただけますか?
jterm

この驚くべきvimrc(私のものではない)を使用している場合、それは、nfにマッピングされます:github.com/amix/vimrc
alpha_989

キーは<leader>何ですか?
stillanoob

29

ボスのように最後に%記号を投げる

:NERDTree %

私はこれを私の.vimrcに持っています、それはCtrl+ oをマッピングして、現在のバッファのディレクトリ内のnerdtreeを切り替えます:

map <C-o> :NERDTreeToggle %<CR>


2
あなたは私が懐疑的だったことを知っています。あなたがそれを言った方法で何か:D。しかし、これは私がそれを必要としていたようにうまくいった唯一のことです。
ヒューゴ

そのようなボスの答え!
ecbrodie

1
多くのボス、そのような答え
-mhz

唯一の問題は、空のファイルから開始する場合、現在のバッファのディレクトリがないためトグルが機能しないことです。
X.Arthur

25

既存の回答の両方が教育的であることがわかり、2つをうまく組み合わせて、多くの人々がIDEに期待するように動作します:開いているウィンドウ/バッファをクリックし、そのファイルをNERDTreeで強調表示します これを〜/ .vimrcに入れます:

autocmd BufEnter * if &modifiable | NERDTreeFind | wincmd p | endif

これは何をしますか:

  1. autocmd BufEnter -バッファ(NERDTreeウィンドウを含む)にフォーカスするたびに実行されます
  2. if &modifiable -NERDTreeウィンドウをクリックしても、他に何もしません(NERDTreeウィンドウは変更できません)
  3. wincmd p-NERDTreeFindは、カーソルをNERDTreeにフォーカスしたままにします。これにより、元々注目していたウィンドウに戻ります

注これは動作しませんその任意の変更はできません他のバッファ-しかし、それは一般的に良いことです。そうしないと(たとえば):helpvimにアクセスするたびに、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()

1
の目的はisNTFocused()何ですか?&modifiable小切手はそのケースをカバーしていませんか?
jrdioko

2
Function name must start with a capital or "s:": rc:isNTOpen()スコープを拡張するプラグインを使用していますか?
ブライアンハーク

1
申し訳ありませんが、私は知りません、@ BrianHaak。私は現在、NerdTreeを使用しておらず、.vimrcそのコードを書いた古いものを置き忘れました。を使用した理由を思い出せませんrc:が、他の関数との名前の競合を避けるための名前空間のことだと思います。私が思い出す限り、それに関連するプラグインは特に使用していませんでした。ドキュメントを調べるか、そのままにしてみて、何かが壊れていないかどうかを確認する必要があります。しかし、関数名の1つがNerdTreeまたは他の場所で競合していると思います。ほぼ5年間で誰も質問していないので、私はそれが簡単なものだと感じています。:)
ランバート

4
@Lambartすべての問題を解決した有用な構成を作成しました:gist.github.com/avesus/1954d9384d86cc1e39cb2b2eff7017b7
ブライアン・ハーク

1
クール。私は何年もの間、さまざまな.rcファイルをgit-ifyすることを意味してきました。いつか
...-ランバート

2

私は掘るの数時間後、私はsubmited、昨日この質問に出くわしたプル要求をするレポscroolooseのnerdtree導入NERDTreeCWD2012年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処理全体がスキップされます。


あなたのソリューションは、常にNERDTreeがオープンになっていませんか?また、MRUプラグインを使用してファイルを開こうとすると、この変更を使用した後、NERDtreeウィンドウでファイルが開きます。現状では、この変更により多くの問題とMRU(github.com/yegappan/mru/wiki/User-Manual)との競合が発生しますが、その理由はわかりません。他の人も同様の問題があるかどうかを確認できます。私はNERDtreeタブが常に開いていることが好きです。
alpha_989

ええ、これにより、常にNERDTreeが開いています。悲しみ。
メレディス

1

これは動作: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


0

このプラグインはあなたが望むものだと思いますhttps://github.com/jistr/vim-nerdtree-tabs


2
スーパーユーザーへようこそ!リンクを持つことが素敵であるが、望ましいだろうここコンテキストのビットを含むようにし、プラグインが何を説明し、それを使用すべきか、などをありがとう!
slhck

実際、これは尋ねられたものに対する良い解決策になる可能性があります
。– alpha_989

0

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.