variables – editar interactivamente la variable emacs en el búfer

Pregunta:

Estaba viendo esto en StackOverflow y me preguntaba si había una forma agradable incorporada de editar cadenas de texto almacenadas en variables como si fueran búferes. Mx set-variable realmente no es suficiente cuando tienes una cadena larga de opciones de LaTeX dentro de una variable.

Estoy buscando un comportamiento similar al paquete string-edit , pero para editar variables emacs.

Respuesta:

Combinar string-edit con un poco de elisp personalizado puede proporcionar la función que desea. Por ejemplo, la función siguiente le permitirá editar el valor de una variable en el string-edit-mode , siempre que esta variable tenga un valor de cadena.

(defun my/edit-string-variable-at-point ()
  "If the symbol at point is a string-valued variable, update it
using `string-edit' to provide the new value."
  (interactive)
  (let ((variable (intern (thing-at-point 'symbol t))))
    (with-current-buffer (get-buffer-create "*edit-variable*")
      (erase-buffer)
      (print `(setq ,variable ,(symbol-value variable))
             (current-buffer))
      (goto-char (- (point-max) 3))
      (if (string-edit-at-point)
          ;; Variable value is a string
          ;; Overrides C-c C-c so that the new value is evaluated after `string-edit-conclude'
          (let ((oldmap (cdr (assoc 'string-edit-mode minor-mode-map-alist)))
                (newmap (make-sparse-keymap)))
            (set-keymap-parent newmap oldmap)
            (define-key newmap (kbd "C-c C-c")
              #'(lambda ()
                  (interactive)
                  (string-edit-conclude)
                  (eval-buffer)
                  (kill-buffer)))
            (make-local-variable 'minor-mode-overriding-map-alist)
            (push `(string-edit-mode . ,newmap) minor-mode-overriding-map-alist))
        ;; Variable value was not a string
        (message "`%s' is not a string!" variable)
        (kill-buffer)))))

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım