Vim: NERDTree ile mevcut açılmış sekme dosya yolu nasıl senkronize edilir?


60

VIM'deki önceki dosyadan farklı bir yolla yeni bir sekme açtığımda, NERDTree, önceki dosyanın aynı dizin sıradüzeni olarak kalmaya devam edecek.

Geçerli kök dizini yeni açılan dosyanın dizinine dönüştürmek için eşitleme kısayolu var mı?

Yanıtlar:



116

Geçerli arabelleği NERDTree'de görüntülemek için aşağıdaki eşlemeyi kullanıyorum:

 map <leader>r :NERDTreeFind<cr>

3
Bunu çok yararlı buluyorum ve .vimrc'ye gittim. Hatırlamamı kolaylaştırmak için başka bir bağlayıcı kullanmak istedim. Ve bunun için zaten NERDTree<Leader>f
benzen ile

1
Korku veren! Örnek ne aradım.
mawaldne

Bu konuda ayrıntılı bilgi verebilir misiniz?
jterm

Eğer bu şaşırtıcı vimrc kullanıyorsanız (benim değil), nf: github.com/amix/vimrc
alpha_989 21:17

Anahtar nedir <leader>?
stillanoob

29

Bir patron gibi bir% işareti atmak

:NERDTree %

.vimrc dosyamda bu, şu anki arabellek dizinde nerdtree geçiş yapmak için Ctrl+ oeşlenir:

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


2
Şüpheci olduğumu biliyorsun. Söylediğin gibi bir şey: D. Ama ihtiyacım olan gibi çalışan tek şey bu, aferin.
Hugo

Böyle bir patron cevap!
ecbrodie

1
patron, böyle bir cevap
mhz

Tek sorun, boş bir dosyadan başlatırken, geçerli tamponun dir'si olmadığından açma düğmesi çalışmaz.
X.Arthur

25

Hem mevcut cevapları eğitici buldum hem de iki kişiyi başarılı bir şekilde birleştirdim, böylece davranış bir IDE'den bekleyeceği gibi oldu: Açık bir pencereye / arabelleğe tıklayın ve bu dosyayı NERDTree'de vurgulayın. Bunu ~ / .vimrc dosyasına koydum:

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

Bu ne yapar:

  1. autocmd BufEnter - Tamponun üzerine her odaklandığınızda çalışır (NERDTree penceresi dahil)
  2. if &modifiable - NERDTree penceresini tıkladığınızda başka hiçbir şey yapmayın (NERDTree penceresi değiştirilemez)
  3. wincmd p- NERDTreeFind, NERDTree'ye odaklanan imleci bırakır; bu, başlangıçta odaklandığınız pencereye geri döner

Bu çalışmaz unutmayın herhangi değiştirilebilir değil diğer tampon - ama bu genelde iyi bir şey; aksi takdirde (örneğin) herhangi bir zamanda :helpvim'de olduğunuzda, NERDTree yardım dosyalarının bulunduğu dizini bulur ve odaklar - muhtemelen yapmak istediğiniz bir şey değildir.

Bu tek satırlık çözüm ilk başta benim için çok işe yaradı, ancak yakında NERDTree’nin bir dosyayı açtığımda etkinleştirmeme neden olduğunu gördüm - ve sonuç olarak NERDTree’nin kapatılmasını önlüyor! Tam zamanlı NERDTree kullanmak istemiyorsanız, bunun yerine .vimrc'nize koyun:

" 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
Amacı nedir isNTFocused()? Does not &modifiableonay çantayı kapsayacak?
jrdioko

2
Function name must start with a capital or "s:": rc:isNTOpen()Bir eklenti genişletme kapsamı kullanıyor musunuz?
Brian Haak,

1
Üzgünüm ama bilmiyorum, @HaNha Şu anda NerdTree kullanmıyorum ve eskiden .vimrcbu kodu yazdığım yerimi değiştirmedim . Neden kullandığımı hatırlamıyorum rc:, ancak adın diğer işlevlerle çakışmasından kaçınmak için ad alanını belirleyen bir şey olduğunu düşünüyorum. Hatırladığım kadarıyla, özellikle bununla ilgili herhangi bir eklenti kullanmıyordum. Dokümanları incelemeniz veya sadece ayrılmayı denemeniz ve herhangi bir şey olup olmadığını görmek zorundasınız. Fakat fonksiyon isimlerinden birinin NerdTree'de veya başka bir yerde bir şeyle çakıştığını düşünüyorum. Neredeyse hiç kimse 5 yıl boyunca sormadı, bu yüzden basit bir şey olduğunu hissediyorum. :)
Lambart

4
@Lambart Çözülen tüm problemlerle birlikte kullanılabilir bir konfigürasyon oluşturdum: gist.github.com/avesus/1954d9384d86cc1e39cb2b2eff7017b7
Brian Haak

1
Güzel. Yıllar boyunca çeşitli .rc dosyalarımın gitmesi için bir anlam ifade ettim. Bir gün ...
Lambart

2

Birkaç saat kazı yaptıktan sonra dün bu soruya rastladım, NERD ağaç kökünü geçerli çalışma dizinine dönüştüren bir komutu tanıtarak bir çekişme deposunu scrooloose yapmak için bir Çekme İsteği gönderdim (Güncelleme 2012-11-12: PR ile birleştirildi) upstream master, güncellenmiş bir versiyonda kullanılabilir olmalıdır). Bu değişiklikle, bu soru basitçe aşağıdaki kod ile çözülebilir.NERDTreeCWD

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

@ Shinzi's ve @ Lambart'ın NERDTreeFindyaklaşımına kıyasla , bu tam olarak sorulan soruyu yapar. Kullanarak NERDTreeFindnerdtree kaydırma konumunu değiştirecek ve sonuç her zaman aynı değildir (CWD NERD ağaç kökündeyse, sadece yerine değiştirmek yerine düğümü genişletir).

@Yaser Sulaiman'ın cevabını karşılaştırın, bu çözüm her zaman NERD ağaç penceresini açtı ve kolayca bağlanabilir. Bir NERD ağaç penceresi zaten açılmışsa, kullanımın NERDTreeToggleiki kez ateşlenmesi gerekir (önce mevcut olanı kapatın, sonra tekrar açın), ne yazık ki, ikinci açılış tüm cwd işlemini atlayacaktır.


Çözümünüz NERDTree’nin her zaman açık olmasına yol açmıyor mu? Ayrıca MRU eklentisini kullanırsam ve dosyaları açmaya çalışırsam, bu değişikliği kullandıktan sonra NERDtree penceresinde dosyaları açacağını anlıyorum. Bu değişiklik olduğu gibi, MRU ( github.com/yegappan/mru/wiki/User-Manual ) ile ilgili birçok soruna ve çatışmaya neden olacaktır , ancak nedenini bilmiyorum. Belki başkaları da benzer sorunları olup olmadığını kontrol edebilir. NERDtree sekmesinin her zaman açık
olmasını isterim

Evet, bu NERDTree’de her zaman açık olma ile sonuçlanır. Üzüntü.
Meredith

1

Bu gibi davranır, :NERDTreeToggleancak açık olan dosyayı NERDTree'de gösterir. Henüz bir dosya vimaçmadıysanız (yani, komut satırına yeni girdiniz ) NERDTree gösterir /home.

Bunu .vimrc'nize koyun:

" 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

Matthias'ın bir sorunla harika bir cevap olarak gönderdiği cevabı buldum, birkaç önemli durumda iyi sonuç vermedi. Aşağıdaki değişiklikle biraz daha iyi çalışır:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.