क्या मैं फ़ाइल खोलने और खोज शब्द पर जाने के लिए "gf" (या समान) का उपयोग कर सकता हूं?


9

फ़ाइल-रास्तों के लिए gfएक +{cmd}तर्क को पहचानने के लिए विम (या कुछ इसी तरह) पाने का कोई तरीका है ?

कोई भी शुरुआत कर सकता है और सीधे खोज शब्द पर जा सकता है:

$ 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, कुछ टाइप करें , और सही काम करें।


मुझे नहीं लगता कि डिफ़ॉल्ट रूप से ऐसा करने का कोई तरीका है, लेकिन आप शायद एक प्लगइन बना सकते हैं जो करता है।
एवरग्रीनट्री

जवाबों:


6

नहीं, पहली समस्या यह है कि कमांड और फ़ाइल नाम के बीच आवश्यक स्थान ' isfname'विकल्प ' का हिस्सा नहीं है, और इसे जोड़ने का मतलब है कि फ़ाइल सीमाओं को बिल्कुल भी मान्यता नहीं दी जा सकती है। आपको या तो हमेशा एक दृश्य चयन (कमांड और फ़ाइल नाम दोनों) का उपयोग करना होगा, या gfकमांड अधिभार में कस्टम पार्सिंग को लागू करना होगा ।

दूसरे, अंतर्निर्मित सिंटैक्स gfको नहीं पहचानता है +{cmd}, इसलिए वास्तव में आपके स्वयं के कस्टम मैपिंग को लागू करने का कोई तरीका नहीं है। यह निश्चित रूप से संभव है (कार्यों का उपयोग कर की तरह expand('<cfile>'), getline()आदि), लेकिन शायद Vimscript समारोह की कुछ लाइनें लग जाते हैं।

यदि आप एक अलग वाक्यविन्यास ( filename:+command) चुनते हैं , तो आप मूल gfआदेशों को रख सकते हैं और बंटवारे को लागू कर सकते हैं :autocmd, जो बहुत संबंधित फ़ाइल के समान है : लाइन प्लगइन के लिए करता है 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.