2016-06-08 13 views
1

Ich versuche, auf Fisch-Shell zu wechseln, aber ich habe in einen Knackpunkt gerannt. Wenn ich eine Datei mit vim bezeichne und vim bearbeite, kann ich nicht sehen, welche Datei ich in der Jobsteuerung bearbeite.

[email protected] ~> function testvi 
        vim $argv 
       end 
[email protected] ~> functions testvi 
function testvi 
    vim $argv 
end 
[email protected] ~> testvi foobar 
[email protected] ~> jobs 
Job Group CPU State Command 
2 26087 0% stopped vim $argv 

Wie ich es so machen, ist die Ausgabe:

2 26087 0% stopped vim foobar 

Antwort

1

Dies ist eine Situation, wo ein Befehl Abkürzung zu einem Alias ​​vorzuziehen ist (dh eine Funktion) :

Jetzt, wenn Sie "vi" eingeben und Leerzeichen drücken, wird es magisch durch "vim" ersetzt. Sie können kompliziertere Erweiterungen vornehmen. Zum Beispiel verwende ich diese Abkürzungen einiges:

abbr -a gca git commit --amend 
abbr -a gcm git checkout master 

Die Vorteile der Abkürzung ist, sie sind viel einfacher als eine Funktion und die Erweiterung zeigt in der Shell Geschichte, das ich nützlicher als ein aliased Funktionsnamen finden.

0

Die Idee ist, dass wir zunächst in einen neuen Befehl erweitern möchten, und dann die ausgeführt werden. Wir können das mit eval tun.

Allerdings hat dies die Falte, dass irgendwelche Sonderzeichen in dem neuen Befehl interpretiert werden, so dass wir zuerst entkommen müssen.

Die Gesamtfunktion ist:

function testvi 
    eval "vim "(string escape $argv) 
end 

Dies nutzt die neuen string builtin, die 2.3.0 in dem gerade veröffentlichten Fisch.

Illustration des Ergebnisses, hier Bearbeiten einer Datei ‚foobar $ baz‘ zu zeigen, dass entweichende Werke:

> testvi 'foobar $baz' 
> jobs 
Job Group State Command 
5 60249 stopped vim 'foobar $baz' 
+0

Gibt es einen besonderen Grund dafür, dass der Jobtitel vor dem Erweitern der Variablen gesetzt wird? – faho