Как скопировать убитый прямоугольник в список уничтожений

11

Я часто извлекаю прямоугольник текста из буфера, но потом обнаруживаю, что хочу восстановить текст, как если бы он не был прямоугольником. Есть ли способ добавить текущий уничтоженный прямоугольник в список уничтожений?

В руководстве по GNU Emacs сказано следующее:

«Убивать» прямоугольник - это не убивать в обычном смысле; прямоугольник хранится не в списке уничтожений, а в специальном месте, в котором записывается только последний уничтоженный прямоугольник. Это потому, что рывок прямоугольника настолько отличается от рывков линейного текста, что приходится использовать разные команды янки. Янки поппинг не определен для прямоугольников.

Тем не менее, я могу в основном получить поведение, которое я хочу с

  • M-> перейти в конец буфера
  • C-x r y дергать прямоугольник
  • C-x C-x обменный пункт и отметка (выбирает вновь выдернутые линии)
  • C-w убить выбор на кольцо убийства

Есть ли лучший способ превратить убитый прямоугольник в запись уничтоженного кольца?

nispio
источник
Решение связано это не то , что вы просили, но он дергает прямоугольниками , как вы хотите: emacs.stackexchange.com/a/46352/15749
Jue

Ответы:

6

Если я понял ваш вопрос, вы смотрите на что-то вроде этого:

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

Предоставлено ErgoEmacs

Нсуками _
источник
3

Не уверен, что особенного в наличии прямоугольника в kill-ring, но если вы обновитесь до Emacs-24.4, тогда вы можете сделать следующее: C-x SPC .... M-wвыбрать прямоугольник и поместить его в kill-ring. После этого C-yбудет вырвать этот прямоугольник (то же самое, что C-x r yделает, хотя).

Стефан
источник
Есть две вещи в списке убийств, которые являются "особенными". Самым важным (для меня) является способ, которым предметы из кольца убийства выдергиваются. Проще говоря, янки смещает существующий текст вниз, а не вправо. Использование списка уничтожений также имеет дополнительное преимущество - сохранение истории уничтоженного текста. Похоже, что 24.4 может дать второе преимущество, но не первое.
Ниспио
Ах, действительно, в этом случае новое поведение 24.4 улучшает ту часть, которая вас не волнует.
Стефан
1

Сначала я был раздражен отсутствием встроенного решения этой проблемы, затем понял, что существует встроенное решение: kill-rectangle.

Скажем, у вас есть текст, как

AAA BBBBBBBBB
AAA BBB
AAA BBBBBBB

Но вам нужна часть текста «B» где-то еще, например, между этими строками C и D:

CCCCC
CCC
DDDD
DD

Если вы скопируете B rectangle ( C-x r M-w), а затем поместите точку на первую букву «D», а затем восстановите прямоугольник назад ( C-x r y), вы получите

CCCCC
CCC
BBBBBBBBBDDDD
BBB      DD
BBBBBBB  

где вы действительно хотели

CCCCC
CCC
BBBBBBBBB
BBB
BBBBBBB
DDDD
DD

Может показаться естественным скопировать прямоугольник «В» и вернуть их в новое место, но лучшим решением будет просто скопировать строки «А» и «В» и полностью восстановить их между «С» и « D 'линии.

Затем отметьте прямоугольник, содержащий «А», и используйте kill-rectangle( C-x r k), чтобы закончить с желаемым результатом.

Колин Фрейзер
источник