विम: कैसे वर्तमान खोला टैब फ़ाइल पथ के साथ NERDTree को सिंक्रनाइज़ करने के लिए?


60

जब मैं VIM में पिछली फ़ाइल से अलग पथ के साथ एक नया टैब खोलता हूं, तो NERDTree अभी भी पिछली फ़ाइल की समान निर्देशिका पदानुक्रम बनी रहेगी।

वर्तमान रूट निर्देशिका को नई खोली गई फ़ाइल की निर्देशिका में बदलने के लिए सिंक शॉर्टकट है?

जवाबों:


15

मुझे यकीन नहीं है कि ऐसा करने के लिए एक NERDTree- विशिष्ट तरीका है, लेकिन आप हमेशा विम को कॉन्फ़िगर कर सकते हैं ताकि यह वर्तमान फ़ाइल की निर्देशिका में कार्यशील निर्देशिका को सेट कर दे :

autocmd BufEnter * lcd %:p:h

अब एक नए टैब में फ़ाइल खोलने के बाद आपको जो कुछ करना है :NERDTreeToggle, वह सभी नए टैब में ही है।


116

NERDTree में वर्तमान बफर देखने के लिए मैं निम्नलिखित मैपिंग का उपयोग करता हूं:

 map <leader>r :NERDTreeFind<cr>

3
मुझे यह बहुत उपयोगी लगता है, और मैं अपने .vimrc चला गया। मैं कुछ अन्य बाध्यकारी का उपयोग करना चाहता था ताकि मुझे याद रखना आसान हो सके। और मैं पहले से ही पता चला है कि वहाँ NERDTree के साथ इस के लिए एक बाध्यकारी <Leader>f
benzen

1
बहुत बढ़िया! उदाहरण मैं क्या देख रहा था।
मावलडेन

क्या आप इसे विस्तार से बताएंगे?
१०:५० पर jterm

यदि आप इस अद्भुत vimrc (मेरा नहीं) का उपयोग कर रहे हैं, तो इसे मैप किया जाता है, nf: github.com/amix/vimrc
alp_989

क्या कुंजी है <leader>?
स्टिलानोबोब

29

एक बॉस की तरह अंत में एक% चिह्न फेंक दें

:NERDTree %

मेरे पास यह मेरे .vimrc में है, यह वर्तमान बफर की डायर में nddtree को मैप करने के लिए Ctrl+ o:

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


2
तुम्हें पता है मुझे संदेह था। आपके कहने के तरीके में कुछ: डी। लेकिन यह केवल एक चीज है जिसने काम किया जैसे मुझे इसकी आवश्यकता थी, अच्छी तरह से किया गया।
ह्यूगो

ऐसे बॉस का जवाब!
इब्रोडी

1
बहुत मालिक, ऐसे जवाब
mhz

एक ही मुद्दा है जब एक खाली फ़ाइल से शुरू होता है, टॉगल काम नहीं करेगा क्योंकि वर्तमान बफर का कोई डायर नहीं है।
X.Arthur

25

मैंने दोनों मौजूदा उत्तरों को शैक्षिक पाया, और दोनों को सफलतापूर्वक संयोजित किया ताकि व्यवहार अधिक हो जैसे कि एक आईडीई से बहुत से लोग अपेक्षा करेंगे: एक खुली खिड़की / बफर पर क्लिक करें, और उस फ़ाइल को NERDTree में हाइलाइट किया गया है। मैंने इसे अपने ~ / .vimrc में डाला:

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

यह क्या करता है:

  1. autocmd BufEnter - हर बार जब आप एक बफर पर ध्यान केंद्रित करते हैं (NERDTree विंडो सहित)
  2. if &modifiable - जब आप NERDTree विंडो पर क्लिक करते हैं, तो कुछ और न करें (NERDTree विंडो मॉडिफाइबल नहीं है)
  3. wincmd p- NERDTreeFind NERDTree पर केंद्रित कर्सर को छोड़ देता है; यह उस विंडो पर वापस स्विच हो जाता है जिस पर आप मूल रूप से ध्यान केंद्रित करते हैं

ध्यान दें कि यह किसी भी अन्य बफर पर काम नहीं करेगा जो कि परिवर्तनीय नहीं है - लेकिन यह आम तौर पर एक अच्छी बात है; अन्यथा (उदाहरण के लिए) किसी भी समय जो आपको मिला :help, NERDTree उस डायरेक्टरी को ढूंढेगा और फोकस करेगा जहां मदद की फाइलें संग्रहीत हैं - शायद कुछ ऐसा नहीं है जिसे आप करना चाहते हैं।

उस एक-लाइन समाधान ने पहली बार में मेरे लिए बहुत अच्छा काम किया, लेकिन मैंने जल्द ही पाया कि यह 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चेक उस मामले को कवर नहीं करता है ?
जूनोको

2
Function name must start with a capital or "s:": rc:isNTOpen()क्या आप एक प्लगइन का उपयोग कर रहे हैं scopes का विस्तार?
ब्रायन हाक

