8
votes

Comment écrire une fonction EMACS pour envelopper la région marquée avec du texte spécifié

Je ne suis pas trop familier avec Elisp et j'essaie d'apprendre. À Emacs, j'aimerais pouvoir faire ce qui suit:

  1. marque via c-espace li>
  2. aller à l'endroit où je veux que le marquage se termine, j'ai donc une région qui est mise en évidence, supposons qu'il s'agisse de "texte en surbrillance" li>
  3. frapper une séquence clé li>
  4. Demandez à Emacs me demander de saisir du texte, dites "Terrain" et Li>
  5. avoir ce changement de texte en surbrillance pour être "tracé (texte en surbrillance)". C'est-à-dire que j'aimerais envelopper le texte dirigé entre parenthèses et le préciser avec le texte que je sais. P>

    (defun wrap-text ()
        )
    


0 commentaires

4 Réponses :


8
votes

Pour votre cas, cela devrait fonctionner:

(defun wrap-text (b e txt)
  "simple wrapper"
  (interactive "r\nMEnter text to wrap with: ")
  (save-restriction
    (narrow-to-region b e)
    (goto-char (point-min))
    (insert txt)
    (insert "(")
    (goto-char (point-max))
    (insert ")")))

(global-set-key (kbd "C-x M-w") 'wrap-text)


3 commentaires

Aussi cette question / réponse: Stackoverflow.com/Questtions/1397113/how-a-tag-text-in-emacs / ... .


Comment vas-tu faire quelque chose comme ça avec Yasnippet? Je connais bien: 1. Tapez le mot-clé 2. Développer Cela implique l'ajout de texte au début et à la fin d'une région. Je serais intéressé d'entendre cette solution aussi. Merci.


@Vinh Bon point, vous avez besoin du texte initial pour développer YASNIPPET, je vais supprimer cela de la réponse.



1
votes

Merci Trey Jackson. Je ne savais pas que tu as posté une solution alors je suis allé à #emacs sur la freenode de l'aide. Après quelques recherches, j'ai proposé ce qui suit:

(defun ess-R-wrap-content-vqn ()
  "Wrap marked region with a specified PREFIX and closing parentheses."
  (interactive)
  (set (make-local-variable 'prefix) (read-from-minibuffer "function: "))
  (set (make-local-variable 'prefix) (concat prefix "("))
  (save-excursion (goto-char (region-beginning)) (insert prefix))
  (save-excursion (goto-char (region-end)) (insert ")"))
)
(define-key ess-mode-map "\C-c\M-w" 'ess-R-wrap-content-vqn) ;; w is for wrap


0 commentaires

3
votes

Quelque chose un peu plus proche de votre version, mais avec quelques modifications:

  • Vous pouvez utiliser "Let" pour créer une variable locale li>
  • La région-début et la région de la région vous permet d'équivalent de ce que Trey a fait avec Li> ul>

    Voici un exemple: p>

     (defun wrap-in-function ()
       "Wrap marked region with a specified PREFIX and closing parentheses."
       (interactive)
       (let ((prefix (read-from-minibuffer "function: ")))
         (save-excursion
           (goto-char (region-beginning))
           (insert (concat prefix "(")))
         (save-excursion
           (goto-char (region-end))
           (insert ")"))))
    


3 commentaires

La déclaration interactive de la réponse de Trey est une meilleure façon de le faire. Le 'R' indique qu'une région doit être définie et que le reste est utilisé comme une invite à lire dans le texte souhaité à l'aide des méthodes Standard EMACS. Bien que ces méthodes puissent éventuellement appeler lecture-from-minibuffer 'Comme vous l'avez fait ici, vous perdez d'autres comportements standard / Global Emacs que vous avez personnalisés.


Je viens d'essayer le vôtre et il n'enveloppe pas complètement le texte. Il enveloppe: envelopper () mytext.


Merci Vinh, vous avez raison, ma fonction ne fonctionne que si vous sélectionnez le texte à envelopper à partir de la fin. Je vais essayer de voir si je peux résoudre ça.



2
votes

Cela nécessite 'CL mais est autrement assez minuscule. Utilisez-le depuis quelques années.

(require 'cl) ;;if you haven't elsewhere
(defun decorate-region( beg end prefix suffix )
  (interactive "r\nMPrefix: \nMSuffix: ")
  (cl-set-buffer-substring beg end (concat prefix
                                           (buffer-substring beg end)
                                           suffix)))


0 commentaires