Uzupełnienie nazwy pliku / ścieżki Vima

11

Wiem, że mogę uzupełnić nazwy plików / ścieżki z bieżącego katalogu za pomocą ctrl + x, ctrl + f ( compl-filename). Działa to świetnie w połączeniu z ustawionym autochdir, który zmienia aktualizuje bieżący katalog do katalogu aktywnego bufora.

Jednak zacząłem używać, airblade/vim-rooteraby bieżący katalog był folderem „projektu”. Teraz uzupełnianie nazw plików zawsze zaczyna się od folderu projektu.

Pytanie: Czy istnieje sposób, aby uzupełnić nazwę pliku, używając katalogu aktywnego bufora zamiast bieżącego katalogu? Lub jakieś inne obejście?

Pytanie także w stackoverflow

Rafael Barbosa
źródło
5
C-xC-f zawsze korzysta z katalogu roboczego bieżącego bufora, bez żadnych opcji jego konfiguracji (nie obsługuje pathrównież). Zależy to od zamierzonego zastosowania vim-rootera. W zależności od tego, czego od niego chcesz, możemy użyć innych wtyczek. Poza tym: używam youcompleteme, który uzupełnia ścieżki z katalogu bieżącego bufora, jeśli zaczniesz pisać ./. Zobacz reddit.com/r/vim/comments/216jdd/...
muru

Odpowiedzi:

7

Jak wspomniano @muru, nie ma opcji konfiguracji katalogu, z którego należy uzupełnić ścieżki i nazwy plików. Zawsze korzysta z katalogu roboczego okna.

Napisałem kilka funkcji i mapowań, aby w tym pomóc. Za kulisami :lcdtymczasowo zmieniają lokalny katalog roboczy (za pomocą ), a po zakończeniu przywracają poprzedni katalog roboczy.

Słoń

Z nieznanych mi powodów, nazwałem ten mikro-plugin Elephant .

Oto kod (skopiowany z mojej konfiguracji Vima na 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>

Jak tego użyć

Korzystanie z tych mapowań odbywa się w 3 krokach.

1. Wywołaj mapowanie

W trybie wstawiania lub w trybie wiersza poleceń uruchom mapowanie za pomocą <C-R><C-E>.

2. Wybierz katalog

Wpisz pojedynczy znak, aby wybrać katalog główny, z którego chcesz uzupełnić. Powyższy kod zapewnia dwa rodzaje korzeni:

  • f - Katalog, w którym znajduje się bieżący plik (bufor)
  • p - Katalog podstawowy projektu Git, do którego należy bieżący plik

3. Wprowadź ścieżkę lub nazwę pliku

Zostaniesz poproszony o podanie ścieżki lub nazwy pliku względem określonego katalogu, z możliwością uzupełnienia. Naciśnij Enterpo zakończeniu.

Kilka notatek

  • Nie zapewnia to wbudowanego uzupełniania w trybie wstawiania, jak to <C-X><C-F>robi; zamiast tego będziesz wpisywać ścieżkę lub nazwę pliku w wierszu polecenia (tam, gdzie :idą polecenia). Po naciśnięciu Enterścieżka zostanie wstawiona do bufora.
  • To samo dotyczy trybu wiersza poleceń, który czasami może być mylący, gdy naciskasz Enteri zapominasz, że wciąż musisz nacisnąć, Enteraby wydać dowolne polecenie, które właśnie wpisałeś.
  • Inne funkcje katalogu można zarejestrować, dodając je do g:elephant_map.
  • Wstawiona ścieżka będzie pełną ścieżką bezwzględną. Skrypt można zmodyfikować, aby zmienić to zachowanie, ale nie miałem o tym pojęcia.
tommcdo
źródło
Nie całkiem przetestowałem rozwiązanie, ale zaakceptowałem je z powodu kompletności. Zamiast tego zastosowałem obejście sugerujące: YouCompleteMe zamiast ctrl + x, ctrl + f.
Rafael Barbosa