2008-09-16 15 views
18

¿Cómo puedo copiar una línea 10 veces fácilmente en Emacs? No puedo encontrar un atajo o función de línea de copia. Puedo usar C-aC-spcC-eM-w para copiar laboriosamente la línea, pero ¿cómo puedo pegarla más de una vez?Emacs equivalente a yy10p de Vim?

Cualquier idea antes de ir y escribir mis propias funciones.

Respuesta

11

copia:

Si trabaja frecuentemente con líneas, es posible que desee hacer copia (kill-ring-save) y corte (kill-region) trabajar en líneas cuando se selecciona ninguna región:

(defadvice kill-ring-save (before slickcopy activate compile) 
    "When called interactively with no active region, copy a single line instead." 
    (interactive 
    (if mark-active (list (region-beginning) (region-end)) 
    (list (line-beginning-position) 
      (line-beginning-position 2))))) 
(defadvice kill-region (before slickcut activate compile) 
    "When called interactively with no active region, kill a single line instead." 
    (interactive 
    (if mark-active (list (region-beginning) (region-end)) 
    (list (line-beginning-position) 
      (line-beginning-position 2))))) 

Entonces puedes copiar la línea con solo Mw.

pegar:

menudo un argumento prefijo simplemente realiza una acción varias veces, por lo que cabría esperar de Cu Cy 10 para trabajar, pero en este caso Cy utiliza su argumento en el sentido de qué elemento de la kill- anillo para "tirón" (pegar). La única solución que se me ocurre es lo que dice kronoz: grabar una macro con Cx (Cy Cx) y luego dejar que el argumento de Cu vaya a kmacro-end-and-call-macro (eso es Cu 9 Cx e incluso solo C-9 Cx e o M-9 Cx e).

Otra forma: También se puede simplemente quedarse en M-x viper-mode y utilizar yy10p :)

+1

