2016-07-30 5 views
1

Hier ist, was ich schlag, zuerst in Pseudo-Code, dann in bash tun wollen so weit wie ich bekommen habe, dann den Fehler:Bash Substitution von Vim AutoCmd

„Was ich will,“ Pseudo-Code

If a file is saved in the "Cover Letters" directory with a filename ending in "md": 

    run a Bash command like: 

    pandoc [FILENAME] -o [FILENAME].replace(".md",".pdf") -s -S 

Was ich bisher Got

:autocmd BufWritePost ~/Dropbox/Professional/Covers/*.md pandoc % -o ${%/md/pdf} -s -S 

Dieser Code korrekt identifiziert, wenn eine "md" Datei gespeichert wird im Dropbox-Ordner und führt dann einen Befehl mit dem Dateinamen aus. Der Befehl führt jedoch zu folgenden Fehlern:

Was ist falsch an meiner Vertretung? Ich fühle mich wie ich so nahe bin ...

Edit: aktuelle Version:

autocmd BufWritePost ~/Dropbox/Professional/Covers/*.md #!star='~/Dropbox/Professional/Covers/'% && fin=${star/md/pdf} && p andoc star -o fin -s -S 
+0

Ich habe eine ähnliche Frage [\ [here \]] (http://stackoverflow.com/a/38671667/1620779) beantwortet. Sehen Sie sich den Substitutionsteil in der Funktion an, der genau das ist, was Sie brauchen. – sjsam

+0

Danke, funktioniert das Ersetzen nur auf Variablen statt Strings? Ich bin mir nicht sicher, wie ich Vim dazu bringen kann, ein mehrzeiliges Bash-Skript (statt eines Einzeilers) auszuführen. –

+0

Was ist los mit $ {test.md/md/pdf}? –

Antwort

0

Dies ist, was Sie suchen:

#!/bin/bash 
function pandocfn() 
{ 
pandoc "${1}" -o "${1/%\.md/.pdf}" 
} 
export -f pandocfn 
find ~/Dropbox/Professional/Covers -type f -iname "*.md" -exec \ 
    bash -c 'pandocfn "$1"' _ {} \; 

Speichern Sie das Skript als Skript sagen script.sh innen ~/Dropbox/Professional/Covers, tun chmod +x script.sh und von innen vim tun

: ! ./script.sh 

Wenn Sie das Skript in irgendeiner anderen Stelle als ~/Dropbox/Professional/Covers speichern, dann tun

: ! full/path/to/script.sh 

Bitte beachten Sie Shell-Parameter [ expansion ].

+0

Das ist eine echte Frage, aber wo speichere ich diese .sh-Datei durch vim aufrufbar sein? Ich habe versucht, mein eigenes .sh-Skript zu schreiben und vim versuchen zu lassen, es auszuführen, aber ich konnte nicht herausfinden, wo man es speichert. –

+0

@Iroh: Bitte beachten Sie das Update, wie Sie das Skript innerhalb von vim ausführen können, was Ihnen viel Zeit sparen und die Antwort akzeptieren kann, wenn es funktioniert :) – sjsam

1

bekam schließlich eine Version, die funktioniert:

autocmd BufWritePost ~/Dropbox/Professional/Covers/*.md !star='%' && fin=${star/md/pdf} && pandoc $star -o $fin -s -S 

Sehr einfache bash Fehler aussieht. Danke sjsam für deine Hilfe!

+0

'fin = $ {star/md/pdf}' => 'fin = $ {star /%. md/.pdf}' weil du nach einer Erweiterung 'md' suchst und nicht nach etwas wie' datei.ext' und 'pandoc $ star -o $ fin' =>' pandoc "$ sterne" -o "$ fin" '(Hier schadet es nicht, die Variablen doppelt zu zitieren, was Ihnen auch dabei hilft, nicht-standardisierte Dateinamen unterzubringen) – sjsam