Tôi có thể sử dụng hay không, hoặc tương tự) để mở tệp và chuyển sang cụm từ tìm kiếm?


9

Có cách nào để nhận gflệnh của vim (hoặc một cái gì đó tương tự) để nhận ra một +{cmd}đối số cho đường dẫn tệp không?

Người ta có thể bắt đầu vim và đi thẳng đến cụm từ tìm kiếm bằng cách thực hiện:

$ vim +/coding_effort ~/project/file

Tương tự, trong chế độ lệnh bạn có thể làm:

:e +/coding_effort ~/project/file

Tôi thường ghi chú và tham khảo các tệp khác như thế này:

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

Tôi muốn có thể chọn +/coding_effort ~/project/file, nhập một cái gì đó như gfvà vim làm điều đúng.


Tôi không nghĩ có bất kỳ cách nào để làm điều này theo mặc định, nhưng bạn có thể có thể tạo một plugin.
EvergreenTree

Câu trả lời:


6

Không, vấn đề đầu tiên là khoảng trống cần thiết giữa lệnh và tên tệp không phải là một phần của isfname'tùy chọn ' và thêm nó có nghĩa là đường viền tệp không thể được nhận ra. Bạn phải luôn luôn sử dụng lựa chọn trực quan (cả lệnh và tên tệp) hoặc thực hiện phân tích cú pháp tùy chỉnh trong gftình trạng quá tải lệnh.

Thứ hai, tích hợp gfkhông nhận ra +{cmd}cú pháp, vì vậy thực sự không có cách nào để thực hiện ánh xạ tùy chỉnh của riêng bạn. Đây chắc chắn là có thể (sử dụng các hàm thích expand('<cfile>'), getline()vv), nhưng có lẽ phải mất một vài dòng chức năng Vimscript.

Nếu bạn chọn một cú pháp khác ( filename:+command), bạn có thể giữ các gflệnh gốc và thực hiện phân tách trong một :autocmd, tương tự như những gì tệp rất liên quan : plugin dòng dành cho filespec:linenumber).


2

Đây là một chức năng nên sao chép gfhành vi tích hợp và cũng quét các tác phẩm bắt đầu +sau đó được chuyển đến: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>

Các ý kiến ​​sẽ giải thích những gì chức năng làm chi tiết hơn ... Tôi đã viết điều này trên tàu vào buổi sáng, và (rõ ràng) đã không kiểm tra nó một cách rộng rãi ;-)


1

Một tùy chọn sẽ là (giả sử +cmd file/pathđược chọn) để kéo lựa chọn vào một thanh ghi, sau đó chèn thanh ghi đó vào dấu nhắc lệnh. Tôi đã làm điều này với ánh xạ sau:

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


1

Ký hiệu này hoạt động ( 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/

với chức năng và ánh xạ bên dưới.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.