Vim dosya adı / yol tamamlama


11

Ctrl + x, ctrl + f ( compl-filename) kullanarak geçerli dizinden dosya adlarını / yollarını tamamlayabileceğimi biliyorum . Geçerli dizini etkin arabellek dizinine değiştiren set autochdir ile birlikte iyi çalışır.

Ancak, ben kullanmaya başladı airblade/vim-rootergeçerli dizin "proje" klasörü yapmak. Artık dosya adının tamamlanması her zaman proje klasöründen başlar.

Soru: Dosya adı tamamlamasını geçerli dizin yerine etkin arabellek dizinini kullanmanın bir yolu var mı? Veya başka bir geçici çözüm mü?

Stackoverflow'da da sorulmuştur


5
(Bu desteklemediği yapılandırmak için herhangi bir seçenek, her zaman geçerli tamponunun çalışma dizinini kullanır C-xC-f pathya da). Vim-rooter için kullanım amacınıza bağlıdır. Ondan ne istediğinize bağlı olarak, diğer eklentileri kullanabiliriz. Kenara: Yazmaya başlarsanız geçerli arabellek dizininden yolları tamamlayan youcompleteme kullanıyorum ./. Bkz reddit.com/r/vim/comments/216jdd/...
Muru

Yanıtlar:


7

@Muru'nun belirttiği gibi, yol ve dosya adlarının tamamlanacağı dizini yapılandırmak için seçenek yoktur. Her zaman pencerenin çalışma dizinini kullanır.

Bu konuda yardımcı olacak birkaç fonksiyon ve harita yazdım. Perde arkasında, yerel çalışma dizinini (kullanarak :lcd) geçici olarak değiştirir, ardından tamamlandığında önceki çalışma dizinini geri yüklerler.

Fil

Benim bile bilmediğim nedenlerden dolayı, bu mikro eklenti Fil adını verdim .

İşte kod ( GitHub'daki Vim yapılandırmamdan kopyalandı ):

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>

Bu nasıl kullanılır

Bu eşlemelerin kullanılması 3 adımda gerçekleşir.

1. Eşlemeyi çağırın

Ekle modunda veya Komut satırı modunda, kullanarak eşlemeyi başlatın <C-R><C-E>.

2. Bir dizin seçin

Hangi kök dizinin tamamlanmasını istediğinizi seçmek için tek bir karakter yazın. Yukarıdaki kod iki tür kök sağlar:

  • f - Geçerli dosyanın (arabellek) bulunduğu dizin
  • p - Geçerli dosyanın ait olduğu Git projesinin temel dizini

3. Yolu veya dosya adını girin

Tamamlama kullanılabilir durumdayken, belirtilen dizine göre yolu veya dosya adını girmeniz istenir. İşlemi Entertamamladığınızda düğmesine basın .

Bazı notlar

  • Bu, Ekle modunda satır içi tamamlamayı <C-X><C-F>sağlamaz; bunun yerine, Komut satırı istemine yolu veya dosya adını yazacaksınız ( :komutların nereye gittiği). Düğmesine basıldığında Enter, yol arabelleğe eklenir.
  • Aynı şey Komut Satırı modunda da geçerlidir; bu, bazen yazdığınız komutları vermek Enteriçin yine de vurmanız ve unutmanız gerektiğinde kafa karıştırıcı olabilir Enter.
  • Diğer dizin işlevleri bunlara eklenerek kaydedilebilir g:elephant_map.
  • Eklenen yol tam, mutlak yol olacaktır. Senaryo bu davranışı değiştirmek için düzeltilebilir, ama bu konuda bir şey yok.

Çözümü tam olarak test etmedim, ancak tamlık nedeniyle kabul etti. Bunun yerine öneri geçici çözümünü kullandım: ctrl + x, ctrl + f yerine YouCompleteMe .
Rafael Barbosa
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.