Emacs: Wie die kleinste s-Ausdruck der Cursor in oder in den folgenden s-Ausdruck ist zu bewerten

StackOverflow https://stackoverflow.com/questions/2171890

  •  24-09-2019
  •  | 
  •  

Frage

Was ist ein guter Weg, um den (+ 100 (+ 100 100)) Teil in

bewerten
(+ (+ 1 2) (+ 100 (+ 100 100)))

Im Moment mache ich es von C-x C-e, das heißt, ich brauche die Endung Klammer zu finden, die in den meisten Fällen schwierig ist. Options > Paren Matching Highlighting hilft, aber ich muss noch den Cursor in Richtung der Endung Klammer bewegen, bis das markierte Spiel der Start Klammer ist.

Eine Möglichkeit, die umgekehrte Version von C-x C-e zu haben wäre, so dass ich die Cursor an der Start Klammer wie folgt platzieren:

(+ (+ 1 2) |(+ 100 (+ 100 100)))

und drücken Sie dann die entsprechende Tastenkombination.

Oder ich könnte den Cursor in dem Ausdruck platzieren, jedoch nicht in kleineren Ausdrücken:

(+ (+ 1 2) (+ | 100 (+ 100 100)))

und drücken Sie eine Tastenkombination. Da auf einem Ziel Ziel ist einfacher, wenn das Ziel groß ist.

Wie kann ich ein solcher Befehl machen? Oder gibt es eine bereits zur Verfügung gestellt?

Nebenbei bemerkt: bar Cursor und Feld Cursor

Emacsers die Box Cursor (default) könnte sich fragen, wo ich den Cursor mit der Bar-Notation oben setzen. In Emacs, können Sie Feld Cursor oder Balken-Cursor, (bar-cursor-mode t) wählen. Wenn die Balken Cursor zwischen den Buchstaben A und B ist, ist die Box Cursor auf B. So ist die Leiste die linke Wand der Box ist.

BTW, das Konzept der Bar Cursor ist in einige ungewöhnlichen Art und Weise nützlich: Die Praxis von index1 zu index2-1 in der Programmierung Iterieren überrascht Anfänger. Es hilft index1 und index2 als Anzeigebalken (linke Wände), anstatt Boxen vorstellen.

War es hilfreich?

Lösung

Bind ein Schlüssel für eine oder beide der folgenden Optionen:

(defun eval-next-sexp ()
  (interactive)
  (save-excursion
    (forward-sexp)
    (eval-last-sexp nil)))

(defun eval-surrounding-sexp (levels)
  (interactive "p")
  (save-excursion
    (up-list (abs levels))
    (eval-last-sexp nil)))

Tangential Zusammenhang, empfehle ich paredit mit s-Ausdrücke arbeiten. Die Struktur der Bearbeitung von Befehlen und Bindungen macht die Bearbeitung s-Ausdrücke ein Kinderspiel. Es bindet C-down zu up-list, so dass eval-surrounding-sexp über fast genau die gleiche wie C-down C-x C-e (der einzige Unterschied besteht darin, dass die Funktion verwendet save-excursion Bewegung zu verhindern).

Andere Tipps

Sie können schreiben einen solchen Befehl wie folgt:

(require 'thingatpt)
(defun eval-sexp-at-or-surrounding-pt ()
  "evaluate the sexp following the point, or surrounding the point"
  (interactive)
  (save-excursion
    (forward-char 1)
    (if (search-backward "(" nil t)
        (message "%s" (eval (read-from-whole-string (thing-at-point 'sexp)))))))

Icicles gibt es eine allgemeine Art und Weise zu tun, was Sie wollen.

In der Standardeinstellung in den Minipuffer M - wird auf einen Befehl gebunden, daß Einsätze Text an (oder nahe) Punkt in den Minipuffer (es nicht betreten oder anderes zu tun mit;. Nur Einsätze it).

Sie kann zum Beispiel der Verwendung M -:.. einen Lisp sexp, zu bewerten und dann verwenden Sie M - eine sexp greift an / in der Nähe von Punkt

Wenn Sie wiederholen M -. dann fällt es, was es einfach gepackt und packt eine andere Art von Information (Text) an / in der Nähe von Punkt und fügt das. Standardmäßig läuft es durch diese Art von THING, um:

a. Ein Lisp Symbol oder Dateinamen.

b. Der aktive Bereich (ausgewählter Text) oder ein Wort.

c. Die unmittelbarste Liste.

d. Die nächstgrößere Liste.

e. Die nächstgrößere Liste.

f. Unabhängig davon, welche Datei oder URL der Funktion ffap-guesser Vermutungen.

g. Was auch immer URL der Funktion thing-at-point-url-at-point Vermutungen.

Was heißt das für Ihr Beispiel von (+ (+ 1 2) (+ 100 (+ 100 100)))?

Wenn der Punkt ist vor dem 1 des zweiten bis letzten 100, zum Beispiel, das sind die sexps, die nacheinander in der Minipuffer eingefügt werden, wenn Sie drücken Sie M - wiederholt, um.:

a. +

b. 100

c. (+ 100 100)

d. (+ 100 (+ 100 100))

e. (+ (+ 1 2) (+ 100 (+ 100 100)))?

So ist die größte der umschließenden Listen einfügen Sie tun würde, M-: M-. M-. M-. M-. M -. , das heißt, Hit M -.. fünfmal

Für dieses Verhalten, insbesondere für die genaue Listen greifen, können Sie auch Bibliothek benötigen Ding an Punkt + .

Es gibt eine eingebaute eval-defun. Es wird standardmäßig gebunden C - M - x . Es ist ähnlich zu dem, was Sie wollen, aber evals den Top-Level-defun. Vielleicht können Sie, dass anpassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top