Vim: Làm cách nào để đồng bộ hóa NERDTree với đường dẫn tệp tab đã mở hiện tại?


60

Khi tôi mở một tab mới với đường dẫn khác với tệp trước trong VIM, NERDTree sẽ vẫn giữ nguyên cấu trúc phân cấp thư mục của tệp trước đó.

Có một lối tắt đồng bộ để thay đổi thư mục gốc hiện tại sang thư mục của tệp mới mở không?

Câu trả lời:



116

Tôi sử dụng ánh xạ sau để xem bộ đệm hiện tại trong NERDTree:

 map <leader>r :NERDTreeFind<cr>

3
Tôi thấy điều này rất hữu ích, và tôi đã đi đến .vimrc của tôi. Tôi muốn sử dụng một số ràng buộc khác để giúp tôi dễ nhớ hơn. Và tôi phát hiện ra rằng đã có một ràng buộc cho điều này với NERDTree <Leader>f
benzen

1
Tuyệt vời! Ví dụ những gì tôi đang tìm kiếm.
mawaldne

bạn có thể xây dựng trên này?
jterm

Nếu bạn đang sử dụng vimrc tuyệt vời này (không phải của tôi), nó được ánh xạ tới, nf: github.com/amix/vimrc
alpha_989

Chìa khóa là <leader>gì?
stillanoob

29

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>


2
Bạn biết tôi đã hoài nghi. Một cái gì đó theo cách bạn nói: D. Nhưng đây là điều duy nhất làm việc như tôi cần, được thực hiện tốt.
Hugo

Như một ông chủ trả lời!
ecbrodie

1
nhiều ông chủ, câu trả lời như vậy
mhz

Vấn đề duy nhất là khi bắt đầu từ một tệp trống, việc chuyển đổi sẽ không hoạt động vì không có thư mục của bộ đệm hiện tại.
X.Arthur

25

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ì

  1. autocmd BufEnter - chạy mỗi khi bạn tập trung vào bộ đệm (bao gồm cửa sổ NERDTree)
  2. 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)
  3. 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ào

Lư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ó :helptrong 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()

1
Mục đích của là isNTFocused()gì? Không &modifiablekiểm tra bao gồm trường hợp đó?
jrdioko

2
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?
Brian Haak

1
Xin lỗi nhưng tôi không biết, @BrianHaak. Hiện tại tôi không sử dụng NerdTree và đã đặt nhầm chỗ cũ .vimrcmà 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. :)
Lambart

4
@Lambart Tôi đã tạo một cấu hình có thể sử dụng được với tất cả các vấn đề đã được giải quyết: gist.github.com/avesus/1954d9384d86cc1e39cb2b2eff7017b7
Brian Haak

1
Mát mẻ. Tôi đã có ý nghĩa trong nhiều năm để git-ify các tệp .rc khác nhau của tôi. Một ngày nào đó ...
Lambart

2

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 NERDTreeCWDlệ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 NERDTreeFindcá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 NERDTreeFindsẽ 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 NERDTreeTogglesẽ 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.


Không phải giải pháp của bạn dẫn đến NERDTree luôn luôn mở? Ngoài ra tôi thấy rằng nếu tôi sử dụng plugin MRU và cố gắng mở tệp, nó sẽ mở tệp trong cửa sổ NERDtree sau khi tôi sử dụng thay đổi này. Vì việc sửa đổi này sẽ gây ra nhiều vấn đề và xung đột với MRU ( github.com/yegappan/mru/wiki/User-Manual ), tuy nhiên tôi không biết tại sao. Có lẽ những người khác có thể kiểm tra nếu họ có vấn đề tương tự. Tôi thích điều đó, tab NERDtree luôn mở ..
alpha_989

Vâng, kết quả này trong NERDTree luôn được mở. Sự sầu nảo.
Meredith

1

Điều này hoạt động như thế :NERDTreeTogglenhư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 vimdò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


0

Tôi nghĩ plugin này là những gì bạn muốn https://github.com/jistr/vim-nerdtree-tabs


2
Chào mừng bạn đến với Siêu người dùng! Trong khi có liên kết là tốt, tốt hơn là nên bao gồm một chút bối cảnh ở đây và giải thích các plugin làm gì, nên sử dụng nó như thế nào, v.v ... Cảm ơn!
slhck

Trên thực tế đây có thể là một giải pháp tốt cho những gì được hỏi ..
alpha_989

0

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.