1
क्षमा करें, लेकिन मुझे नहीं पता, @BrianHaak। मैं वर्तमान में NerdTree का उपयोग नहीं करता हूं, और अपने पुराने को गलत कर दिया .vimrcहै जिसमें मैंने वह कोड लिखा था। मुझे याद नहीं है कि मैंने इसका उपयोग क्यों किया rc:, लेकिन मुझे लगता है कि अन्य कार्यों के साथ नाम के टकराव से बचने के लिए यह एक नाम बदलने वाली बात थी। मैं विशेष रूप से संबंधित किसी भी प्लगइन का उपयोग नहीं कर रहा था, जहाँ तक मुझे याद है। आपको डॉक्स का अध्ययन करना होगा, या बस इसे छोड़ने की कोशिश करें और देखें कि क्या कुछ टूटता है। लेकिन मुझे लगता है कि नर्डड्री या अन्य जगहों में किसी एक के नाम से एक फंक्शन का विरोध हुआ। लगभग 5 वर्षों में किसी और ने नहीं पूछा, इसलिए मुझे लगता है कि यह कुछ सरल है। :)
लैम्बर्ट

4
@ लैम्बर्ट मैंने सभी समस्याओं को हल करने के साथ प्रयोग करने योग्य विन्यास बनाया है: gist.github.com/avesus/1954d9384d86cc1e39cb2b2e27017b7
ब्रायन हाक

1
ठंडा। मैं अपने विभिन्न .rc फ़ाइलों को git-ify के लिए वर्षों से अर्थ रखता हूं। किसी दिन ...
लैंबार्ट

2

मैं कल इस सवाल पर आया था, खुदाई के कुछ घंटों के बाद, मैंने स्क्रोलोलोज के नर्डट्री रेपो को एक आदेश पेश करने के लिए एक पुल अनुरोध को प्रस्तुत किया, जो एनईआरडी केNERDTreeCWD पेड़ की जड़ को वर्तमान कार्य निर्देशिका में बदल देता है (अद्यतन 2012-11-12 पर अपडेट किया गया है) अपस्ट्रीम मास्टर, यह एक अद्यतन संस्करण पर प्रयोग करने योग्य होना चाहिए)। इस परिवर्तन के साथ, इस प्रश्न को केवल निम्नलिखित कोड द्वारा हल किया जा सकता है।

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

@ Shinzui और @ लैम्बार्ट के NERDTreeFindदृष्टिकोण की तुलना करें , यह वही करता है जो सवाल पूछा गया था। उपयोग NERDTreeFindकरने से nddtree की स्क्रॉल स्थिति बदल जाएगी और परिणाम हमेशा समान नहीं होते हैं (यदि CWD NERD ट्री रूट में है, तो यह केवल नोड को इसमें बदलने के बजाय फैलता है)।

@Yaser सुलेमान के जवाब से तुलना करें, इस समाधान में एक NERD ट्री विंडो खोली गई है और इसे आसानी से कोडेबल किया जा सकता है। यदि एक एनईआरडी ट्री विंडो पहले ही खोली जा चुकी है, तो उपयोग NERDTreeToggleकरने के लिए दो बार फायर करना होगा (पहले एक को बंद करें, फिर इसे फिर से खोलें), दुर्भाग्य से, दूसरा खुलने से पूरी cwd प्रोसेसिंग को छोड़ दिया जाएगा।


क्या आपका समाधान NERDTree के लिए हमेशा खुला नहीं है? इसके अलावा मुझे लगता है कि अगर मैं MRU प्लगइन का उपयोग करता हूं और फाइलें खोलने की कोशिश करता हूं, तो मैं इस परिवर्तन का उपयोग करने के बाद NERDtree विंडो में फाइलें खोलता हूं। जैसा कि यह कहता है कि यह संशोधन MRU ( github.com/yegappan/mru/wiki/User-Manual ) के साथ बहुत सारे मुद्दों और संघर्षों का कारण बनेगा , हालाँकि मुझे नहीं पता कि क्यों। हो सकता है कि अन्य लोग यह जांच सकें कि क्या उनके पास समान मुद्दे हैं। मुझे यह पसंद है कि NERDtree टैब हमेशा खुला रहता है ..
अल्फा_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

1

मैं NERDTree का उपयोग करके चेंज करंट डाइरेक्टरी से दोनों सॉल्यूशंस लागू करता हूं : cdNERDTree वर्किंग डाइरेक्टरी को करंट डाइरेक्टरी Cमें सेट करने के लिए और NERDTree रूट नोड को मौजूदा डाइरेक्टरी पर सेट करने के लिए उपयोग करें।


0

मुझे लगता है कि यह प्लगइन वही है जो आप https://github.com/jistr/vim-nerdtree-tabs चाहते हैं


2
सुपर उपयोगकर्ता में आपका स्वागत है! जबकि लिंक अच्छा है, यहाँ संदर्भ के एक बिट को शामिल करना बेहतर होगा , और समझाता है कि प्लगइन क्या करता है, इसका उपयोग कैसे किया जाना चाहिए, इत्यादि!
slhck

वास्तव में जो कुछ पूछा गया था, उसके लिए यह एक अच्छा समाधान हो सकता है ..
अल्फा_989

0

मुझे जवाब मिला कि मथायस ने एक समस्या के साथ एक शानदार जवाब दिया है, यह कुछ मामलों में अच्छी तरह से काम नहीं करता है। नीचे दिए गए परिवर्तन के साथ यह थोड़ा बेहतर काम करता है:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.