Kann ich mit "gf" (oder ähnlichem) eine Datei öffnen und zu einem Suchbegriff springen?

9

Gibt es eine Möglichkeit, den gfBefehl von vim (oder etwas Ähnliches) zum Erkennen eines +{cmd}Arguments für Dateipfade zu erhalten?

Sie können vim starten und direkt zu einem Suchbegriff wechseln, indem Sie Folgendes tun:

$ vim +/coding_effort ~/project/file

Ebenso können Sie im Befehlsmodus Folgendes tun:

:e +/coding_effort ~/project/file

Ich mache mir oft Notizen und verweise auf andere Dateien wie diese:

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

Ich würde gerne in der Lage sein +/coding_effort ~/project/file, etwas auszuwählen , zu tippen gfund vim das Richtige tun zu lassen.

Oliver Taylor
quelle
Ich glaube nicht, dass es standardmäßig eine Möglichkeit gibt, dies zu tun, aber Sie könnten wahrscheinlich ein Plugin erstellen, das dies tut.
EvergreenTree

Antworten:

6

Nein, das erste Problem besteht darin, dass der erforderliche Abstand zwischen Befehl und Dateiname nicht Teil der isfname'Option ist. Wenn Sie ihn hinzufügen, werden die Dateiränder überhaupt nicht erkannt. Sie müssten entweder immer eine visuelle Auswahl (sowohl des Befehls als auch des Dateinamens) verwenden oder eine benutzerdefinierte Analyse in einer gfBefehlsüberladung implementieren .

Zweitens gferkennt das integrierte +{cmd}System die Syntax nicht, sodass es wirklich keinen Weg gibt, Ihre eigene benutzerdefinierte Zuordnung zu implementieren. Dies ist sicherlich möglich (mit Funktionen wie expand('<cfile>'), getline()etc.), aber nimmt wahrscheinlich ein paar Zeilen Vimscript Funktion.

Wenn Sie eine andere Syntax ( filename:+command) wählen , können Sie die ursprünglichen gfBefehle beibehalten und die Aufteilung in a implementieren :autocmd, ähnlich wie es das sehr verwandte file: line- Plugin tut filespec:linenumber.

Ingo Karkat
quelle
2

Hier ist eine Funktion , die die eingebauten in replizieren sollte gfVerhalten und auch Scans für Arbeiten , beginnend mit +der dann zu übergeben wird: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>

Die Kommentare sollten genauer erklären, was die Funktion macht ... Ich habe das am Morgen im Zug geschrieben und es (offensichtlich) nicht ausgiebig getestet ;-)

Martin Tournoij
quelle
1

Eine Möglichkeit wäre (vorausgesetzt, das +cmd file/pathist ausgewählt), die Auswahl in ein Register zu ziehen und dieses Register dann in die Eingabeaufforderung einzufügen. Ich habe dies mit der folgenden Zuordnung gemacht:

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

Oliver Taylor
quelle
1

Diese Notation funktioniert ( 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/

mit Funktion und Zuordnung unten.

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
qeatzy
quelle