Arranque uma coluna de texto copiada da área de transferência

7

Muitas vezes, pareço copiar e colar várias colunas, por exemplo, colo uma coluna

line one
line two
line three

Agora eu gostaria de poder arrancar outra coluna atrás dela. Supondo que meu buffer de interrupção tenha o seguinte:

added to one
added to two
added to three

Qual comando eu precisaria chamar para obter o seguinte:

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

Atualizar

O uso da funcionalidade de retângulos do Emacs ajuda bastante, mas ainda é subótimo. Por exemplo, se você estiver usando o Emacs no modo gráfico e estiver usando programas externos, ou seja, usando a funcionalidade Copiar e Colar do seu sistema operacional, o kill-buffer não terá meta informações retangulares, portanto, o arranque retangular não funcionará. Outro problema é se você está tendo colunas com largura interna variável:

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

E você deseja puxar retangular, terá que colocar o ponteiro no ponto marcado (*). Embora isso seja trivial com três linhas, pode ser bastante complicado garantir que você esteja colocando o ponteiro na extremidade mais externa da primeira coluna.

hbogert
fonte
Não tenho muita certeza de entender, mas acho que você deseja trabalhar com retângulos .
Dan
Não tenho certeza se há uma resposta direta a isso. Depois que o texto é copiado para a área de transferência, qualquer informação sobre as colunas é perdida. Eu acho que você provavelmente precisaria fazer algo fora do Emacs, para preservar essa informação da "coluna".
Tirou
Se eu fosse mais proficiente com elisp, espero que este seja apenas algumas linhas, mas, na verdade, esperava que este seja uma função existente
hbogert
Você pode fazer isso com uma macro muito fácil. Arranque o texto da segunda coluna abaixo do texto da primeira coluna. Em seguida, grave uma macro que mova o valor superior dos dados da coluna dois para o final da primeira linha dos dados da coluna um e, em seguida, desça o próximo valor dos dados da coluna dois e execute-o até que todas as linhas estejam alinhadas.
Jordon Biondo

Respostas:

5

Aqui está um comando único que você pode usar para puxar cada linha da interrupção atual no final de cada linha subseqüente, iniciando na linha atual.

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

A implementação é bastante simples. Pegue o current-kill, divida-o por linha. Em seguida, para cada linha de divisão: vá para o final da linha de divisão, insira um espaço, insira uma linha e avance uma linha.

Isso também pode ser feito com uma macro repetível que move uma linha de um lugar no buffer para o final de uma linha em outra parte do buffer.

Jordon Biondo
fonte