Vim: Bagaimana cara menyinkronkan NERDTree dengan jalur file tab yang dibuka saat ini?

60

Ketika saya membuka tab baru dengan jalur berbeda dari file sebelumnya di VIM, NERDTree masih akan tetap menjadi hierarki direktori yang sama dengan file sebelumnya.

Apakah ada pintasan sinkronisasi untuk mengubah direktori root saat ini ke direktori file yang baru dibuka?

Jichao
sumber

Jawaban:

116

Saya menggunakan pemetaan berikut untuk melihat buffer saat ini di NERDTree:

 map <leader>r :NERDTreeFind<cr>
shinzui
sumber
3
Saya menemukan ini sangat berguna, dan saya pergi ke .vimrc saya. Saya ingin menggunakan ikatan lain untuk membuatnya lebih mudah diingat. Dan saya menemukan bahwa sudah ada ikatan untuk ini dengan NERDTree <Leader>f
benzen
1
Luar biasa! Contoh apa yang saya cari.
mawaldne
Bisakah Anda menguraikan ini?
jterm
Jika Anda menggunakan vimrc yang luar biasa ini (bukan milik saya), ini dipetakan ke, nf: github.com/amix/vimrc
alpha_989
Apa kunci itu <leader>?
stillanoob
30

melemparkan tanda% pada akhirnya seperti bos

:NERDTree %

saya punya ini di .vimrc saya, ini memetakan Ctrl+ ountuk beralih nerdtree di dir buffer saat ini:

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

schpet
sumber
2
Anda tahu saya skeptis. Sesuatu dalam cara Anda mengatakannya: D. Tetapi ini adalah satu-satunya hal yang berfungsi seperti yang saya butuhkan, dilakukan dengan baik.
Hugo
Bos seperti itu menjawab!
ecbrodie
1
banyak bos, jawaban seperti itu
mhz
Satu-satunya masalah adalah ketika mulai dari file kosong, toggle tidak akan berfungsi karena tidak ada dir dari buffer saat ini.
X.Arthur
25

Saya menemukan kedua jawaban yang ada mendidik, dan berhasil menggabungkan keduanya sehingga perilakunya lebih seperti yang diharapkan banyak orang dari IDE: Klik pada jendela / buffer terbuka, dan minta file itu disorot di NERDTree. Saya meletakkan ini di ~ / .vimrc saya:

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

Apa yang dilakukan:

  1. autocmd BufEnter - berjalan setiap kali Anda fokus pada buffer (termasuk jendela NERDTree)
  2. if &modifiable - ketika Anda mengklik jendela NERDTree, jangan lakukan yang lain (jendela NERDTree tidak dapat dimodifikasi)
  3. wincmd p- NERDTreeFind membiarkan kursor terfokus pada NERDTree; ini beralih kembali ke jendela yang semula Anda fokuskan

Catatan bahwa ini tidak akan bekerja pada setiap penyangga lain yang tidak dimodifikasi - tapi itu merupakan hal baik; jika tidak (misalnya) setiap kali Anda masuk :helpvim, NERDTree akan menemukan dan memfokuskan direktori tempat file bantuan disimpan - mungkin bukan sesuatu yang Anda inginkan.

Solusi satu baris itu bekerja sangat baik untuk saya pada awalnya, tetapi saya segera menemukan bahwa itu menyebabkan NERDTree untuk aktif kapan saja saya membuka file - dan sebagai hasilnya, itu mencegah NERDTree dari pernah ditutup! Jika Anda tidak ingin menggunakan NERDTree secara penuh, letakkan ini di .vimrc Anda:

