Jawaban:
Saya tidak yakin apakah ada cara spesifik NERDTree untuk melakukan itu, tetapi Anda selalu dapat mengonfigurasi Vim sehingga ia menetapkan direktori kerja ke direktori file saat ini :
autocmd BufEnter * lcd %:p:h
Sekarang semua yang harus Anda lakukan setelah membuka file di tab baru adalah :NERDTreeToggle
di tab baru itu sendiri.
Saya menggunakan pemetaan berikut untuk melihat buffer saat ini di NERDTree:
map <leader>r :NERDTreeFind<cr>
<leader>
?
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>
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:
autocmd BufEnter
- berjalan setiap kali Anda fokus pada buffer (termasuk jendela NERDTree)if &modifiable
- ketika Anda mengklik jendela NERDTree, jangan lakukan yang lain (jendela NERDTree tidak dapat dimodifikasi)wincmd p
- NERDTreeFind membiarkan kursor terfokus pada NERDTree; ini beralih kembali ke jendela yang semula Anda fokuskanCatatan bahwa ini tidak akan bekerja pada setiap penyangga lain yang tidak dimodifikasi - tapi itu merupakan hal baik; jika tidak (misalnya) setiap kali Anda masuk :help
vim, 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()
isNTFocused()
? Bukankah &modifiable
cek mencakup kasing itu?
Function name must start with a capital or "s:": rc:isNTOpen()
Apakah Anda menggunakan plugin yang memperluas cakupan?
.vimrc
di 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. :)
Saya menemukan pertanyaan ini kemarin, setelah beberapa jam menggali, saya mengajukan Permintaan Tarik ke repro nerdtree scrooloose yang memperkenalkan NERDTreeCWD
perintah 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 NERDTreeFind
akan 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 NERDTreeToggle
perlu dipecat dua kali (pertama tutup yang sudah ada, kemudian buka lagi), sayangnya, pembukaan kedua akan melewati seluruh pemrosesan cwd.
Ini berperilaku seperti :NERDTreeToggle
tetapi akan menampilkan file yang sedang dibuka di NERDTree. Jika Anda belum membuka file (yaitu, Anda baru saja memasukkan vim
di 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
Saya menerapkan kedua solusi dari Ubah direktori saat ini menggunakan NERDTree : gunakan cd
untuk mengatur direktori kerja NERDTree ke direktori saat ini dan C
untuk mengatur simpul root NERDTree ke direktori saat ini
Saya pikir plugin ini adalah apa yang Anda inginkan https://github.com/jistr/vim-nerdtree-tabs
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
<Leader>f