2011-01-04 13 views
10

Ich bin ziemlich neu in Vim, und ich habe es schwer, ein paar Feinheiten mit Vim-Skripting zu verstehen. Insbesondere habe ich Probleme mit Befehlen zu arbeiten, die eine nicht-quoted-Zeichenfolge erwarten (gibt es einen Namen dafür?). Zum BeispielVim: `cd` zu Pfad gespeichert in Variable

cd some/unquoted/string/path 

Das Problem ist, dass ich eine Variable übergeben möchte, aber

let pathname = 'some/path' 
cd pathname 

werden versuchen, das aktuelle Verzeichnis zu ändern, um ‚Pfad‘ anstelle von ‚some/path‘ aufrufen. Ein Weg um dies zu verwenden ist, aber das scheint ein bisschen Kreisverkehr. This StackOverflow question verwendet tatsächlich cd mit einer Variablen, aber es funktioniert nicht auf meinem System ("a: path" wird als der Pfad behandelt, wie oben beschrieben).

Ich verwende cd als ein spezifisches Beispiel, aber dieses Verhalten ist nicht eindeutig cd; Zum Beispiel verhält sich der edit Befehl auch auf diese Weise. (Gibt es einen Namen für diese Art von Befehl?)

Antwort

19

TL; DR: verwenden execute 'cd' fnameescape(pathname)

Erläuterung: Viele grundlegende Befehle, die Dateinamen als Argument Unterstützung Graviszeichen Syntax nehmen:

command `shell command` 

oder

command `=vim_expression` 

so Ihr Beispiel könnte als

01 geschrieben werden
cd `=pathname` 

Wenn Sie dies in einer kontrollierten Umgebung ausführen. Sie müssen nicht diese Variante in Plugins verwenden weil a) es ist &wildignore Einstellung, die dir in den Weg treten kann: set wildignore=*|cd =pathname wird cd scheitern, unabhängig von dem, was in der pathname gespeichert ist, und b) wenn Pfadname Zeilenumbrüche enthält es wird in aufgeteilt werden zwei oder mehr Verzeichnisse.So, was Sie für jedes Stück Code verwenden, sollten Sie beabsichtigen, zu teilen, ist

execute 'cd' fnameescape(pathname) 

Beachten Sie, dass Sie nicht execute "cd" pathname verwenden müssen, weil es sich nicht um Sonderzeichen in Pfadname schert (zB Raum).

+0

Ausgezeichnet! Genau das habe ich gesucht. Danke auch für die Erklärung. –

3

Die grundlegenden Befehle in Vim führen niemals eine Verarbeitung von Variablen durch (woher sollte es wissen, dass Sie nicht in das Verzeichnis pathname statt in den Pfad/path wechseln wollten) ein?). Sie müssen nicht ganz so Kreisverkehr, wie Sie vorgeschlagen, können Sie einfach tun:

exe 'cd' pathname 

Beachten Sie, dass exe verkettet Argumente mit einem Raum automatisch, so dass Sie nicht zu tun haben:

exe 'cd ' . pathname 
+0

Danke! Das ist in der Tat sauberer. Gibt es eine Liste dieser "Grundbefehle"? –

+0

Werfen Sie einen Blick auf ': help expression-commands' – DrAl

0

Vor langer Zeit schrieb ich diese plugin (function FixPathName(), um diese Art von Problemen zu lösen. Jetzt hat vim einige neue Funktionen wie shellescape(), wenn der Pfad mit externen Befehlen verwendet werden muss.