Recomiendo [Evil] (http://www.emacswiki.org/emacs/Evil) sobre 'viper-mode'; [tiene muchas características de Vim que viper no]] (http://stackoverflow.com/questions/14291260/difference-between-viper-vimpulse-and-evil-for-emacs). –

0

Querrá matar la línea: C-a C-k, y luego C-y o?

+1

er .. la pregunta es cómo hacerlo diez veces, no una vez. – Baxissimo

18

puede utilizar una macro de teclado para que: -

Ca Ck Cx (Cy Cj Cx) Cu 9 Cx e

Explicación: -

  • Ca: Vaya a Inicio de la línea
  • Ck: línea de la muerte
  • Cx (: Iniciar la macro del teclado de grabación
  • Cy: yanqui mató línea
  • Cj: Mover a la siguiente línea
  • Cx): Detener grabación de macros de teclado
  • Cu 9: Repetir 9 veces
  • Cx e: Ejecutar macros de teclado
+3

Tenga en cuenta que desde el lanzamiento de Emacs 22.1 puede usar '' que ejecuta 'kill-whole-line' y es el equivalente de' dd' en vi. Entonces cada vez que te encuentres haciendo 'C-a C-k C-k' puedes simplemente' '. –

+0

Lo anterior funciona bien, pero solo para FYI en Emacs 25 (¿posiblemente versiones anteriores también?) En lugar de 'C-x (' y 'C-x)' puede escribir las teclas 'F3' y' F4', respectivamente. [Consulte el manual de emacs para obtener más información] (https://www.gnu.org/software/emacs/manual/html_node/emacs/Basic-Keyboard-Macro.html#Basic-Keyboard-Macro) – user12345

0

No sé de un equivalente directo (Cy 10 veces es lo mejor que sé), pero puede que te interese Viper, que es un paquete de emulación para emacs. Es parte de la distribución estándar de emacs.

2

La única forma que conozco para repetir comandos de su elección es usar el "repetir el argumento" característica de macros de teclado.

Ca C-espacio abajo Mw Cx (Cy Cx) C-9 Cx e

  • Ca: Ir al inicio de la línea
  • C-espacio: Marca Conjunto
  • abajo: vaya a Inicio de la siguiente línea
  • Mw: Copia región
  • Cx (: Inicio de macros de teclado
  • Cy: Yank copiado línea
  • C-x): Finalizar macro del teclado
  • C-9 C-x e: Ejecutar teclado macro nueve veces.

Eso es un poco débil en comparación con vim. Pero solo porque vim es sorprendentemente eficiente en este tipo de cosas.

Si realmente están suspirando por la interacción modal vi similar, se puede usar uno de los modos de emulación vi, como víbora-mode. Consulte en la sección "Emulación" del manual de emacs en línea.

+1

Heh heh, eso son 8 pulsaciones de teclas en comparación con 10 a solo C-y lo maldito diez veces. Te garantizo que puedo escribir C-y diez veces más rápido de lo que puedo escribir todo eso. – Baxissimo

7

Puede saber esto, pero para muchos comandos de un prefijo "C-u 10" lo harán el truco. Desafortunadamente para el comando de tirón C-y, "C-u" se redefine para significar "retroceder ese número de elementos en el anillo de sacrificio, y tirar de ese elemento".

Pensé que podría utilizar los comandos copiar para registrar e insertar-registrar con el comando de prefijo C-u, pero aparentemente eso tampoco funciona.

también C-x z, "repetir el último comando" parece ser inmune a C-u.

Otra idea sería utilizar M-: para obtener una pronta y Eval tipo en un poco de elisp. Pensé que algo así como (dotimes '10 'tirón) podría hacerlo, pero parece que no.

Parece que el uso de C-u en una macro puede ser lo mejor que puede hacer para escribir su propia función.

Si hubiera un voto, yo votaría por Kronoz respuesta.

+5

(dotimes '10 (yank)) parece funcionar para mí – quodlibetor

+0

I segundo C-u (spoofing de limitación de caracteres mínimo). – ychaouche

3

Aquí hay una función que tomé de un puerto OS/2 de Emacs. (Sí, he estado usando durante un tiempo de Emacs.)

;; Author: Eberhard Mattes <[email protected]> 
(defun emx-dup-line (arg) 
    "Duplicate current line. 
Set mark to the beginning of the new line. 
With argument, do this that many times." 
    (interactive "*p") 
    (setq last-command 'identity) ; Don't append to kill ring 
    (let ((s (point))) 
    (beginning-of-line) 
    (let ((b (point))) 
     (forward-line) 
     (if (not (eq (preceding-char) ?\n)) (insert ?\n)) 
     (copy-region-as-kill b (point)) 
    (while (> arg 0) 
     (yank) 
     (setq arg (1- arg))) 
    (goto-char s)))) 

tengo que unido a F9 d:

(global-set-key [f9 ?d] 'emx-dup-line) 

Luego que haría uso de Cu 10 F9 d para duplicar una línea 10 veces.

-1

Usted obtiene la línea con C-k, hace que la siguiente orden suceda diez veces con C-u 10, luego pega la línea con C-y. Bastante simple.

Si siempre quiere que C-k haga toda la línea, puede establecer kill-whole-line en t. No más de jugar con C-a o C-e.

Hay muchas cosas que puedes hacer con elegantes anillos, registros y macros, y te animo a que los aprendas, pero tirar una línea diez veces no tiene por qué ser difícil o extraño.

+1

Buena conjetura, pero ¿realmente lo probaste? El comando de prefijo C-u selecciona qué elemento del anillo de sacrificio para tirar cuando se usa en combo con C-y. No repite el comando 10 veces. – Baxissimo

6

No es necesario tanto C-x) y C-men to en este ejemplo.

Puede simplemente dar el argumento de repetición directamente a C-x). Esto detiene el registro y repite la macro, en un solo paso. O puede omitir C-x) e ir directamente a C-x e, ya que C-x e terminará la grabación antes de hacer las repeticiones.

La forma de elegir depende de cómo le guste su recuento repetido para funcionar. Para C-x) usted dice cuántas repeticiones quería en total (por lo que 10 en este caso). Para C-x e, necesita decir cuántas repeticiones restantes quedan (es decir, 9).


C-C-C-k k también matará el salto de línea final, por lo que no tiene que poner de nuevo a sí mismo más tarde. Es más rápido que usar la marca, y no necesita que cambie ninguna variable.

Mejor aún (a menos que esté en un terminal), puede usar C-S-Backspace * para matar toda la línea, independientemente de dónde se encuentre.

[* Si se está utilizando Windows X, asegúrese de escribir turno (no alt) o puede terminar su sesión!]

Hablando de terminales, M-9 es una buena alternativa si encuentra que no puedes escribir C-9.


En Emacs 22 y superior, de manera predeterminada F3 inicia un extremo macro y F4/repite una macro. Simplemente presiona F3 para comenzar a grabar, presiona F4 cuando hayas terminado, y presiona F4 nuevamente para repetir la macro. (F4 también toma un argumento.)


Poniendo todo esto junto, para obtener 10 copias de la línea actual:

  • CS-Retroceso: matar a esta línea
  • F3: empezar macro
  • Cy: tirar de la línea
  • C-1 C-0 F4: hacer que 10 tirones

No es tan corto como y y 10 p, pero bastante cerca. :)

0

Sobre la base de la respuesta de Baxissimo I defuned esto:

(defun yank-n-times (arg) 
    "yank prefix-arg number of times. Not safe in any way." 
    (interactive "*p") 
    (dotimes 'arg (yank))) 

Conjunto que, en cierta clave, lo llama con un argumento prefijo, y listo.

edición (también modificó la llamada interactiva de arriba para ser menos pésimo)

O, aquí está una versión que puede especie de reemplazar yank-pop:

(defun yank-n-times (&optional arg) 
    "yank prefix-arg number of times. Call yank-pop if last command was yank." 
    (interactive "*p") 
    (if (or (string= last-command "yank") 
     (string= last-command "yank-pop")) 
     (yank-pop arg) 
    (if (> arg 1) 
    (dotimes 'arg (yank)) 
     (message "Previous arg was not a yank, and called without a prefix.")))) 

el mensaje es una especie de mentira, pero no debería llamarlo sin un prefijo de más de 1 de todos modos, entonces.

No estoy seguro de si es una buena idea, pero reemplacé a M-y con esto, veré cómo va eso.

0

Se podría tirar de una línea (o una región) diez veces con menos pulsaciones:

  • marcar una línea (o región)
  • tire del texto seleccionado 10 veces:

C-w C-x (C-y C-1 C-0 C-x)

Como alternativa, utilice las teclas de función F3 y F4 para comenzar y finalizar la macro del teclado:

C-w F3 C-y C-1 C-0 F4

Cuestiones relacionadas