Tên tệp Vim / hoàn thành đường dẫn


10

Tôi biết tôi có thể hoàn thành tên tệp / đường dẫn từ thư mục hiện tại bằng cách sử dụng ctrl + x, ctrl + f ( compl-filename). Điều đó hoạt động rất tốt khi kết hợp với bộ autochdir, thay đổi cập nhật thư mục hiện tại vào thư mục của bộ đệm hoạt động.

Tuy nhiên, tôi bắt đầu sử dụng airblade/vim-rooterđể biến thư mục hiện tại thành thư mục "dự án". Bây giờ hoàn thành tên tệp luôn bắt đầu từ thư mục dự án.

Câu hỏi: Có cách nào để hoàn thành tên tệp sử dụng thư mục của bộ đệm hoạt động thay vì thư mục hiện tại không? Hoặc một số cách giải quyết khác?

Cũng được hỏi trong stackoverflow


5
C-xC-f luôn sử dụng thư mục làm việc của bộ đệm hiện tại mà không có bất kỳ tùy chọn nào để định cấu hình nó (nó cũng không hỗ trợ path). Nó phụ thuộc vào mục đích sử dụng của bạn cho vim-rooter là gì. Tùy thuộc vào những gì bạn muốn từ nó, chúng tôi có thể sử dụng các plugin khác. Ngoài ra: Tôi sử dụng youcompleteme, nó hoàn thành các đường dẫn từ thư mục của bộ đệm hiện tại nếu bạn bắt đầu nhập ./. Xem reddit.com/r/vim/comments/216jdd/ từ
muru

Câu trả lời:


7

Như @muru đã đề cập, không có tùy chọn nào để định cấu hình thư mục để hoàn thành tên đường dẫn và tệp. Nó luôn sử dụng thư mục làm việc của cửa sổ.

Tôi đã viết một vài chức năng và ánh xạ để giúp với điều này. Đằng sau hậu trường, họ :lcdtạm thời thay đổi thư mục làm việc cục bộ (sử dụng ), sau đó khôi phục thư mục làm việc trước đó khi hoàn tất.

Con voi

Vì những lý do mà ngay cả tôi cũng không biết, tôi đã gọi chú voi siêu nhỏ này .

Đây là mã (được sao chép từ cấu hình Vim của tôi trên GitHub ):

let g:elephant_map = {
    \ 'f': function('elephant#current_file'),
    \ 'p': function('elephant#vcs_project')
\ }

function! elephant#prompt(base)
    let l:Fcn = get(g:elephant_map, a:base, function('elephant#identity'))
    let l:basedir = l:Fcn()
    execute 'lcd' l:basedir
    let l:file = fnamemodify(input(l:basedir.'/', '', 'file'), ':p')
    lcd -
    return fnamemodify(l:file, ':.')
endfunction

function! s:elephant_init()
    let l:base = getchar()
    return elephant#prompt(nr2char(l:base))
endfunction

function! elephant#identity()
    return '.'
endfunction

function! elephant#vcs_project()
    return fnamemodify(finddir('.git', '.;'), ':h')
endfunction

function! elephant#current_file()
    return expand('%:h')
endfunction

inoremap <silent> <expr> <C-R><C-E> <SID>elephant_init()
cnoremap <silent> <C-R><C-E> <C-R>=<SID>elephant_init()<CR>

Làm thế nào để sử dụng nó

Sử dụng các ánh xạ này xảy ra trong 3 bước.

1. Gọi ánh xạ

Trong chế độ Chèn hoặc chế độ Dòng lệnh, gọi ánh xạ bằng cách sử dụng <C-R><C-E>.

2. Chọn một thư mục

Nhập một ký tự để chọn thư mục gốc mà bạn muốn hoàn thành. Đoạn mã trên cung cấp hai loại rễ:

  • f - Thư mục mà tệp hiện tại (bộ đệm) nằm trong
  • p - Thư mục cơ sở của dự án Git, tệp hiện tại thuộc về

3. Nhập đường dẫn hoặc tên tệp

Bạn sẽ được nhắc nhập đường dẫn hoặc tên tệp liên quan đến thư mục được chỉ định, với sự hoàn thành có sẵn. Nhấn Enterkhi hoàn thành.

Một số lưu ý

  • Điều này không cung cấp hoàn thành nội tuyến trong chế độ Chèn theo cách <C-X><C-F>nào; thay vào đó, bạn sẽ gõ đường dẫn hoặc tên tệp trên dấu nhắc dòng lệnh (nơi :các lệnh đi). Khi nhấn Enter, đường dẫn sẽ được chèn vào bộ đệm.
  • Điều tương tự cũng đúng trong chế độ Dòng lệnh, đôi khi có thể gây nhầm lẫn khi bạn nhấn Entervà quên rằng bạn vẫn phải nhấn Enterđể đưa ra bất kỳ lệnh nào bạn vừa gõ.
  • Các chức năng thư mục khác có thể được đăng ký bằng cách thêm chúng vào g:elephant_map.
  • Đường dẫn được chèn sẽ là đường dẫn đầy đủ, tuyệt đối. Kịch bản có thể được điều chỉnh để thay đổi hành vi đó, nhưng tôi không có nó.

Không hoàn toàn kiểm tra giải pháp, nhưng chấp nhận nó vì tính đầy đủ. Thay vào đó tôi đã sử dụng cách giải quyết đề xuất: YouCompleteMe thay vì ctrl + x, ctrl + f.
Rafael Barbosa
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.