Vim nome file / percorso completato


10

So di poter completare i nomi di file / percorsi dalla directory corrente usando ctrl + x, ctrl + f ( compl-filename). Funziona benissimo in combinazione con set autochdir, che cambia aggiorna la directory corrente alla directory del buffer attivo.

Tuttavia, ho iniziato a utilizzare airblade/vim-rooterper rendere la directory corrente la cartella "progetto". Ora il completamento del nome file inizia sempre dalla cartella del progetto.

La domanda: c'è un modo per fare in modo che il completamento del nome file usi la directory del buffer attivo invece della directory corrente? O qualche altra soluzione?

Anche chiesto in StackOverflow


5
C-xC-f utilizza sempre la directory di lavoro del buffer corrente, senza alcuna opzione per configurarla (non supporta pathneanche). Dipende dall'uso previsto per vim-rooter. A seconda di cosa vuoi da esso, potremmo usare altri plugin. A parte: uso youcompleteme, che completa i percorsi dalla directory del buffer corrente se si inizia a digitare ./. Vedi reddit.com/r/vim/comments/216jdd/…
muru l'

Risposte:


7

Come menzionato @muru, non ci sono opzioni per configurare la directory da cui completare il percorso e i nomi dei file. Utilizza sempre la directory di lavoro della finestra.

Ho scritto un paio di funzioni e mappature per aiutare con questo. Dietro le quinte, cambiano :lcdtemporaneamente la directory di lavoro locale (usando ), quindi ripristinano la directory di lavoro precedente.

Elefante

Per ragioni sconosciute anche a me, ho chiamato questo micro-plug-in Elephant .

Ecco il codice (copiato dalla mia configurazione di Vim su 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>

Come usarlo

L'uso di questi mapping avviene in 3 passaggi.

1. Richiamare la mappatura

Nella modalità Inserisci o nella riga di comando, invocare la mappatura usando <C-R><C-E>.

2. Scegli una directory

Digitare un singolo carattere per scegliere da quale directory root si desidera completare. Il codice sopra fornisce due tipi di root:

  • f - La directory in cui risiede il file corrente (buffer)
  • p - La directory di base del progetto Git a cui appartiene il file corrente

3. Immettere il percorso o il nome del file

Ti verrà richiesto di inserire il percorso o il nome del file relativo alla directory specificata, con completamento disponibile. Premere Enteral termine.

Alcune note

  • Questo non fornisce il completamento in linea in modalità Inserisci come <C-X><C-F>fa; invece, dovrai digitare il percorso o il nome del file sul prompt della riga di comando (dove :vanno i comandi). Dopo aver premuto Enter, il percorso verrà inserito nel buffer.
  • Lo stesso vale nella modalità riga di comando, che a volte può essere fonte di confusione quando si preme Entere si dimentica che è ancora necessario premere Enterper emettere qualsiasi comando che stavi solo digitando.
  • Altre funzioni di directory possono essere registrate aggiungendole in g:elephant_map.
  • Il percorso inserito sarà il percorso completo e assoluto. La sceneggiatura può essere modificata per cambiare quel comportamento, ma non ci sono riuscito.

Non ha ancora testato la soluzione, ma l'ha accettata per completezza. Invece ho usato la soluzione alternativa suggerita: YouCompleteMe invece di ctrl + x, ctrl + f.
Rafael Barbosa,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.