Vim Dateiname / Pfad vervollständigen

10

Ich weiß, dass ich Dateinamen / Pfade aus dem aktuellen Verzeichnis mit Strg + x, Strg + f ( compl-filename) vervollständigen kann . Das funktioniert hervorragend in Kombination mit set autochdir, das das aktuelle Verzeichnis in das Verzeichnis des aktiven Puffers aktualisiert.

Ich habe jedoch damit begonnen airblade/vim-rooter, das aktuelle Verzeichnis zum Ordner "Projekt" zu machen. Jetzt beginnt die Vervollständigung des Dateinamens immer im Projektordner.

Die Frage: Gibt es eine Möglichkeit, die Vervollständigung des Dateinamens so zu gestalten, dass das Verzeichnis des aktiven Puffers anstelle des aktuellen Verzeichnisses verwendet wird? Oder eine andere Problemumgehung?

Wird auch im Stackoverflow abgefragt

Rafael Barbosa
quelle
5
C-xC-f verwendet immer das Arbeitsverzeichnis des aktuellen Puffers, ohne Optionen zum Konfigurieren (es wird auch nicht unterstützt path). Dies hängt davon ab, wie Sie Vim-Rooter verwenden möchten. Je nachdem, was Sie davon wollen, können wir auch andere Plugins verwenden. Nebenbei: Ich verwende youcompleteme, das Pfade aus dem Verzeichnis des aktuellen Puffers vervollständigt, wenn Sie mit der Eingabe beginnen ./. Siehe reddit.com/r/vim/comments/216jdd/…
muru

Antworten:

7

Wie @muru erwähnt, gibt es keine Optionen zum Konfigurieren des Verzeichnisses, aus dem Pfad- und Dateinamen vervollständigt werden sollen. Es wird immer das Arbeitsverzeichnis des Fensters verwendet.

Ich habe ein paar Funktionen und Zuordnungen geschrieben, um dabei zu helfen. Hinter den Kulissen ändern sie :lcdvorübergehend das lokale Arbeitsverzeichnis (using ) und stellen anschließend das vorherige Arbeitsverzeichnis wieder her.

Elefant

Aus mir selbst unbekannten Gründen habe ich dieses Mikro-Plugin Elephant genannt .

Hier ist der Code (kopiert von meiner Vim-Konfiguration auf 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>

Wie man es benutzt

Die Verwendung dieser Zuordnungen erfolgt in 3 Schritten.

1. Rufen Sie das Mapping auf

Rufen Sie im Einfügemodus oder im Befehlszeilenmodus die Zuordnung mit auf <C-R><C-E>.

2. Wählen Sie ein Verzeichnis

Geben Sie ein einzelnes Zeichen ein, um auszuwählen, aus welchem ​​Stammverzeichnis die Vervollständigung erfolgen soll. Der obige Code bietet zwei Arten von Wurzeln:

  • f - Das Verzeichnis, in dem sich die aktuelle Datei (Puffer) befindet
  • p - Das Basisverzeichnis des Git-Projekts, zu dem die aktuelle Datei gehört

3. Geben Sie den Pfad oder Dateinamen ein

Sie werden aufgefordert, den Pfad oder Dateinamen relativ zum angegebenen Verzeichnis einzugeben, wobei der Abschluss verfügbar ist. Drücken Sie, Enterwenn Sie fertig sind.

Einige Notizen

  • Dies bietet keine Inline-Vervollständigung im Einfügemodus wie <C-X><C-F>dies der Fall ist. Stattdessen geben Sie den Pfad oder den Dateinamen in die Eingabeaufforderung ein (wohin die :Befehle gehen). Beim Drücken Enterwird der Pfad in den Puffer eingefügt.
  • Das Gleiche gilt für den Befehlszeilenmodus, der manchmal verwirrend sein kann, wenn Sie drücken Enterund vergessen, dass Sie immer noch drücken müssen Enter, um den Befehl auszugeben, den Sie gerade eingegeben haben.
  • Andere Verzeichnisfunktionen können durch Hinzufügen registriert werden g:elephant_map.
  • Der eingefügte Pfad ist der vollständige, absolute Pfad. Das Skript kann angepasst werden, um dieses Verhalten zu ändern, aber ich bin nicht dazu gekommen.
tommcdo
quelle
Die Lösung wurde nicht ganz getestet, aber wegen der Vollständigkeit akzeptiert. Stattdessen habe ich die vorgeschlagene Problemumgehung verwendet : YouCompleteMe anstelle von Strg + x, Strg + f.
Rafael Barbosa