Emacs: comment évaluer la plus petite de l'expression du curseur se trouve dans ou le suivant s-expression

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

  •  24-09-2019
  •  | 
  •  

Question

Qu'est-ce qu'un bon moyen d'évaluer la partie (+ 100 (+ 100 100)) dans

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

Pour l'instant, je le fais par C-x C-e, ce qui signifie que je dois trouver la parenthèse de fin, ce qui est difficile dans la plupart des cas. Options > Paren Matching Highlighting aide, mais je dois déplacer le curseur vers la parenthèse de fin jusqu'à ce que le match est mis en évidence la parenthèse de départ.

Une façon serait d'avoir la version inverse de C-x C-e, pour que je puisse placer le curseur à la parenthèse en commençant comme ceci:

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

puis appuyez sur la combinaison de touches appropriée.

Ou je pourrais placer le curseur dans l'expression, mais pas à l'intérieur des expressions plus petites,:

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

et appuyez sur un raccourci clavier. Parce que viser une cible est plus facile si la cible est grande.

Comment puis-je faire une telle commande? Ou est-il un déjà fourni?

Sidenote: curseur de la barre et le curseur de la boîte

Emacsers qui utilisent le curseur de la boîte (par défaut) peut se demander où je mets le curseur avec la notation de la barre ci-dessus. Dans emacs, vous pouvez choisir la boîte curseur ou curseur de la barre, (bar-cursor-mode t). Lorsque le curseur de la barre est entre les lettres A et B, le curseur de la boîte est sur B. Ainsi, la barre est le mur gauche de la boîte.

BTW, le concept de curseur de la barre est utile d'une manière inhabituelle: La pratique de itérer de index1 à index2-1 dans la programmation surprend les débutants. Il aide à imaginer index1 et index2 comme indiquant barres (murs gauche) plutôt que des boîtes.

Était-ce utile?

La solution

binder une touche à l'un ou les deux de ces derniers:

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

qu'accessoirement, je recommande fortement paredit pour travailler avec les s-expressions. Les commandes d'édition de la structure et les liaisons font l'édition s-expressions un jeu d'enfant. Il se lie à C-down up-list, de sorte que eval-surrounding-sexp ci-dessus est presque exactement la même que C-down C-x C-e (la seule différence est que la fonction utilise save-excursion pour empêcher le mouvement).

Autres conseils

Vous pouvez écrire une telle commande comme ceci:

(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 il y a une façon générale de faire ce que vous voulez.

Par défaut, dans le mini-tampon M - est lié à une commande qui insère le texte à (ou presque) le point dans le mini-tampon (ne pas entrer ou faire autre avec elle,. seulement inserts il).

Vous pouvez, par exemple, utiliser M -:.. pour évaluer un sexp Lisp, puis vous utilisez M - pour saisir un sexp à / point près

Si vous répétez M -. il laisse tomber ce qu'il a attrapé juste et attrape un autre genre de chose (texte) à / point près et insère cela. Par défaut, il passe par ce genre de chose, dans l'ordre:

a. Un symbole Lisp ou le nom du fichier.

b. La région active (texte sélectionné) ou un mot.

c. La liste la plus immédiate.

d. La plus grande liste suivante.

e. La plus grande liste suivante.

f. Quel que soit le fichier ou l'URL des hypothèses la fonction ffap-guesser.

g. Quelle que soit la fonction URL devine thing-at-point-url-at-point.

Qu'est-ce que cela signifie pour votre exemple de (+ (+ 1 2) (+ 100 (+ 100 100)))?

Si le point est avant la 1 du second à la dernière 100, par exemple, ce sont les sexps qui sont consécutivement insérées dans le mini-tampon lorsque vous appuyez sur M - à plusieurs reprises, dans l'ordre.:

a. +

b. 100

c. (+ 100 100)

d. (+ 100 (+ 100 100))

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

Donc, pour insérer le plus grand des listes enserrant vous faire M-: M-. M-. M-. M-. M -. , qui est frappé M -.. cinq fois

Pour ce comportement, en particulier pour l'accaparement des listes précises, vous avez également besoin bibliothèque Au point chose + .

Il y a un eval-defun intégré. Il est lié par défaut à C - M - x . Il est similaire à ce que vous voulez, mais evals le defun haut niveau. Peut-être que vous pouvez adapter cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top