Emacs: come valutare il più piccolo s-espressione il cursore si trova, o il seguente s-espressione

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

  •  24-09-2019
  •  | 
  •  

Domanda

Che cosa è un buon modo per valutare la parte (+ 100 (+ 100 100)) in

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

Per il momento, lo faccio da C-x C-e, il che significa che ho bisogno di localizzare la parentesi finale, che è difficile nella maggior parte dei casi. Options > Paren Matching Highlighting aiuta, ma ancora ho bisogno di spostare il cursore verso la parentesi finale fino a quando la partita è evidenziata la parentesi di partenza.

Un modo potrebbe essere quello di avere la versione inversa di C-x C-e, in modo che possa posizionare il cursore alla parentesi di partenza in questo modo:

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

e quindi premere il combinazione di tasti appropriata.

oppure avrei potuto posizionare il cursore all'interno della espressione, ma non all'interno espressioni più piccoli,:

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

e premere una combinazione di tasti. Perché mirando a un bersaglio è più facile se il bersaglio è grande.

Come posso fare ad un comando? O c'è un già previsto?

Nota a margine: barra del cursore e la casella del cursore

Emacsers che usano cursore della casella (impostazione predefinita) potrebbe chiedersi dove sto mettendo il cursore con la notazione barra sopra. In Emacs, è possibile scegliere il cursore scatola o cursore a barra, (bar-cursor-mode t). Quando il cursore bar è tra le lettere A e B, il cursore scatola è su B. Quindi la barra è la parete sinistra della casella.

A proposito, il concetto di cursore barre è utile in qualche modo insolito: La pratica di iterazione da index1 a index2-1 in programmazione sorprende principianti. Aiuta a immaginare index1 e index2 come indicando bar (muri a sinistra), piuttosto che scatole.

È stato utile?

Soluzione

Associare una chiave per uno o entrambi questi:

(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)))

Tangenzialmente legato, consiglio vivamente paredit per lavorare con s-espressioni. La struttura di comandi di modifica e le associazioni rendono l'editing s-espressioni un gioco da ragazzi. Si lega C-giù up-list, cosicché eval-surrounding-sexp sopra è quasi esattamente lo stesso come C-down C-x C-e (l'unica differenza è che gli usi funzionali save-excursion per impedire il movimento).

Altri suggerimenti

Si potrebbe scrivere un tale comando in questo modo:

(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)))))))

Ghiaccioli c'è un modo generale di fare quello che vuoi.

Per impostazione predefinita, nel minibuffer M - è associato a un comando che inserisce testo (o quasi) il punto nel minibuffer (non vi entrano o fare altro con esso;. Solo inserti esso).

È possibile, ad esempio, l'uso M -:.. per valutare un sexp Lisp, e quindi si utilizza M - per afferrare un sexp a / punto vicino

Se si ripete M -. poi lascia cadere quello che appena ha afferrato e afferra un altro tipo di cosa (testo) a / punto vicino e gli inserti che. Per impostazione predefinita, viene eseguito attraverso questi tipi di cose, in ordine:

a. Un Lisp simbolo o nome del file.

b. La regione attiva (testo selezionato) o una parola.

c. La lista più immediato.

d. Il prossimo grande lista.

e. Il prossimo grande lista.

f. Qualunque sia il file o un URL le congetture funzione ffap-guesser.

g. Qualunque sia URL le congetture funzione thing-at-point-url-at-point.

Che cosa significa questo per il tuo esempio di (+ (+ 1 2) (+ 100 (+ 100 100)))?

Se il punto è prima della 1 del secondo-a-ultima 100, per esempio, questi sono i sexps che vengono consecutivamente inseriti nel minibuffer quando si colpisce M - più volte, in ordine.:

a. +

b. 100

c. (+ 100 100)

d. (+ 100 (+ 100 100))

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

Quindi, per inserire la più grande delle liste che racchiudono si farebbe M-: M-. M-. M-. M-. M -. , cioè, ha colpito M -.. cinque volte

Per questo comportamento, in particolare per la cattura delle liste precise, è necessario anche biblioteca cosa alla Point + .

C'è un eval-defun integrato. E 'destinato per impostazione predefinita per C - M - x . E 'simile a quello che si vuole, ma il evals defun-alto livello. Forse è possibile adattare questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top