Repita la última inserción de texto

10

En Vim puede presionar .para repetir el último cambio, incluida la inserción de texto.

Mientras que en Emacs C-x zsolo repite el último comando. Soy consciente de que las macros se pueden usar aquí, pero con mayor frecuencia me doy cuenta de que necesito volver a insertar el mismo texto demasiado tarde. Cuando necesito volver a insertarlo solo una vez más , definir una macro no tiene sentido.

P: ¿Hay alguna forma de repetir la inserción de texto dentro de Emacs?

ooi
fuente
1
¿Cuál es el "texto" que quieres repetir? Técnicamente hablando, la última inserción es solo el último personaje, que probablemente no sea lo que buscas. Entonces, ¿cómo definiría una "inserción de texto" para su propósito? Aclararlo también puede ayudarlo a encontrar formas de lograrlo.
T. Verron
Buena pregunta: cómo definir esa última modificación continua del búfer . ¿Quizás una modificación del búfer entre movimientos de dos puntos que no son resultado de una modificación del búfer ( C-f, búsqueda, etc.) Si eso tiene sentido ...
ooi
Aclara lo que quieres con una receta. Hay muchos tipos de "inserción" (formas de insertar texto). ¿Estás insertando interactivamente? ¿Si es así, cómo?
Dibujó el
Interactivamente. Pero idealmente no importaría cómo o qué. Es como si hubiera olvidado comenzar a definir una macro . En cuyo caso el problema es cuándo es eso. Quizás se pueda usar algún gancho .
ooi
2
¿Cómo define 'última inserción' en Emacs? Como no hay un cambio de modo de edición / comando como en vi, ¿qué tan lejos en la historia deberíamos llegar? Por lo general, solo selecciono "la última inserción" ( C-spacemover el cursor M-wpara copiar) y luego C-ypegar tantas veces como sea necesario.
Alain

Respuestas:

7

dot-modees un "modo menor para repetir la escritura o los comandos" y puede hacer lo que necesita. Básicamente solo repite las últimas inserciones / eliminaciones que haces. Es bastante similar a .en Vi (m).

Bill Benedetto
fuente
2
Lo que hace lo que hace?
Malabarba
1
Bienvenido a Emacs.SE. En este momento, su respuesta está más cerca de un comentario que de una respuesta. ¿Podría editarlo para explicar qué dot-modehace y cómo proporciona la funcionalidad que OP está tratando de obtener?
Dan
7

Es como si hubiera olvidado comenzar a definir una macro

Puede usar kmacro-edit-lossage( C-x C-k l) para eso: le permite ver sus últimas 300 pulsaciones de teclas (incluidas las inserciones simples) y editarlas como una macro.

Para un uso simple, simplemente ubique el comienzo de la inserción que desea repetir, elimine todo el texto de "Macro:" hasta ese punto y presione C-c C-c. Ahora tiene una macro que puede usar para realizar las mismas acciones, como si no se olvidara de grabarla en primer lugar.

Lamentablemente, esto falla si las últimas 300 pulsaciones de teclas incluyen clics del mouse.

Editar: el siguiente código lo cambia para que solo se mantengan las teclas después del último evento del mouse.

(defadvice recent-keys (after tv/recent-keys-no-mouse first ())
  "Return only the keys since the last mouse event"
  (let* ((vec ad-return-value)
         (lst (append vec nil))
         (nmax (length vec))
         (i (- nmax 1)))
    (while
        (and
         (>= i 0)
         (not
          (let ((mod (event-modifiers (elt vec i))))
            (or (memq 'click mod)
                (memq 'double mod)
                (memq 'triple mod)
                (memq 'drag mod)
                (memq 'down mod)))))
      (setq i (- i 1)))
    (setq ad-return-value (vconcat (nthcdr (+ i 1) lst) nil))))

(defun tv/kmacro-edit-lossage-no-mouse ()
  "Same as `kmacro-edit-lossage', but fallback if the keys contain mouse events.

Source: http://emacs.stackexchange.com/a/4071/184"
  (interactive)
  (ad-activate-regexp "tv/recent-keys-no-mouse")
  (call-interactively #'kmacro-edit-lossage)
  (ad-deactivate-regexp "tv/recent-keys-no-mouse"))

;; If you want this function to replace the default one, uncomment this line:
; (global-set-key (kbd "C-x C-k l") 'tv/kmacro-edit-lossage-no-mouse)
T. Verron
fuente
A menudo me desplazo con el mouse, sería genial ver cómo eliminarlos de la macro.
ooi
Wow, este comando sería útil si no fallara por completo si los últimos 300 clics incluidos del mouse. Tal vez simplemente no incluya los clics y deje que el usuario sepa en lugar de simplemente negarse a trabajar.
niñera
@nanny Agregué algo de elisp para permitir una (imo) mejor reserva que simplemente fallar con un mensaje de error: con esta función, solo se mantendrán las teclas después del último evento del mouse. También debería ser posible eliminar los eventos del mouse por completo, pero el resultado de la macro sería algo impredecible.
T. Verron
@ooi No tengo idea si el comentario anterior te pinchó automáticamente, así que aquí también está tu ping.
T. Verron
Gracias, estaba trabajando en lo mismo. Creo que es posible filtrar los argumentos de edmacro-fix-menu-commands. Toma un argumento opcional que puede ignorar los eventos del mouse. Pero no sé lo suficiente sobre el sistema de consejos para que funcione.
niñera
4

Creo que la dabbrev-expandfunción podría hacer el truco. Supongamos que ya ha escrito algunas palabras: emacs, emoción, emoji, ... La próxima vez que escriba una palabra que comience por 'em', puede presionar M-/y emacs le propondrá que inserte una de las palabras ya insertadas comenzando por 'em'. Sigue golpeando M-/y emacs te mostrará 'emoji', luego 'emoción, luego ...

También puede echar un vistazo a repeat-complex-command . El ejemplo popular es: desea repetir el comando query-replaceen muchos buffers diferentes utilizando siempre los mismos argumentos, reemplace "pitt" por "patt".

Lo ejecutas una vez, vas a una ventana diferente y escribes C-x ESC ESCpara ejecutarlo nuevamente.

Y para terminar, ¿puedo sugerir repetir inserción ? Este archivo el le ayudará a realizar la inserción, utilizando algún tipo de lógica. Es más como ", repite la última inserción, pero para cada iteración, los argumentos cambiarán.

Este ejemplo se puede encontrar en el archivo el:

;; You can also iterate over lists:
;;   My desk is cluttered
;;   My desk is a real mess
;;   My desk is very hard to see
;;   My desk is buried
;;
;; from m-x insert-patterned
;;    ";;   My desk is %s"
;;    (cluttered "a real mess" "very hard to see" buried)

Espero que le ayudará.

Nsukami _
fuente
1
Quizás puedas expandir un poco ...
T. Verron
@ T.Verron Done :)
Nsukami _
1
Repeat-complex-command es como repeat(que menciona el OP), no es realmente útil para las inserciones de texto. Repeat-insertdebe pensarse antes de insertar el texto, como una macro. ¡Pero dabbrev-expandes una buena idea!
T. Verron