Yank una columna de texto copiado del portapapeles

7

A menudo parece que quiero copiar y pegar varias columnas, por ejemplo, pego una columna

line one
line two
line three

Ahora me gustaría poder tirar de otra columna detrás de ella. Asumiendo que mi buffer de eliminación tiene lo siguiente:

added to one
added to two
added to three

¿Qué comando necesitaría invocar para obtener lo siguiente?

line one added to one
line two added to two
line three added to three

Actualizar

El uso de la funcionalidad de rectángulos de Emacs ayuda bastante, pero sigue siendo subóptimo. Por ejemplo, si usa Emacs en modo gráfico y está arrancando de programas externos, es decir, usando la funcionalidad Copiar y pegar de su sistema operativo, el búfer kill no tiene metainformación rectangular, por lo que el tirón rectangular no funciona. Otro problema es si tiene columnas con un ancho interno variable:

short line                        *
a much larger line which goes on
short line again

Y si desea tirar de forma rectangular, deberá colocar el puntero en el lugar marcado (*). Aunque esto es trivial con tres líneas, puede ser bastante engorroso asegurarse de colocar el puntero en el borde más externo de la primera columna.

hbogert
fuente
No estoy seguro de entenderlo, pero creo que quieres trabajar con rectángulos .
Dan
No estoy seguro de que haya una respuesta directa a esto. Una vez que el texto se copia en el portapapeles, se pierde toda la información sobre las columnas. Creo que probablemente necesite hacer algo fuera de Emacs, para preservar esta información de "columna".
Dibujó
Si sólo estaba más hábil con elisp, espero que esto sea sólo unas pocas líneas, pero en realidad esperaba que fuera una función existente este
hbogert
Puedes hacer esto con una macro bastante fácil. Tira el texto de la segunda columna debajo del texto de la primera columna. Luego, grabe una macro que mueva el valor superior de los datos de la columna dos al final de la primera fila de los datos de la columna uno, luego baje el siguiente valor de los datos de la columna dos y ejecútelo hasta que todo se alinee.
Jordon Biondo

Respuestas:

5

Aquí hay un comando único que puede usar para tirar de cada línea de la eliminación actual al final de cada línea posterior, comenzando en la línea actual.

(defun yank-append-lines (&optional without-space)
  "Yank each line of the current kill at the end of each subsequent line.

A space will be added between each line unless WITHOUT-SPACE which can
be passed in via a prefix arg."
  (interactive "P")
  (save-excursion
    (let ((lines (split-string (current-kill 0) "\n")))
      (dolist (line lines)
        (goto-char (line-end-position))
        (unless without-space
          (just-one-space))
        (insert line)
        (unless (zerop (forward-line))
          (insert "\n"))))))

La implementación es bastante simple. Toma el current-kill, divídelo por línea. Luego, para cada línea dividida: vaya al final de la línea dividida, inserte un espacio, inserte una línea y luego avance una línea.

Esto también se podría hacer con una macro repetible que mueve una línea desde un lugar en el búfer al final de una línea en otra parte del búfer.

Jordon Biondo
fuente