เป็นกลุ่ม: วิธีซิงโครไนซ์ NERDTree กับเส้นทางของไฟล์แท็บที่เปิดอยู่ในปัจจุบันได้อย่างไร


60

เมื่อฉันเปิดแท็บใหม่ที่มีพา ธ ที่แตกต่างจากไฟล์ก่อนหน้าใน VIM, NERDTree จะยังคงเป็นลำดับชั้นไดเรกทอรีเดิมของไฟล์ก่อนหน้า

มีทางลัดการซิงค์เพื่อเปลี่ยนไดเรกทอรีรากปัจจุบันเป็นไดเรกทอรีของไฟล์ที่เปิดใหม่หรือไม่

คำตอบ:


15

ฉันไม่แน่ใจว่ามีวิธีเฉพาะของ NERDTree หรือไม่ แต่คุณสามารถกำหนดค่า Vim ได้ตลอดเวลาเพื่อให้มันตั้งค่าไดเรกทอรีทำงานให้เป็นไดเรกทอรีของไฟล์ปัจจุบัน :

autocmd BufEnter * lcd %:p:h

ตอนนี้สิ่งที่คุณต้องทำหลังจากเปิดไฟล์ในแท็บใหม่นั้นอยู่:NERDTreeToggleในแท็บใหม่นั้นเอง


116

ฉันใช้การแมปต่อไปนี้เพื่อดูบัฟเฟอร์ปัจจุบันใน NERDTree:

 map <leader>r :NERDTreeFind<cr>

3
ฉันพบว่ามันมีประโยชน์มากและฉันไปที่. vimrc ของฉัน ฉันต้องการใช้การผูกมัดแบบอื่นเพื่อให้ฉันจดจำได้ง่ายขึ้น และฉันพบว่ามีความผูกพันกับเรื่องนี้กับ NERDTree <Leader>f
benzen

1
น่ากลัว! ตัวอย่างสิ่งที่ฉันกำลังมองหา
mawaldne

คุณสามารถทำอย่างละเอียดเกี่ยวกับเรื่องนี้?
jterm

หากคุณใช้ vimrc อันน่าทึ่งนี้ (ไม่ใช่ของฉัน) มันจะถูกแมปกับ, nf: github.com/amix/vimrc
alpha_989

กุญแจคือ<leader>อะไร?
Stillanoob

29

โยนเครื่องหมาย% ที่ส่วนท้ายเหมือนเจ้านาย

:NERDTree %

ฉันมีสิ่งนี้ใน. vimrc ของฉันมันแผนที่Ctrl+ oเพื่อสลับ nerdtree ใน dir ของบัฟเฟอร์ปัจจุบัน:

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


2
คุณรู้ว่าฉันไม่เชื่อ มีบางอย่างในแบบที่คุณพูด: D. แต่นี่เป็นสิ่งเดียวที่ทำงานเหมือนที่ฉันต้องการมันทำได้ดีมาก
Hugo

ช่างเป็นคำตอบ!
ecbrodie

1
เจ้านายมากคำตอบดังกล่าว
mhz

ปัญหาเดียวคือเมื่อเริ่มต้นจากไฟล์เปล่าการสลับจะไม่ทำงานเนื่องจากไม่มีบัฟเฟอร์ปัจจุบัน
X.Arthur

25

ฉันพบทั้งคำตอบที่มีอยู่ในการศึกษาและประสบความสำเร็จรวมทั้งสองเพื่อให้พฤติกรรมเป็นเหมือนคนจำนวนมากคาดหวังจาก 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 สิ่งนี้จะสลับกลับไปที่หน้าต่างที่คุณมุ่งเน้นไป

โปรดทราบว่านี้จะไม่ทำงานในใด ๆบัฟเฟอร์อื่น ๆ ที่ไม่สามารถแก้ไขได้ - แต่ที่โดยทั่วไปเป็นสิ่งที่ดี มิฉะนั้น (ตัวอย่าง) ทุกครั้งที่คุณได้รับ: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ฝาครอบเช็คไม่ได้เป็นอย่างนั้นเหรอ?
jrdioko

2
Function name must start with a capital or "s:": rc:isNTOpen()คุณกำลังใช้ขอบเขตการขยายปลั๊กอินหรือไม่
Brian Haak

1
ขออภัยฉันไม่รู้ @BrianHaak ฉันไม่ได้ใช้ NerdTree ในปัจจุบันและวางรหัสเก่าของฉัน.vimrcซึ่งฉันได้เขียนโค้ดนั้นไปแล้ว ฉันจำไม่ได้ว่าทำไมฉันถึงใช้rc:แต่ฉันคิดว่ามันเป็นเรื่องการกำหนดชื่อเพื่อหลีกเลี่ยงความขัดแย้งของชื่อกับฟังก์ชั่นอื่น ๆ ฉันไม่ได้ใช้ปลั๊กอินที่เกี่ยวข้องกับสิ่งนั้นโดยเฉพาะเท่าที่ฉันจำได้ คุณจะต้องศึกษาเอกสารหรือลองทิ้งมันไว้และดูว่ามีอะไรผิดพลาดหรือไม่ แต่ฉันคิดว่าหนึ่งในชื่อฟังก์ชันขัดแย้งกับบางอย่างใน NerdTree หรือที่อื่น ไม่มีใครถามมาเกือบ 5 ปีดังนั้นฉันจึงรู้สึกว่ามันเป็นอะไรที่ง่าย :)
Lambart

