Achèvement du nom de fichier / chemin Vim

10

Je sais que je peux compléter les noms de fichiers / chemins à partir du répertoire actuel en utilisant ctrl + x, ctrl + f ( compl-filename). Cela fonctionne très bien en combinaison avec set autochdir, qui modifie les mises à jour du répertoire en cours vers le répertoire du tampon actif.

Cependant, j'ai commencé à utiliser airblade/vim-rooterpour faire du répertoire courant le dossier "project". Maintenant, l'achèvement du nom de fichier commence toujours à partir du dossier du projet.

La question: existe-t-il un moyen de faire en sorte que la complétion du nom de fichier utilise le répertoire du tampon actif au lieu du répertoire actuel? Ou une autre solution?

Également demandé dans stackoverflow

Rafael Barbosa
la source
5
C-xC-f utilise toujours le répertoire de travail du tampon actuel, sans aucune option pour le configurer (il ne prend pas en charge non pathplus). Cela dépend de votre utilisation prévue pour vim-rooter. Selon ce que vous en attendez, nous pourrions utiliser d'autres plugins. En plus: j'utilise youcompleteme, qui complète les chemins du répertoire du tampon courant si vous commencez à taper ./. Voir reddit.com/r/vim/comments/216jdd/…
muru

Réponses:

7

Comme @muru l'a mentionné, il n'y a pas d'options pour configurer le répertoire à partir duquel le chemin et les noms de fichiers doivent être complétés. Il utilise toujours le répertoire de travail de la fenêtre.

J'ai écrit quelques fonctions et mappages pour vous aider. Dans les coulisses, ils changent :lcdtemporairement le répertoire de travail local (à l'aide de ), puis restaurent le répertoire de travail précédent une fois terminé.

l'éléphant

Pour des raisons que je ne connais même pas, j'ai appelé ce micro-plugin Elephant .

Voici le code (copié de ma configuration Vim sur 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>

Comment l'utiliser

L'utilisation de ces mappages se déroule en 3 étapes.

1. Appelez le mappage

En mode Insertion ou en ligne de commande, appelez le mappage à l'aide de <C-R><C-E>.

2. Choisissez un répertoire

Tapez un seul caractère pour choisir le répertoire racine à partir duquel vous souhaitez terminer. Le code ci-dessus fournit deux types de racines:

  • f - Le répertoire dans lequel se trouve le fichier actuel (tampon)
  • p - Le répertoire de base du projet Git auquel appartient le fichier actuel

3. Entrez le chemin ou le nom du fichier

Vous serez invité à entrer le chemin d'accès ou le nom de fichier relatif au répertoire spécifié, l'achèvement étant disponible. Appuyez sur Enterlorsque vous avez terminé.

Quelques notes

  • Cela ne fournit pas la complétion en ligne en mode Insertion comme le <C-X><C-F>fait; au lieu de cela, vous taperez le chemin d'accès ou le nom de fichier sur l'invite de ligne de :commande (où les commandes vont). En appuyant sur Enter, le chemin sera inséré dans le tampon.
  • La même chose est vraie en mode ligne de commande, ce qui peut parfois être déroutant lorsque vous appuyez Enteret oubliez que vous devez toujours appuyer Enterpour émettre la commande que vous venez de taper.
  • D'autres fonctions de répertoire peuvent être enregistrées en les ajoutant à g:elephant_map.
  • Le chemin inséré sera le chemin absolu complet. Le script peut être modifié pour changer ce comportement, mais je n'y suis pas parvenu.
tommcdo
la source
N'a pas tout à fait testé la solution, mais l'a acceptée en raison de son exhaustivité. Au lieu de cela, j'ai utilisé la solution de contournement suggérée : YouCompleteMe au lieu de ctrl + x, ctrl + f.
Rafael Barbosa