আমি কি একটি ফাইল খুলতে এবং অনুসন্ধান শব্দটিতে ঝাঁপিয়ে পড়তে "জিএফ" (বা অনুরূপ) ব্যবহার করতে পারি?


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()ইত্যাদি ইত্যাদি ব্যবহার করে ) তবে ভিমস্ক্রিপ্ট ফাংশনের কয়েকটি লাইন লাগে takes

আপনি যদি আলাদা সিনট্যাক্স ( 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.