Предположим, что я уже выделил некоторый текст в текущем буфере. Можно ли выбрать другой фрагмент текста, сохранив предыдущий выбор (и т. Д.)?
Добавлено : одна из причин для этой функции заключается в следующем: Предположим, у меня есть текст, который выглядит следующим образом:
paragraph 1 ...
paragraph 2 ...
paragraph 3 ...
paragraph 4 ...
paragraph 5 ...
Я хотел бы удалить некоторые пункты (например, 2, 4 и 6) и вставить их перед пунктом 1.
multiple-cursors
может дать вам решение.Ответы:
Вы можете использовать
append-next-kill
(привязано кC-M-w
по умолчанию) для накопления текста, который вы хотите вставить вышеparagraph 1
:Убей
paragraph 2
как обычно.Отметьте
paragraph 4
и нажмите,C-M-w
прежде чем убить его. Повторите этот шаг для всех абзацев, которые вы хотели бы переместить раньшеparagraph 1
.Когда вы закончите, вы можете восстановить накопленный текст раньше
paragraph 1
.источник
Вы можете использовать регистры в сочетании с кольцом меток. Нажмите текущие отметки с помощью
C-<SPC> C-<SPC>
, восстановите их позже с помощьюC-u C-<SPC>
или сохраните их в регистре, скажемb
, с помощьюC-x r <SPC> b
, и вернитесь позже с помощьюC-x r j b
.Теперь отметьте другой регион.
C-u C-x r s a
скопирует отмеченный регион для регистрацииa
и удалит текст. Затем отметьте следующий регион иC-u C-x r + a
добавьте другой выбор в этот регистрa
и удалите его.Затем вы можете вставить содержимое с помощью
C-x r i a
.Смотрите раздел "Сохранение текста в регистрах" руководства Emacs.
источник
Новая поддержка прямоугольной области в Emacs-24.4 фактически представила (большую часть) инфраструктуру, необходимую для этой функциональности [в конце концов, прямоугольная область является несмежной областью].
Таким образом, теперь должна быть возможность реализовать пакет «split-region», который предоставляет только те функции, которые вы запрашиваете.
Следует признать, что многие команды Emacs до сих пор не адаптированы для использования новой инфраструктуры (например, такие команды, как upcase-region или undo-in-region, query-replace, ...) и, следовательно, еще не работают должным образом с прямоугольниками (поэтому они также не будут работать должным образом в «разделенной области»), но это ошибки, которые, мы надеемся, со временем исправятся.
источник
Установите browse-kill-ring.el
копировать и убивать все области интересов.
Добрался до точки, где должна начаться повторная вставка
M-x
browse-kill-ring
RET откроет буфер и поместит в него курсор.Типа nпутешествовать кусками.
RET там будет вставлен кусок в точку в оригинальный / другой буфер.
источник
Если строки, которыми вы хотите манипулировать, можно различить с помощью соответствия регулярному выражению, вы можете использовать происходит с режимом отображения, чтобы просмотреть их в новом окне. Затем вы можете использовать происходит-режим редактирования для редактирования их с исходным буфером , отражающий изменения , которые вы делаете в Произойти буфере.
Это прекрасно работает, например, в сочетании с режимом нескольких курсоров : поскольку строки, выбранные вами для отображения в буфере Occur, отображаются непрерывно, независимо от того, как далеко они находятся в исходном буфере, вы можете пометить их все или подмножество, а затем активировать
mc/edit-lines
и редактировать их все сразу. (Да, я знаю, что множественные курсоры могут делать все это самостоятельноmc/mark-all-like-this
, но приятно иметь варианты.)Любая другая операция редактирования, которую было бы легче выполнить, если бы вы видели только те строки, над которыми вы хотели работать, например, настройка сложного поиска и замены регулярных выражений или макрос, который должен выполняться по очереди в каждой строке буфера, также может быть сделано таким образом.
источник
Это отвечает на ваш общий вопрос, но не особенно на тот случай использования, который вы упомянули (перемещение фрагментов кода).
Emacs теперь имеет то, что он называет несмежным регионом , и это тот тип выбора, о котором вы спрашиваете. Vanilla Emacs не предоставляет какого-либо специального способа создания несмежной области, кроме случаев, когда это прямоугольник . Но библиотека Zones делает.
Библиотечные зоны позволяют вам определять несколько зон в буфере. Список зона является несмежной областью . Вы также можете думать о нем как о нескольких регионах, в зависимости от того, как вы хотите его использовать. Вы можете иметь несколько списков зон, определенных в любое время, каждый из которых назначен разной переменной зоны, и вы можете переключаться между ними.
Если вы также используете библиотеку Bookmark +, то вы можете постоянно сохранять списки зон и восстанавливать их в последующих сеансах Emacs. Bookmark + также позволяет назначать произвольные теги для закладки. Это означает, что вы можете пометить список зон.
Зоны в данном списке зон обычно находятся в одном буфере, но это не обязательно. При этом список зон является более общим, чем несмежный регион. Кроме того, оно более общее в том смысле, что каждая зона может содержать дополнительную информацию, помимо пределов зоны, и может иметь идентификатор.
Есть несколько способов создать зону. Одним из самых простых является использование
C-x n a
: он определяет зону из активной области и добавляет ее в текущий набор зон. (C-x n n
(narrow-to-region
) также делает это, в дополнение к сужению.)Вот некоторые вещи, которые вы можете сделать с помощью набора (списка) зон:
facemenu+.el
.Смотрите также Narrow Indirect , который позволяет создавать косвенные буферы, которые являются клонами данного буфера и сужены к различным его частям.
источник
Другой вариант: перенос абзацев
Для полноты картины вы можете добиться переупорядочения абзацев (последовательно) с отмеченными областями и
M-0 M-x transpose-paragraph
(нулевой аргумент заставляетtra-par
поменять параграфы, в которых находятся точка и метка, т.е. область начинается и заканчивается)!Кстати, это работает для всех
transpose-.*
команд (-words, -sexp, -sentences, ...) и очень удобно во многих ситуациях.источник
Другой способ - использовать пакет objed (я автор). Вы можете пометить любой текстовый объект так,
m
чтобы точка автоматически перемещалась к следующему объекту текущего типа. Снимите пометку с любого объекта, перейдя к нему, и снова нажмите m. Вот пример скриншота (показывает разметку линий, но работает и для других объектов, таких как абзацы, определения функций ... также):источник
package-install-from-archive: http://melpa.milkbox.net/packages/objed-20181201.1346.tar: Not found
.M-x package-refresh-contents
и тогдаM-x package-install
.