Comment copier le rectangle tué dans l'anneau de mise à mort

11

J'extrais fréquemment un rectangle de texte à partir d'un tampon, mais je trouve ensuite que je veux extraire le texte comme s'il ne s'agissait pas d'un rectangle. Existe-t-il un moyen d'ajouter le rectangle tué actuel à l'anneau de mise à mort?

Le manuel GNU Emacs a ceci à dire:

«Tuer» un rectangle n'est pas tuer au sens habituel; le rectangle n'est pas stocké dans le kill ring, mais dans un endroit spécial qui enregistre uniquement le rectangle le plus récent tué. Cela est dû au fait que le tirage d'un rectangle est tellement différent du texte linéaire de tirage que des commandes de tirage différentes doivent être utilisées. Yank-popping n'est pas défini pour les rectangles.

Cependant, je peux essentiellement obtenir le comportement que je veux avec

  • M-> aller à la fin du tampon
  • C-x r y rectangle sec
  • C-x C-x point d'échange et marque (sélectionne les lignes nouvellement tirées)
  • C-w tuer la sélection sur le ring

Existe-t-il une meilleure façon de transformer un rectangle tué en entrée de meurtre?

nispio
la source
La solution liée n'est pas ce que vous avez demandée, mais elle tire des rectangles comme vous le souhaitez: emacs.stackexchange.com/a/46352/15749
jue

Réponses:

6

Si j'ai bien compris votre question, vous cherchez quelque chose comme ceci:

(defun youngfrog/copy-rectangle-to-kill-ring (start end)
  "Saves a rectangle to the normal kill ring. Not suitable for yank-rectangle."
  (interactive "r")
  (let ((lines (extract-rectangle start end)))
    (with-temp-buffer
      (while lines ;; insert-rectangle, but without the unneeded stuff
        ;; (most importantly no push-mark)
        (insert-for-yank (car lines))
        (insert "\n")
        (setq lines (cdr lines)))
      (kill-ring-save (point-min) (point-max)))))

Avec l'aimable autorisation d' ErgoEmacs

Nsukami _
la source
3

Vous ne savez pas ce qui est spécial d'avoir le rectangle dans le kill-ring, mais si vous passez à Emacs-24.4, vous pouvez faire: C-x SPC .... M-wsélectionner un rectangle et le placer sur le kill-ring. Après cela C-ytirera ce rectangle (dans la même chose qui C-x r yfait, tho).

Stefan
la source
Il y a deux choses à propos de l'anneau de mise à mort qui sont "spéciales". Le plus important (pour moi) est la façon dont les objets de l'anneau de mise à mort sont tirés. Autrement dit, le coup sec décale le texte existant au lieu de le déplacer vers la droite. L'utilisation de l'anneau de mise à mort présente également l'avantage secondaire de conserver un historique du texte tué. Il semble que 24.4 pourrait fournir le deuxième avantage mais pas le premier.
nispio
Ah, en effet, dans ce cas, le nouveau comportement de 24.4 améliore la partie dont vous ne vous souciez pas.
Stefan
1

J'ai d'abord été ennuyé par l'absence d'une solution intégrée à ce problème, puis j'ai réalisé qu'il y avait une solution intégrée: kill-rectangle.

Dites que vous avez du texte comme

AAA BBBBBBBBB
AAA BBB
AAA BBBBBBB

Mais voulez la partie «B» du texte ailleurs, comme entre ces lignes C et D:

CCCCC
CCC
DDDD
DD

Si vous copiez le rectangle B ( C-x r M-w) puis placez le point sur le premier «D», puis tirez le rectangle vers l'arrière ( C-x r y), vous vous retrouvez avec

CCCCC
CCC
BBBBBBBBBDDDD
BBB      DD
BBBBBBB  

où tu voulais vraiment

CCCCC
CCC
BBBBBBBBB
BBB
BBBBBBB
DDDD
DD

Il peut sembler naturel de copier le rectangle de «B» et de les tirer vers le nouvel emplacement, mais une meilleure solution consiste simplement à copier les lignes «A» et «B» et à les tirer dans leur intégralité entre le «C» et le «C». D 'lignes.

Ensuite, marquez le rectangle contenant les «A» et utilisez kill-rectangle( C-x r k) pour terminer avec le résultat souhaité.

Colin Fraizer
la source