4
@Lambart ฉันได้สร้างการตั้งค่าที่สามารถใช้งานได้กับปัญหาทั้งหมดที่แก้ไขได้: gist.github.com/avesus/1954d9384d86cc1e39cb2b2eff7017b7
Brian Haak

1
เย็น. ฉันมีความหมายเป็นเวลาหลายปีในการคอมไพล์ไฟล์ของฉัน. rc หลายไฟล์ บางวัน ...
Lambart

2

ฉันเจอคำถามนี้เมื่อวานนี้หลังจากขุดไม่กี่ชั่วโมงฉันส่งPull Requestเพื่อให้nerdtree repo ของ scrooloose repoแนะนำNERDTreeCWDคำสั่งที่เปลี่ยน NERD tree tree เป็นไดเรกทอรีทำงานปัจจุบัน (Update on 2012-11-12: PR ถูกผสานเข้าด้วยกัน ต้นแบบอัปสตรีมควรใช้งานได้ในเวอร์ชันที่อัปเดต) ด้วยการเปลี่ยนแปลงนี้คำถามนี้สามารถแก้ไขได้ด้วยรหัสต่อไปนี้

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

เปรียบเทียบกับแนวทางของ @ shinzui และ @ Lambart NERDTreeFindสิ่งนี้เป็นสิ่งที่คำถามถาม การใช้NERDTreeFindจะเปลี่ยนตำแหน่งการเลื่อนของ nerdtree และผลลัพธ์จะไม่เหมือนเดิมเสมอไป (หาก CWD อยู่ในรากต้นไม้ NERD มันเพียงแค่ขยายโหนดแทนการเปลี่ยนเป็น)

เปรียบเทียบกับคำตอบของ @Yaser Sulaiman โซลูชันนี้ยังเปิดหน้าต่างต้นไม้ NERD และสามารถเข้ารหัสได้ง่าย หากหน้าต่างต้นไม้ NERD เปิดขึ้นแล้วการใช้NERDTreeToggleจะต้องเริ่มต้นสองครั้ง (ปิดหน้าต่างที่มีอยู่ก่อนจากนั้นเปิดอีกครั้ง) แต่น่าเสียดายที่การเปิดใช้ครั้งที่สองจะข้ามการประมวลผล cwd ทั้งหมด


โซลูชันของคุณไม่นำไปสู่ ​​NERDTree ที่เปิดอยู่เสมอหรือไม่ นอกจากนี้ฉันยังพบว่าถ้าฉันใช้ปลั๊กอิน MRU และพยายามเปิดไฟล์มันจะเปิดไฟล์ในหน้าต่าง NERDtree หลังจากฉันใช้การเปลี่ยนแปลงนี้ การเปลี่ยนแปลงนี้จะทำให้เกิดปัญหาและข้อขัดแย้งมากมายกับ MRU ( github.com/yegappan/mru/wiki/User-Manual ) แต่ฉันไม่รู้ว่าทำไม บางทีคนอื่นสามารถตรวจสอบว่าพวกเขามีปัญหาที่คล้ายกัน ฉันชอบที่แท็บ NERDtree เปิดอยู่เสมอ ..
alpha_989

ใช่ส่งผลให้ NERDTree เปิดตลอดเวลา ความโศกเศร้า
เมเรดิ ธ

1

สิ่งนี้จะทำงานเหมือน:NERDTreeToggleแต่จะแสดงไฟล์ที่เปิดในปัจจุบันใน NERDTree หากคุณยังไม่ได้เปิดแฟ้มเลย (เช่นคุณเพิ่งป้อนvimใน commandline ของคุณ) /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 : ใช้cdเพื่อตั้งค่าไดเรกทอรีการทำงานของ NERDTree เป็นไดเรกทอรีปัจจุบันและCเพื่อตั้งค่าโหนดรูท NERDTree เป็นไดเรกทอรีปัจจุบัน


0

ฉันคิดว่าปลั๊กอินนี้เป็นสิ่งที่คุณต้องการhttps://github.com/jistr/vim-nerdtree-tabs


2
ยินดีต้อนรับสู่ Super User! ในขณะที่มีการเชื่อมโยงที่ดีมันจะดีกว่าที่จะรวมบริบทเล็กน้อยที่นี่และอธิบายว่าปลั๊กอินทำอะไรได้อย่างไรควรใช้อย่างไร ฯลฯ ขอบคุณ!
slhck

อันที่จริงนี่อาจเป็นทางออกที่ดีสำหรับสิ่งที่ถูกถาม ..
alpha_989

0

ฉันพบคำตอบที่ Matthias โพสต์ว่าเป็นคำตอบที่ยอดเยี่ยมสำหรับปัญหาเดียวมันไม่สามารถทำงานได้ดีในบางกรณี ใช้งานได้ดีขึ้นเล็กน้อยเมื่อมีการเปลี่ยนแปลงด้านล่าง:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.