Emacs: come valutare il più piccolo s-espressione il cursore si trova, o il seguente s-espressione
-
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.
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.