“gf”(또는 유사한)를 사용하여 파일을 열고 검색어로 이동할 수 있습니까?


9

파일 경로에 대한 인수 gf를 인식 하기 위해 vim의 명령 (또는 유사한 것) 을 얻는 방법이 +{cmd}있습니까?

다음을 수행하여 vim을 시작하고 검색어로 바로 이동할 수 있습니다.

$ vim +/coding_effort ~/project/file

마찬가지로 명령 모드에서 다음을 수행 할 수 있습니다.

:e +/coding_effort ~/project/file

나는 종종 메모를하고 다음과 같은 다른 파일을 참조합니다.

For more info see +/coding_effort ~/project/file where there's a detailed discussion.

나는를 선택 +/coding_effort ~/project/file하고와 같은 것을 입력하고 gfvim이 옳은 일을하도록하고 싶습니다 .


기본적 으로이 작업을 수행하는 방법이 없다고 생각하지만 플러그인을 만들 수 있습니다.
EvergreenTree

답변:


6

아니요, 첫 번째 문제는 명령과 파일 이름 사이에 필요한 공간이 ' isfname'옵션의 일부가 아니기 때문에 추가하면 파일 테두리를 전혀 인식 할 수 없습니다. 항상 시각적 선택 (명령 및 파일 이름 모두)을 사용하거나 gf명령 오버로드 에서 사용자 정의 구문 분석을 구현해야 합니다.

둘째, 내장 gf+{cmd}구문을 인식하지 못 하므로 사용자 정의 매핑을 구현할 방법이 없습니다. 이것은 (하여 원하는 기능 확실히 가능하다 expand('<cfile>'), getline()등)하지만, 아마도 vim 스크립트 함수 몇 줄 걸린다.

다른 구문 ( filename:+command) 을 선택 하면 원본 gf명령을 유지하고 :autocmd관련 파일 : line plugin이 수행 하는 것과 유사한으로 분할을 구현할 수 있습니다 filespec:linenumber.


2

다음은 내장에 복제해야 함수의 gf행동, 또한 작품과 함께 시작하기위한 검사를 +다음에 전달되는 이는:edit

fun! GotoWithCommand()
        let l:file = expand('<cfile>')

        " Replace ~ with the home directory
        let l:file = substitute(l:file, '^\~', $HOME, '')

        " File doesn't exist; return
        if !filereadable(l:file)
                echohl ErrorMsg
                echomsg "E447: Can't find file \"" . l:file . '" in path'
                echohl None
                return 0
        endif

        " Save cursor postion
        let l:save_cursor = getpos(".")

        " Make sure we go to the previous word (B on the first character of the
        " filename goes to the previous word, B anywhere else goes to the start of
        " the filename)
        call search('\(\s\|^\)', 'b')

        " Try to find argument to be executed; these start with a `+'
        let l:commands = ''
        while 1
                " Go one WORD backwards
                normal! B

                " Not a +; stop the loop
                if getline('.')[col('.') - 1] != '+'
                        break
                endif

                let l:commands .= ' ' . expand('<cWORD>')
        endwhile

        " Restore cursor postion
        call setpos('.', l:save_cursor)

        " Now, open the new file...
        execute ':edit ' . l:commands . ' ' . l:file
endfun

nnoremap <Leader>gf :call GotoWithCommand()<CR>

의견은 기능이 무엇을 더 자세히 설명해야합니다 ... 나는 아침에 기차에 이것을 썼고 (분명히) 광범위하게 테스트하지는 않았다 ;-)


1

+cmd file/path선택 사항을 레지스터에 붙인 다음 명령 프롬프트에 해당 레지스터를 삽입하는 옵션이 있습니다 ( 가 선택된 것으로 가정 ). 나는 다음과 같은 매핑으로 이것을했다 :

vnoremap gsf "0y:e <c-r>0<cr>


1

이 표기법이 작동합니다 ( file name+ trailing :+ / pat /)

/usr/include/stdio.h:/int printf/  -- `file name` + `:` + `/ pat /`
/usr/include/stdio.h:+/int printf/
/usr/include/stdio.h: /int printf/
/usr/include/stdio.h: /#define\s/
/usr/include/stdio.h: /^#define\sSEEK/

아래에 기능과 매핑이 있습니다.

nn gf :<C-u>call Gf_search()<CR>

func! Gf_search() abort
    let word = expand('<cWORD>')
    let idx = stridx(word, ':')
    if idx != -1
        let remline = strpart(getline('.'),col('.'))
        let pat = substitute(remline, '.*[:+ ]/\([^/]*\)/.*', '\1', "")
        if pat != remline
            let pat = substitute(pat, '\\', '\\\\', 'g')
            let pat = substitute(pat, ' ', '\\ ', 'g')
            let filename = expand('<cfile>')
            exec 'e +/'.pat filename
            return
        endif
    endif
    " fallback to builtin gF
    norm! gF
endfunc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.