" 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()
Lambart
sumber
1
Apa tujuannya isNTFocused()? Bukankah &modifiablecek mencakup kasing itu?
jrdioko
2
Function name must start with a capital or "s:": rc:isNTOpen()Apakah Anda menggunakan plugin yang memperluas cakupan?
Brian Haak
1
Maaf tapi saya tidak tahu, @BrianHaak. Saya tidak menggunakan NerdTree saat ini, dan telah salah menempatkan yang lama .vimrcdi mana saya telah menulis kode itu. Saya tidak ingat mengapa saya menggunakan itu rc:, tapi saya pikir itu adalah namespacing hal untuk menghindari konflik nama dengan fungsi lainnya. Saya tidak menggunakan plugin apa pun yang secara khusus terkait dengan itu, sejauh yang saya ingat. Anda harus mempelajari dokumen, atau hanya mencoba meninggalkannya dan melihat apakah ada yang rusak. Tapi saya pikir salah satu nama fungsi bertentangan dengan sesuatu di NerdTree atau di tempat lain. Tidak ada orang lain yang bertanya dalam hampir 5 tahun, jadi saya merasa itu adalah sesuatu yang sederhana. :)
Lambart
4
@Lambart Saya telah membuat konfigurasi yang dapat digunakan dengan semua masalah terpecahkan: gist.github.com/avesus/1954d9384d86cc1e39cb2b2eff7017b7
Brian Haak
1
Keren. Saya telah bertahun-tahun memiliki makna untuk git-ify berbagai file .rc saya. Suatu hari ...
Lambart
2

Saya menemukan pertanyaan ini kemarin, setelah beberapa jam menggali, saya mengajukan Permintaan Tarik ke repro nerdtree scrooloose yang memperkenalkan NERDTreeCWDperintah yang mengubah akar pohon NERD ke direktori kerja saat ini (Pembaruan pada 2012-11-12: PR telah digabungkan ke dalam master hulu, harus dapat digunakan pada versi yang diperbarui). Dengan perubahan ini, pertanyaan ini dapat dengan mudah dipecahkan dengan kode berikut.

autocmd BufEnter * silent! if bufname('%') !~# 'NERD_tree_' | cd %:p:h | NERDTreeCWD | wincmd p | endif

Bandingkan dengan pendekatan @ shinzui dan @ Lambart NERDTreeFind, ini sesuai dengan pertanyaan. Menggunakan NERDTreeFindakan mengubah posisi gulir nerdtree dan hasilnya tidak selalu sama (Jika CWD berada di root pohon NERD, itu hanya cukup memperluas node alih-alih mengubahnya menjadi).

Bandingkan dengan jawaban @Yaser Sulaiman, solusi ini selalu membuka jendela NERD tree dan dapat dengan mudah dikodekan. Jika jendela pohon NERD telah dibuka, menggunakan NERDTreeToggleperlu dipecat dua kali (pertama tutup yang sudah ada, kemudian buka lagi), sayangnya, pembukaan kedua akan melewati seluruh pemrosesan cwd.

weynhamz
sumber
Bukankah solusi Anda menyebabkan NERDTree selalu terbuka? Saya juga menemukan bahwa jika saya menggunakan plugin MRU dan mencoba untuk membuka file, itu membuka file di jendela NERDtree setelah saya menggunakan perubahan ini. Modifikasi ini akan menyebabkan banyak masalah dan konflik dengan MRU ( github.com/yegappan/mru/wiki/User-Manual ), namun saya tidak tahu mengapa. Mungkin orang lain dapat memeriksa apakah mereka memiliki masalah serupa. Saya suka bahwa tab NERDtree selalu terbuka ..
alpha_989
Ya, ini menghasilkan NERDTree selalu terbuka. Kesedihan.
Meredith
1

Ini berperilaku seperti :NERDTreeToggletetapi akan menampilkan file yang sedang dibuka di NERDTree. Jika Anda belum membuka file (yaitu, Anda baru saja memasukkan vimdi commandline Anda) NERDTree menunjukkan /home.

Letakkan ini di .vimrc Anda:

" 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
Matthias Braun
sumber
0

Saya pikir plugin ini adalah apa yang Anda inginkan https://github.com/jistr/vim-nerdtree-tabs

j2fly
sumber
2
Selamat Datang di Pengguna Super! Walaupun memiliki tautan itu bagus, akan lebih baik untuk memasukkan sedikit konteks di sini, dan menjelaskan apa yang dilakukan plugin, bagaimana plugin itu harus digunakan, dll. Terima kasih!
slhck
Sebenarnya ini bisa menjadi solusi yang baik untuk apa yang diminta ..
alpha_989
0

Saya menemukan jawaban yang diposting Matthias menjadi jawaban yang bagus dengan satu masalah, itu tidak berfungsi dengan baik dalam beberapa kasus tepi. Ini bekerja sedikit lebih baik dengan perubahan di bawah ini:

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