Bir dosyayı açmak ve bir arama terimine atlamak için “gf” (veya benzeri) kullanabilir miyim?


9

Vim gfkomutunun (veya benzer bir şeyin) +{cmd}dosya yolları için bir argümanı tanımasını sağlamanın bir yolu var mı?

Vim başlatılabilir ve doğrudan bir arama terimine gidilebilir:

$ vim +/coding_effort ~/project/file

Benzer şekilde, komut modunda şunları yapabilirsiniz:

:e +/coding_effort ~/project/file

Sık sık not alıyorum ve bunun gibi diğer dosyalara başvuruyorum:

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

Ben seçebilmek için isteriz +/coding_effort ~/project/filegibi tip bir şey gf, ve vim doğru olanı yapmak zorunda.


Bunu varsayılan olarak yapmanın herhangi bir yolu olduğunu düşünmüyorum, ancak muhtemelen bunu yapan bir eklenti oluşturabilirsiniz.
EvergreenTree

Yanıtlar:


6

Hayır, ilk sorun, komut ve dosya adı arasındaki gerekli boşluğun ' isfname'seçeneğinin bir parçası olmamasıdır ve eklenmesi dosya kenarlıklarının hiç tanınamadığı anlamına gelir. Her zaman görsel bir seçim (hem komut hem de dosya adı) kullanmanız veya bir gfkomut aşırı yüklemesinde özel ayrıştırma uygulamanız gerekir .

İkincisi, yerleşik sözdizimini gftanımıyor +{cmd}, bu yüzden kendi özel eşlemenizi uygulamanın hiçbir yolu yok. Bu (kullanarak fonksiyonları gibi kesinlikle mümkün expand('<cfile>'), getline()vs.), ama muhtemelen Vimscript fonksiyonun birkaç satır alır.

Farklı bir sözdizimi ( filename:+command) seçerseniz , orijinal gfkomutları koruyabilir ve bölmeyi :autocmd, çok ilgili dosya: satır eklentisinin yaptığı gibi benzer bir şekilde uygulayabilirsiniz filespec:linenumber.


2

Yerleşik gfdavranışı çoğaltması gereken bir işlev ve ayrıca+ daha sonra geçirilen işleri tarar .: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>

Yorumlar, işlevin daha ayrıntılı olarak ne yaptığını açıklamalıdır ... Bunu sabah trende yazdım ve (açıkçası) kapsamlı bir şekilde test etmedim ;-)


1

Bir seçenek ( +cmd file/pathseçili olduğu varsayılarak ) seçimi bir kayıt defterine çekmek, ardından bu kaydı komut istemine eklemek olabilir. Bunu aşağıdaki haritalama ile yaptım:

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


1

Bu gösterim işe yarıyor ( 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/

fonksiyonu ve aşağıdaki haritalama ile.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.