Vim : NERDTree를 현재 열린 탭 파일 경로와 동기화하는 방법은 무엇입니까?


60

VIM에서 이전 파일과 다른 경로로 새 탭을 열면 NERDTree는 여전히 이전 파일의 디렉토리 계층과 동일하게 유지됩니다.

현재 루트 디렉토리를 새로 열린 파일 디렉토리로 변경하는 동기화 바로 가기가 있습니까?

답변:



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에 이것을 가지고 있으며, 현재 버퍼의 디렉토리에서 nerdtree를 토글하기 위해 Ctrl+ o를 매핑한다 :

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


2
당신은 내가 회의적이라는 것을 알고 있습니다. 당신이 말한 방식으로 뭔가 : D. 그러나 이것이 내가 필요한 것처럼 효과가 있었던 유일한 방법입니다.
휴고

그런 보스 답변!
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에 초점을 둡니다. 원래 초점을 둔 창으로 돌아갑니다.

이 작동하지 않습니다 어떤 수정할 수없는 다른 버퍼 -하지만 일반적으로 좋은 일; 그렇지 않으면 (예를 들어) :helpvim에 들어갈 때마다 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 2016 년

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
브라이언 HAAK

1
시원한. 나는 다양한 .rc 파일을 git-ify하기 위해 수년 동안 의미를 가졌습니다. 언젠가 ...
Lambart

2

어제 몇 시간 동안 파고 든 후이 질문보았을NERDTreeCWD 때, NERD 트리 루트를 현재 작업 디렉토리로 변경 하는 명령을 소개하는 scrooloose의 nerdtree repo에 Pull Request제출 했습니다 (2012-11-12 업데이트 : PR이 병합되었습니다) 업스트림 마스터는 업데이트 된 버전에서 사용할 수 있어야합니다). 이 변경으로이 질문은 다음 코드로 간단히 해결할 수 있습니다.

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

@shinzui와 @Lambart의 NERDTreeFind접근법 과 비교할 때, 이것은 질문이 정확히 한 일을 수행합니다. 를 사용 NERDTreeFind하면 머저리의 스크롤 위치가 변경되고 결과가 항상 동일하지는 않습니다 (CWD가 NERD 트리 루트에있는 경우 노드를 변경하는 대신 단순히 노드를 확장 함).

@Yaser Sulaiman의 답변과 비교할 때이 솔루션은 NERD 트리 창이 열리고 쉽게 코딩 할 수 있습니다. NERD 트리 창이 이미 열려 있으면 사용 NERDTreeToggle을 두 번 실행해야합니다 (먼저 기존 창을 닫았다가 다시 엽니 다). 불행히도 두 번째 오프닝은 전체 cwd 처리를 건너 뜁니다.


솔루션으로 NERDTree가 항상 열려 있지 않습니까? 또한 MRU 플러그인을 사용하고 파일을 열려고하면이 변경 사항을 사용한 후 NERDtree 창에서 파일이 열립니다. 이 수정으로 인해 MRU ( github.com/yegappan/mru/wiki/User-Manual ) 와 많은 문제와 충돌이 발생 하지만 그 이유를 모르겠습니다. 다른 사람들이 비슷한 문제가 있는지 확인할 수 있습니다. NERDtree 탭이 항상 열려있는 것을 좋아합니다 ..
alpha_989

예, NERDTree가 항상 열려 있습니다. 비애.
메러디스

1

이것은 :NERDTreeToggleNERDTree에서 현재 열린 파일 처럼 작동 하지만 표시됩니다. 파일을 아직 열지 않은 경우 (즉, 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



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.