Câu trả lời:
Tôi không chắc chắn nếu có một cách cụ thể của NERDTree để làm điều đó, nhưng bạn luôn có thể định cấu hình Vim để nó đặt thư mục làm việc vào thư mục của tệp hiện tại :
autocmd BufEnter * lcd %:p:h
Bây giờ tất cả những gì bạn phải làm sau khi mở tệp trong tab mới là :NERDTreeToggle
trong chính tab mới.
Tôi sử dụng ánh xạ sau để xem bộ đệm hiện tại trong NERDTree:
map <leader>r :NERDTreeFind<cr>
<leader>
gì?
ném một dấu% vào cuối như một ông chủ
:NERDTree %
tôi có cái này trong .vimrc của tôi, nó ánh xạ Ctrl+ ođể chuyển đổi nerdtree trong thư mục của bộ đệm hiện tại:
map <C-o> :NERDTreeToggle %<CR>
Tôi đã tìm thấy cả hai câu trả lời hiện có mang tính giáo dục và kết hợp thành công cả hai để hành vi giống như nhiều người mong đợi từ IDE: Nhấp vào cửa sổ / bộ đệm mở và tệp đó được tô sáng trong NERDTree. Tôi đặt cái này trong ~ / .vimrc:
autocmd BufEnter * if &modifiable | NERDTreeFind | wincmd p | endif
Cái này làm gì
autocmd BufEnter
- chạy mỗi khi bạn tập trung vào bộ đệm (bao gồm cửa sổ NERDTree)if &modifiable
- khi bạn nhấp vào cửa sổ NERDTree, không làm gì khác (cửa sổ NERDTree không thể sửa đổi)wincmd p
- NERDTreeFind để con trỏ tập trung vào NERDTree; điều này chuyển trở lại cửa sổ ban đầu bạn tập trung vàoLưu ý rằng điều này sẽ không hoạt động trên bất kỳ bộ đệm nào khác không thể sửa đổi - nhưng nói chung đó là một điều tốt; mặt khác (ví dụ) bất cứ khi nào bạn có :help
trong vim, NERDTree sẽ tìm và tập trung vào thư mục nơi các tệp trợ giúp được lưu trữ - có thể không phải là thứ bạn muốn nó làm.
Giải pháp một dòng đó ban đầu rất hữu ích với tôi, nhưng tôi sớm nhận ra rằng nó khiến NERDTree kích hoạt bất cứ khi nào tôi mở tệp - và kết quả là, nó ngăn NERDTree không bị đóng! Nếu bạn không muốn sử dụng NERDTree toàn thời gian, thay vào đó hãy đặt cái này vào .vimrc của bạn:
" 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()
gì? Không &modifiable
kiểm tra bao gồm trường hợp đó?
Function name must start with a capital or "s:": rc:isNTOpen()
Bạn đang sử dụng một phạm vi mở rộng plugin?
.vimrc
mà tôi đã viết mã đó. Tôi không nhớ lý do tại sao tôi sử dụng rc:
, nhưng tôi nghĩ đó là một cách đặt tên để tránh xung đột tên với các chức năng khác. Tôi đã không sử dụng bất kỳ plugin nào liên quan cụ thể đến điều đó, theo như tôi nhớ. Bạn sẽ phải nghiên cứu các tài liệu, hoặc chỉ cần thử bỏ nó ra và xem nếu có bất cứ điều gì phá vỡ. Nhưng tôi nghĩ một trong những tên hàm đã xung đột với thứ gì đó trong NerdTree hoặc ở nơi khác. Không ai khác đã hỏi trong gần 5 năm, vì vậy tôi có cảm giác nó thật đơn giản. :)
Tôi đã gặp câu hỏi này ngày hôm qua, sau vài giờ đào bới, tôi đã gửi Yêu cầu kéo để repro nerdtree repro giới thiệu một NERDTreeCWD
lệnh thay đổi gốc cây NERD sang thư mục làm việc hiện tại (Cập nhật ngày 2012-11-12: PR đã được sáp nhập vào chủ ngược dòng, nó có thể sử dụng được trên một phiên bản cập nhật). Với thay đổi này, câu hỏi này có thể được giải quyết đơn giản bằng đoạn mã sau.
autocmd BufEnter * silent! if bufname('%') !~# 'NERD_tree_' | cd %:p:h | NERDTreeCWD | wincmd p | endif
So sánh với NERDTreeFind
cách tiếp cận của @ shinzui và @ Lambart , điều này thực hiện chính xác những gì câu hỏi được hỏi. Việc sử dụng NERDTreeFind
sẽ thay đổi vị trí cuộn của nerdtree và kết quả không phải lúc nào cũng giống nhau (Nếu CWD nằm trong gốc cây NERD, nó chỉ đơn giản là mở rộng nút thay vì thay đổi vào nó).
So sánh với câu trả lời của @Yaser Sulaiman, giải pháp này luôn có cửa sổ cây NERD được mở và có thể dễ dàng mã hóa. Nếu cửa sổ cây NERD đã được mở, việc sử dụng NERDTreeToggle
sẽ cần phải được kích hoạt hai lần (lần đầu tiên đóng cửa sổ hiện có, sau đó mở lại), thật không may, lần mở thứ hai sẽ bỏ qua toàn bộ quá trình xử lý cwd.
Điều này hoạt động như thế :NERDTreeToggle
nhưng sẽ hiển thị tệp hiện đang mở trong NERDTree. Nếu bạn chưa mở tệp (nghĩa là bạn vừa nhập vim
dòng lệnh của mình), NERDTree sẽ hiển thị /home
.
Đặt cái này trong .vimrc của bạn:
" 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
Tôi áp dụng cả hai giải pháp từ Thay đổi thư mục hiện tại bằng NERDTree : use cd
để đặt thư mục làm việc NERDTree vào thư mục hiện tại và C
để đặt nút gốc NERDTree vào thư mục hiện tại
Tôi nghĩ plugin này là những gì bạn muốn https://github.com/jistr/vim-nerdtree-tabs
Tôi tìm thấy câu trả lời mà Matthias đăng là một câu trả lời tuyệt vời với một vấn đề, nó không hoạt động tốt trong một vài trường hợp cạnh. Nó hoạt động tốt hơn một chút với thay đổi dưới đây:
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