web-dev-qa-db-ja.com

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

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

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

62
Jichao

NERDTree固有の方法があるかどうかはわかりませんが、いつでも 作業ディレクトリが現在のファイルのディレクトリに設定されるようにVimを構成できます

autocmd BufEnter * lcd %:p:h

これで、新しいタブでファイルを開いた後に行う必要があるのは、:NERDTreeToggle新しいタブ自体に。

15
Yaser Sulaiman

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

 map <leader>r :NERDTreeFind<cr>
120
shinzui

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

:NERDTree %

これは私の.vimrcにあります、マップします Ctrl+o 現在のバッファのディレクトリでオタクを切り替えるには:

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

33
schpet

私は既存の回答の両方を教育的に理解し、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にフォーカスしたままにします。これにより、最初にフォーカスしたウィンドウに戻ります

これは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()
26
Lambart

私は昨日この質問に遭遇し、数時間掘り下げた後、 Pull Requestscroolooseのオタクリポジトリに送信しました NERDツリールートを現在の作業ディレクトリに変更するNERDTreeCWDcommandを導入します(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処理全体がスキップされます。

2
weynhamz

これは: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
1
Matthias Braun

私は両方のソリューションを NERDTreeを使用して現在のディレクトリを変更する から適用します:cdを使用してNERDTree作業ディレクトリを現在のディレクトリに設定し、Cを使用してNERDTreeルートノードをカレントディレクトリ

1

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
0
Keith Schaab

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

0
j2fly