เมื่อฉันเปิดแท็บใหม่ที่มีพา ธ ที่แตกต่างจากไฟล์ก่อนหน้าใน VIM, NERDTree จะยังคงเป็นลำดับชั้นไดเรกทอรีเดิมของไฟล์ก่อนหน้า
มีทางลัดการซิงค์เพื่อเปลี่ยนไดเรกทอรีรากปัจจุบันเป็นไดเรกทอรีของไฟล์ที่เปิดใหม่หรือไม่
เมื่อฉันเปิดแท็บใหม่ที่มีพา ธ ที่แตกต่างจากไฟล์ก่อนหน้าใน VIM, NERDTree จะยังคงเป็นลำดับชั้นไดเรกทอรีเดิมของไฟล์ก่อนหน้า
มีทางลัดการซิงค์เพื่อเปลี่ยนไดเรกทอรีรากปัจจุบันเป็นไดเรกทอรีของไฟล์ที่เปิดใหม่หรือไม่
คำตอบ:
ฉันไม่แน่ใจว่ามีวิธีเฉพาะของ NERDTree หรือไม่ แต่คุณสามารถกำหนดค่า Vim ได้ตลอดเวลาเพื่อให้มันตั้งค่าไดเรกทอรีทำงานให้เป็นไดเรกทอรีของไฟล์ปัจจุบัน :
autocmd BufEnter * lcd %:p:h
ตอนนี้สิ่งที่คุณต้องทำหลังจากเปิดไฟล์ในแท็บใหม่นั้นอยู่:NERDTreeToggle
ในแท็บใหม่นั้นเอง
ฉันใช้การแมปต่อไปนี้เพื่อดูบัฟเฟอร์ปัจจุบันใน NERDTree:
map <leader>r :NERDTreeFind<cr>
<leader>
อะไร?
โยนเครื่องหมาย% ที่ส่วนท้ายเหมือนเจ้านาย
:NERDTree %
ฉันมีสิ่งนี้ใน. vimrc ของฉันมันแผนที่Ctrl+ oเพื่อสลับ nerdtree ใน dir ของบัฟเฟอร์ปัจจุบัน:
map <C-o> :NERDTreeToggle %<CR>
ฉันพบทั้งคำตอบที่มีอยู่ในการศึกษาและประสบความสำเร็จรวมทั้งสองเพื่อให้พฤติกรรมเป็นเหมือนคนจำนวนมากคาดหวังจาก IDE: คลิกที่เปิดหน้าต่าง / บัฟเฟอร์และมีไฟล์ที่เน้นใน NERDTree ฉันใส่สิ่งนี้ไว้ใน ~ / .vimrc:
autocmd BufEnter * if &modifiable | NERDTreeFind | wincmd p | endif
สิ่งนี้ทำอะไร:
autocmd BufEnter
- ทำงานทุกครั้งที่คุณมุ่งเน้นไปที่บัฟเฟอร์ (รวมถึงหน้าต่าง NERDTree)if &modifiable
- เมื่อคุณคลิกหน้าต่าง NERDTree ไม่ต้องทำอะไรอีก (หน้าต่าง NERDTree ไม่สามารถแก้ไขได้)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()
isNTFocused()
อะไร? &modifiable
ฝาครอบเช็คไม่ได้เป็นอย่างนั้นเหรอ?
Function name must start with a capital or "s:": rc:isNTOpen()
คุณกำลังใช้ขอบเขตการขยายปลั๊กอินหรือไม่
.vimrc
ซึ่งฉันได้เขียนโค้ดนั้นไปแล้ว ฉันจำไม่ได้ว่าทำไมฉันถึงใช้rc:
แต่ฉันคิดว่ามันเป็นเรื่องการกำหนดชื่อเพื่อหลีกเลี่ยงความขัดแย้งของชื่อกับฟังก์ชั่นอื่น ๆ ฉันไม่ได้ใช้ปลั๊กอินที่เกี่ยวข้องกับสิ่งนั้นโดยเฉพาะเท่าที่ฉันจำได้ คุณจะต้องศึกษาเอกสารหรือลองทิ้งมันไว้และดูว่ามีอะไรผิดพลาดหรือไม่ แต่ฉันคิดว่าหนึ่งในชื่อฟังก์ชันขัดแย้งกับบางอย่างใน NerdTree หรือที่อื่น ไม่มีใครถามมาเกือบ 5 ปีดังนั้นฉันจึงรู้สึกว่ามันเป็นอะไรที่ง่าย :)
ฉันเจอคำถามนี้เมื่อวานนี้หลังจากขุดไม่กี่ชั่วโมงฉันส่ง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 ทั้งหมด
สิ่งนี้จะทำงานเหมือน: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
ฉันใช้วิธีแก้ปัญหาทั้งสองจากเปลี่ยนไดเรกทอรีปัจจุบันโดยใช้ NERDTree : ใช้cd
เพื่อตั้งค่าไดเรกทอรีการทำงานของ NERDTree เป็นไดเรกทอรีปัจจุบันและC
เพื่อตั้งค่าโหนดรูท NERDTree เป็นไดเรกทอรีปัจจุบัน
ฉันคิดว่าปลั๊กอินนี้เป็นสิ่งที่คุณต้องการhttps://github.com/jistr/vim-nerdtree-tabs
ฉันพบคำตอบที่ 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
<Leader>f