Vim 파일 이름 / 경로 완성


11

ctrl + x, ctrl + f ( compl-filename)를 사용하여 현재 디렉토리에서 파일 이름 / 경로를 완성 할 수 있다는 것을 알고 있습니다 . set autochdir과 함께 사용하면 현재 디렉토리가 활성 버퍼의 디렉토리로 업데이트됩니다.

그러나 airblade/vim-rooter현재 디렉토리를 "프로젝트"폴더로 만들기 시작했습니다 . 이제 파일 이름 완성은 항상 프로젝트 폴더에서 시작됩니다.

질문 : 파일 이름 완성이 현재 디렉토리 대신 활성 버퍼의 디렉토리를 사용하도록하는 방법이 있습니까? 아니면 다른 해결 방법?

또한 stackoverflow에서 요청


5
C-xC-f는 항상 현재 버퍼의 작업 디렉토리를 사용하여 구성하는 옵션없이 사용합니다 (지원하지 않습니다 path). vim-rooter의 용도에 따라 다릅니다. 당신이 원하는 것에 따라 다른 플러그인을 사용할 수 있습니다. 따로 : youcompleteme를 사용하는데, 입력을 시작하면 현재 버퍼의 디렉토리에서 경로를 완성합니다 ./. reddit.com/r/vim/comments/216jdd/…
muru

답변:


7

@muru가 언급했듯이 경로 및 파일 이름을 완성 할 디렉토리를 구성하는 옵션이 없습니다. 항상 창의 작업 디렉토리를 사용합니다.

이를 위해 몇 가지 함수와 매핑을 작성했습니다. 이면에서 로컬 작업 디렉토리 ( :lcd)를 일시적으로 변경 한 다음 완료되면 이전 작업 디렉토리를 복원합니다.

코끼리

나조차 모르는 이유로, 나는이 마이크로 플러그인 Elephant 이라고 불렀다 .

코드는 다음과 같습니다 ( GitHub의 Vim 설정에서 복사했습니다 ).

let g:elephant_map = {
    \ 'f': function('elephant#current_file'),
    \ 'p': function('elephant#vcs_project')
\ }

function! elephant#prompt(base)
    let l:Fcn = get(g:elephant_map, a:base, function('elephant#identity'))
    let l:basedir = l:Fcn()
    execute 'lcd' l:basedir
    let l:file = fnamemodify(input(l:basedir.'/', '', 'file'), ':p')
    lcd -
    return fnamemodify(l:file, ':.')
endfunction

function! s:elephant_init()
    let l:base = getchar()
    return elephant#prompt(nr2char(l:base))
endfunction

function! elephant#identity()
    return '.'
endfunction

function! elephant#vcs_project()
    return fnamemodify(finddir('.git', '.;'), ':h')
endfunction

function! elephant#current_file()
    return expand('%:h')
endfunction

inoremap <silent> <expr> <C-R><C-E> <SID>elephant_init()
cnoremap <silent> <C-R><C-E> <C-R>=<SID>elephant_init()<CR>

사용 방법

이러한 매핑 사용은 3 단계로 이루어집니다.

1. 매핑을 호출

삽입 모드 또는 명령 행 모드에서을 사용하여 맵핑을 호출하십시오 <C-R><C-E>.

2. 디렉토리를 선택하십시오

완료 할 루트 디렉토리를 선택하려면 단일 문자를 입력하십시오. 위의 코드는 두 가지 유형의 루트를 제공합니다.

  • f -현재 파일 (버퍼)이있는 디렉토리
  • p -현재 파일이 속한 Git 프로젝트의 기본 디렉토리

3. 경로 또는 파일 이름을 입력하십시오

지정된 디렉토리에 상대적인 경로 또는 파일 이름을 입력하라는 메시지가 표시되며 완료 할 수 있습니다. Enter완료되면 누릅니다 .

일부 노트

  • 삽입 모드에서는 인라인 완성 기능을 제공하지 않습니다 <C-X><C-F>. 대신 명령 행 프롬프트 ( :명령이 있는 위치)에 경로 또는 파일 이름을 입력하게됩니다 . 를 누르면 Enter경로가 버퍼에 삽입됩니다.
  • 명령 행 모드에서도 마찬가지입니다 . 입력 할 때 명령을 실행하기 위해 Enter계속 눌러야한다는 사실을 잊었을 때 혼동 될 수 있습니다 Enter.
  • 에 추가하여 다른 디렉토리 기능을 등록 할 수 있습니다 g:elephant_map.
  • 삽입 된 경로는 완전한 절대 경로입니다. 이 동작을 변경하기 위해 스크립트를 조정할 수는 있지만 나는 그 문제를 해결하지 못했습니다.

솔루션을 테스트하지는 않았지만 완전성으로 인해 솔루션을 수락했습니다. 대신 ctrl + x, ctrl + f 대신 YouCompleteMe 제안 해결 방법을 사용했습니다 .
Rafael Barbosa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.