Pregunta

¿Cómo puedo copiar una línea de 10 veces fácilmente en Emacs?No puedo encontrar una copia de la línea de acceso directo o función.Puedo usar C-aC-spcC-eM-w para tomarse la molestia de copiar de la línea, pero ¿cómo puedo pegar a continuación, más de una vez?

Alguna idea antes de que me vaya y escribir mis propias funciones.

¿Fue útil?

Solución

Copia:

Si sueles trabajar con líneas, es posible que desee realizar la copia (kill-ring-save) y de corte (kill-region) trabajo en las líneas cuando no se selecciona una región de:

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

A continuación, puede copiar la línea con sólo M-w.

Pegar:

A menudo un prefijo argumento sólo realiza una acción varias veces, por lo que usted esperaría C-u 10 C-y a trabajar, pero en este caso C-y utiliza su argumento para decir que el elemento de la kill-ring para "tirar" (pegar).La única solución que se me ocurre es lo que kronoz dice:grabar una macro con C-x C-s C-x ) y, a continuación, deje que el argumento de la C-u ir a kmacro-end-and-call-macro en lugar de ello (que es C u-9 C-x e, o incluso de la C-9 C-x e o M-9 C-x e).

De otra manera:También puede permanecer en el M-x viper-mode y el uso yy10p :)

Otros consejos

usted puede usar un teclado macro para que:-

C-C-k C-x C-s C-j C-x ) C-u 9 C-x e

Explicación:-

  • C-r :Ir al inicio de la línea
  • C-k :Matar línea
  • C-x ( :Iniciar la grabación de la macro de teclado
  • C-y :Tire del muerto de la línea de
  • C-j :Mover a la siguiente línea
  • C-x ) :Detener la grabación de la macro de teclado
  • C-u 9 :Repetir 9 veces
  • C-x e :Ejecutar macro de teclado

Usted puede saber esto, pero para muchos los comandos de un "C-u 10" prefijo de hacer el truco.Por desgracia para el C-y comando "yank", "C-u" es definir que significa "volver que muchos de los artículos en el kill ring, y tirar de ese elemento".

Pensé que podría ser capaz de utilizar la copia de registro y de inserción-registro de comandos con el C-u prefijo de comandos, pero parece que no funciona bien.

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

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

Por lo que se ve como el uso de C-u en una macro de hecho puede ser el mejor que usted puede hacer corto de escribir su propia función.

Yo tenía un voto, yo iba a votar por kronoz respuesta.

Usted no necesita tanto de C-x ) y C-x e en este ejemplo.

Usted puede darle a la repetición del argumento directamente a C-x ).Esto detiene la grabación y se repite la macro, en un solo paso.O puede omitir C-x ) e ir directamente a C-x e, ya que C-x e va a terminar la grabación antes de hacer las repeticiones.

El camino que elija depende de cómo te gusta tu número de repeticiones para trabajar.Para C-x ) te dicen cuántas repeticiones que quería en total (para 10 en este caso).Para C-x e necesita decir cuantas más repeticiones que están a la izquierda (es decir,9).


C-C-k C-k también matar a la final de salto de línea, así que usted no tiene que poner de nuevo a sí mismo más adelante.Es más rápido que el uso de la marca, y no es necesario cambiar ninguna de las variables.

Incluso mejor (a menos que usted está en un terminal), se puede utilizar C-S-Retroceso* matar a toda la línea, independientemente de dónde usted está en él.

[* Si usted está utilizando el sistema de ventanas X, asegúrese de que el tipo de cambio (no alt) o usted puede terminar su sesión!]

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


En Emacs 22 y superior, por defecto F3 inicia una macro y F4 final/se repite una macro.Simplemente pulse F3 para empezar a grabar, presione F4 cuando hayas terminado, y pulsa F4 de nuevo para repetir la macro.(F4 también toma un argumento.)


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

  • C-S-Retroceso :matar a esta línea
  • F3 :inicio de la macro
  • C-y :tirar de la línea de
  • C-1 C-0 F4 :hacer que 10 yankis

No es tan corto como s s 10 p, pero muy cerca.:)

Aquí está una función que me sacó de un OS/2 puerto de Emacs.(Sí, he estado usando Emacs por un tiempo.)

;; Author: Eberhard Mattes <mattes@azu.informatik.uni-stuttgart.de>
(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 unía a F9 d:

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

A continuación, me gustaría usar el C-u 10 F9 d para duplicar una línea de 10 veces.

La única forma que conozco para repetir comandos arbitrarios es el uso de la "repetición por el argumento de la" función de macros de teclado.

C-un C-espacio de abajo M-w C-x C-s C-x ) C-9 C-x e

  • C-r :Ir al inicio de la línea
  • C-espacio :Marca
  • abajo :Ir al inicio de la línea siguiente
  • M-w :Copia región
  • C-x ( :Inicio de teclado macro
  • C-y :Yank línea copiada
  • C-x ) :Final teclado macro
  • C-9 C-x e :Ejecutar teclado macro nueve veces.

Que es una especie de débil en comparación con vim.Pero sólo porque vim es increíblemente eficiente en este tipo de cosas.

Si usted está realmente celoso de modal vi-como interacción, puede utilizar uno de los vi modos de emulación, como la víbora de modo.Consultar en el apartado de "Emulación" de en línea manual de emacs.

Usted va a querer matar a la línea:C-C-k y, a continuación, C-y o ?

No sé de un equivalente directo (C-y 10 veces es el mejor que conozco), pero usted puede estar interesado en la Víbora, que es un vi paquete de emulación para emacs.Es parte del estándar de emacs distribución.

Basado en Baxissimo la respuesta que yo defuned este:

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

Establecer que para algunos, la tecla de llamada con un prefijo argumento, y te vas.

editar (modificado también el interactivo de la llamada anterior a ser menos mal)

O, he aquí una versión que se pueden ordenar 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 se debe llamar sin un prefijo de mayor que 1, de todas maneras.

No estoy seguro si es una buena idea, pero he sustituido Mi con esto, voy a ver cómo va.

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

  • marca una línea (o región)
  • copiar el texto seleccionado 10 veces:

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

Como alternativa, utilice el F3 y F4 con las teclas de función para iniciar y finalizar el teclado macro:

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

Usted obtener la línea con el C-k, puedes hacer el siguiente comando pasar diez veces con C-u 10, a continuación, pegue la línea con el C-y.Bastante simple.

Si usted desea siempre C-k hacer toda la línea, se puede establecer matar-toda la línea de t.No más tener que pelearnos con C o C-e.

Hay mucho que se puede hacer con la fantasía de matar a los anillos, los registros y las macros, y os animo a aprender de ellos, pero tirando una línea de diez veces no tiene que ser difícil o extraño.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top