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 :lcd
vorü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, Enter
wenn 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 Enter
wird der Pfad in den Puffer eingefügt.
- Das Gleiche gilt für den Befehlszeilenmodus, der manchmal verwirrend sein kann, wenn Sie drücken
Enter
und 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.
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/…