2017-02-27 6 views
1

Ich schrieb ein kleines vim leader mapping, um eine Datei in (GitHub aromed markdown) in ein PDF zu konvertieren.Im vim ex-Modus, was macht @%?

Beide dieser Arbeit, und scheinen funktional äquivalent zu sein:

nnoremap <expr> <leader>pdf ':! pandoc -f markdown_github --latex-engine=xelatex ' . shellescape(@%,1). ' -o ' . shellescape(expand('%:r'), 1) . ".pdf \<cr>" 

nnoremap <expr> <leader>pdf ':! pandoc -f markdown_github --latex-engine=xelatex ' . shellescape(expand('%'),1). ' -o ' . shellescape(expand('%:r'), 1) . ".pdf \<cr>" 

Ich hatte die erste Arbeit (dank Stack-Überlauf;) aber ich habe nicht wirklich verstehen, die @% im ersten shellescape. Also habe ich es durch die expand('%') ersetzt, die ich ein bisschen "bekomme".

Kann jemand den Unterschied erklären, oder sogar wohin man geht, um nachzusehen? Ich habe gelesen :help :@, aber es spricht über Execute the contents of register as an ex command, die nicht scheint zu sein, was hier passiert.

Jede Hilfe/Zeiger wäre großartig!

Antwort

4

@% ist ein Register, das den Namen der Datei enthält, die dem aktuellen Puffer zugeordnet ist. Es kann wie jedes andere Register, zum Beispiel verwendet werden:

i<C-r>% 
"%p 

In Ihrem ersten Beispiel shellescape() einen String als ersten Parameter erwartet und gibt einen String. Es passiert, dass der Typ @% String ist, so dass @% direkt verwendet werden kann.

+0

Danke dafür. Es war der "execute" -Teil, der mich verwirrte. Wenn ich den Namen meiner Datei als ex-Befehl ausführte, hätte ich (glaube ich) kaputte Dinge. Wird das Register tatsächlich "ausgeführt" oder ist das Register "%" ein besonderes, wenn es "ausgeführt" wird, kehrt es sich selbst zurück? –

+0

Die Schreibweise '@' wird für zwei Dinge verwendet: a) führe den Inhalt von '' so aus, als wäre es ein Ex-Befehl (im cmd-line-Modus) oder ein Makro (im normalen Modus) und b) benutze den Inhalt von '' in einem Ausdruck. Aber ich muss zugeben, Vimscript steckt voller Zweideutigkeiten wie dieser. Im Zweifelsfall lesen Sie den entsprechenden Abschnitt des Dokuments. – romainl