Come copiare il rettangolo ucciso sull'anello di uccisione


11

Estraggo spesso un rettangolo di testo da un buffer, ma poi scopro di voler strappare il testo come se non fosse un rettangolo. C'è un modo per aggiungere l'attuale rettangolo ucciso all'anello di uccisione?

Il Manuale di Emacs GNU ha questo da dire:

"Uccidere" un rettangolo non sta uccidendo nel senso comune; il rettangolo non è memorizzato nell'anello di uccisione, ma in un posto speciale che registra solo l'ultimo rettangolo ucciso. Questo perché lo strappo di un rettangolo è così diverso dallo strappo del testo lineare che devono essere usati diversi comandi di strappo. Lo strappo non è definito per i rettangoli.

Tuttavia, posso sostanzialmente ottenere il comportamento che desidero

  • M-> vai alla fine del buffer
  • C-x r y rettangolo yank
  • C-x C-x scambia punto e segna (seleziona le linee appena strappate)
  • C-w uccidi la selezione sul ring di uccisione

Esiste un modo migliore per trasformare un rettangolo ucciso in una voce del kill-ring?


La soluzione collegata non è quella che hai chiesto, ma strappa i rettangoli come vuoi: emacs.stackexchange.com/a/46352/15749
jue

Risposte:


6

Se ho capito la tua domanda, stai cercando qualcosa del genere:

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

Per gentile concessione di ErgoEmacs


3

Non sei sicuro di cosa sia speciale avere il rettangolo nel kill-ring, ma se aggiorni a Emacs-24.4, allora puoi fare: C-x SPC .... M-wselezionare un rettangolo e posizionarlo sul kill-ring. Dopodiché C-ystrattonerà quel rettangolo (nello stesso C-x r ycaso, comunque).


Ci sono due cose sull'anello di uccisione che sono "speciali". Il più importante (per me) è il modo in cui gli oggetti dell'anello di uccisione vengono strappati. In poche parole, lo yank sposta il testo esistente verso il basso invece di spostarlo verso destra. L'uso del kill ring ha anche il vantaggio di mantenere una cronologia del testo ucciso. Sembra che 24.4 potrebbe fornire il secondo vantaggio, ma non il primo.
nispio,

Ah, davvero, in quel caso il nuovo comportamento di 24.4 migliora la parte di cui non ti interessa.
Stefan,

1

Inizialmente sono stato infastidito dalla mancanza di una soluzione integrata a questo problema, poi mi sono reso conto che esisteva una soluzione integrata: kill-rectangle.

Dì che hai un testo simile

AAA BBBBBBBBB
AAA BBB
AAA BBBBBBB

Ma vuoi la parte "B" del testo da qualche altra parte, come tra queste linee C e D:

CCCCC
CCC
DDDD
DD

Se copi il rettangolo B ( C-x r M-w) e poi posizioni il punto sulla prima 'D', quindi tira indietro il rettangolo ( C-x r y), finisci con

CCCCC
CCC
BBBBBBBBBDDDD
BBB      DD
BBBBBBB  

dove volevi davvero

CCCCC
CCC
BBBBBBBBB
BBB
BBBBBBB
DDDD
DD

Potrebbe sembrare naturale copiare il rettangolo di "B" e trascinarli nella nuova posizione, ma una soluzione migliore è semplicemente copiare le linee "A e" B "e strapparle nella loro interezza tra la" C "e" D 'linee.

Quindi, segna il rettangolo contenente le "A" e usa kill-rectangle( C-x r k) per terminare con il risultato desiderato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.