“ 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、のようgfに入力して、vimに正しいことをしてもらいたいと思っています。


デフォルトでこれを行う方法はないと思いますが、おそらくそれを行うプラグインを作成できます。
EvergreenTree

回答:


6

いいえ、最初の問題は、コマンドとファイル名の間に必要なスペースが ' isfname'オプションの一部ではないことです。これを追加すると、ファイルの境界線がまったく認識されなくなります。(コマンドとファイル名の両方の)視覚的な選択を常に使用するか、gfコマンドオーバーロードでカスタム解析を実装する必要があります。

次に、組み込みでgf+{cmd}構文が認識されないため、独自のカスタムマッピングを実装する方法はありません。これは、(のような機能を使用して確実に可能であるexpand('<cfile>')getline()など)を、おそらくVimscript機能の数行を取ります。

異なる構文(filename:+command)を選択した場合、元のgfコマンドを保持し:autocmd、非常に関連するfile:lineプラグインがに対して行うのと同様に、に分割を実装できます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

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.