Sådan bruger du Windows-miljøvariabler i Vim-script?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et Vim script, der kalder et eksternt shell script og læser output til den aktuelle buffer. Det fungerer fint i Unix-systemer. Jeg forsøger at lave script OS-agnostic, så jeg vil også have det til Windows-brugere. Her er den relevante linje fra scriptet:


:exe ":0r !$HOME/bin/shell\_script"


Ifølge Vim's doks, skal $HOME også oversætte bøde til Windows-brugere. Brug gvim på Win XP i kommandomodus


:echo $HOME


producerer faktisk 'C: \ Documents and Settings \ my\_user'.


Men min Vim script (justeret for backslashes) fejler på Windows-maskinen med en meddelelse i vinduet DOS cmd.exe



  $ HOME \ bin \ shell\_script 'ikke fundet.



Med andre ord synes Vim ikke at udvide værdien af ​​$HOME før den sendes til cmd.exe.


Jeg kan ikke bruge \%APPDATA\%, heller ikke fordi Vim fortolker \% som den aktuelle fil og før/tilføjer filnavnet til APPDATA. Rart at Vim gør udvid [[\% men udvider ikke $HOME.


Hvordan får jeg $HOME udvidet korrekt? Er det fordi jeg bruger exe i vim scriptet?

Bedste reference


Du behøver ikke ! for at læse en fil.


:exe ":0r $HOME/bin/shell\_script"


Eller læs type kommandoen i Windows (som cat i Linux):


:exe '0r !type "'. $HOME . 'inshell\_script"'


Bemærk:



  • type udføres i windows shell, så du har brug for (backslash) i sti

  • hvis $HOME indeholder space s, har du brug for " (dobbelt quote) for at bevare den bogstavelige værdi af space s


Andre referencer 1


At afklare svaret fra kev:


I Windows udvider $ HOME-varianten ikke korrekt, når du kommer til konsollen. Overvej f.eks. Denne kode:


:e $HOME/myscript


Dette virker, fordi vim udvider $ HOME som normalt. På den anden side vandt det ikke:


:\%! $HOME/myscript


Hvorfor? Fordi vim sender alt efter ! til den underliggende skal, som på Windows er cmd.exe, hvilket gør miljøvariabler \%LIKE\_THIS\%. Hvis du forsøger at bruge denne notation, vil vim hoppe ind og udvide \% til navnet på den aktuelle fil - gå figur.


Hvordan kommer man rundt om det? Brug exe søgeord:


:exe "\%! ".$HOME."myscript"


Lad os analysere:



  • :exe er en kommando, der tager en streng og evaluerer den (tænk eval på de fleste sprog)

  • "!\% " escape til shell kommandoen. Bemærk, at det er citeret, så exe kan evaluere det. Bemærk også, hvordan der er en ekstra plads der, så når vi tilføjer hjemmet var det ikke, men ret imod det

  • .$HOME prikken er et strengforbindelsessymbol. $HOME er uden for citaterne, men sammenkoblet, så vim kan udvide det ordentligt

  • ."/myscript" vej til script og mulige argumenter (også citeret)


    Det vigtige her er at holde $HOME uden for citatmærkerne, ellers bliver det muligvis ikke udvidet korrekt på Windows.


Andre referencer 2


Her har du nogle oplysninger om skråstreger og tilbageslag i vim:


http://vimdoc.sourceforge.net/htmldoc/os\_dos.html[40]



  Når du foretrækker at bruge skråstreger fremad, skal du indstille 'shellslash' -alternativet.
  Vim erstatter derefter backslashes med fremadgående skråstreger, når de udvides
  filnavne. Dette er især nyttigt, når du bruger en Unix-lignende 'shell'.


Andre referencer 3


Du har sikkert brug for noget som funktionen expand. For eksempel:


:echo expand("$HOME/hello")
/home/amir/hello


Du kan finde ud af mere info om udvidelse () med :help expand.