2014-02-21 3 views
5

Ich arbeite gerade an einer elisp Funktion, die an einen anderen Ort fährt, eine Funktion ausführt und dann zur Position zurückkehrt. Mein einziges Problem ist, dass, wenn die Funktion Text einfügt, die Position, die ich gespeichert habe, nicht mehr dort ist, wo ich sein möchte. Zum Beispiel, sagen, ich habe die folgende Zeichenfolge:Elisp: Speichern einer Position, Einfügen von Text davor und Zurückkehren zum selben Ort

Hello World 

Und lassen Sie uns sagen, dass ich auf der ‚W‘ bin an Position 6. Und lassen Sie uns sagen, dass ich ein anderes „Hallo“ am Anfang wie folgt eingefügt werden soll:

Die Art, wie ich es jetzt mache, würde ich 6 in einer Variablen speichern, fügen Sie das Hallo ein, dann zurück zu Position 6. Aber jetzt ist das zweite Hallo auf Position 6 und ich komme zurück falscher Ort!

Im Moment mache ich so etwas wie dieses:

(setq my-retloc (point)) 
(move-function) 

Dann in der Endhaken der Move-Funktion:

(do-stuff) 
(goto-char my-retloc) 

Leider ist dieser Haken am Ende tun, ist nicht wirklich vermeidbar. Gibt es einen Weg in elisp, um sicherzustellen, dass ich an die richtige Position zurückkehren würde?

Antwort

6

Dies ist eine ziemlich häufige Notwendigkeit in elisp, so gibt es eine spezielle Form, die es automatisch macht: save-excursion. Verwenden Sie es wie folgt aus:

(save-excursion 
    ;; move about and modify the buffer 
    (do-stuff)) 
;; position restored 
+0

Danke für die Antwort! Dies löst jedoch mein Problem nicht ganz, da ich die Rückgabe in einer anderen Funktion durchführen muss. Ich versuche, mit ace-jump den Cursor zu bewegen, aber aus irgendeinem Grund verweigert er die Ausführung in der richtigen Reihenfolge. Als Ergebnis muss ich meine Position in einer Funktion speichern und meine Position in einer anderen Funktion wiederherstellen (Endhaken des As-Jumps). Ich weiß wirklich nicht warum, aber Ace-Jump spielt nicht gut mit Save-Excursion. – user1539179

1

Wenn Sie nicht save-excursion verwenden können, wie @ataylor vorgeschlagen, dann etwa wie folgt tun. (Vermutlich können Sie unwind-protect auch nicht verwenden, wenn die Rückkehr nicht innerhalb einer Funktion durch die ursprüngliche Funktion aufgerufen wird.)

  1. Speicher point in einer globalen Variablen. Speichern Sie point als Markierung, falls sich der aktuelle Puffer ändert oder der Puffertext geändert wird, wodurch eine gespeicherte Integer-Position unbrauchbar wird.

  2. Wenn möglich, wickeln Sie den Code point mit einem catch und zur Wiederherstellung der ursprünglichen Position in allen Fällen (wie bei einem unwind-protect) zu speichern.

  3. Verwenden Sie throw, wenn Sie mit Ihrer Exkursion fertig sind, um zu dem Wiederherstellungscode zurückzukehren (der zum Marker führt).

+0

Markierungen funktionierten perfekt. Ich danke dir sehr! – user1539179

+0

Hi @ user1539179, wenn eine Antwort Ihre Probleme löst, dann sollten Sie sie als Antwort markieren. –

+0

@Drew Wie speichern Sie "Punkt" als Marker? 'mark',' set-mark', 'push-mark'? –

Verwandte Themen