Это отвечает на ваш общий вопрос, но не особенно на тот случай использования, который вы упомянули (перемещение фрагментов кода).
Emacs теперь имеет то, что он называет несмежным регионом , и это тот тип выбора, о котором вы спрашиваете. Vanilla Emacs не предоставляет какого-либо специального способа создания несмежной области, кроме случаев, когда это прямоугольник . Но библиотека Zones делает.
Библиотечные зоны позволяют вам определять несколько зон в буфере. Список зона является несмежной областью . Вы также можете думать о нем как о нескольких регионах, в зависимости от того, как вы хотите его использовать. Вы можете иметь несколько списков зон, определенных в любое время, каждый из которых назначен разной переменной зоны, и вы можете переключаться между ними.
Если вы также используете библиотеку Bookmark +, то вы можете постоянно сохранять списки зон и восстанавливать их в последующих сеансах Emacs. Bookmark + также позволяет назначать произвольные теги для закладки. Это означает, что вы можете пометить список зон.
Зоны в данном списке зон обычно находятся в одном буфере, но это не обязательно. При этом список зон является более общим, чем несмежный регион. Кроме того, оно более общее в том смысле, что каждая зона может содержать дополнительную информацию, помимо пределов зоны, и может иметь идентификатор.
Есть несколько способов создать зону. Одним из самых простых является использование C-x n a
: он определяет зону из активной области и добавляет ее в текущий набор зон. ( C-x n n
( narrow-to-region
) также делает это, в дополнение к сужению.)
Вот некоторые вещи, которые вы можете сделать с помощью набора (списка) зон:
- Сортировать их.
- Объединить (объединить) смежные или перекрывающиеся зоны (что включает их сортировку).
- Пересечь их.
- Сузьте буфер до зоны в списке. Цикл среди сужений. Смотрите несколько сужений .
- Выберите зону в списке в качестве активной области. Цикл среди регионов.
- Поиск их (они автоматически объединяются в первую очередь). Для этого вам понадобится библиотека Isearch + .
- Запросить-заменить их.
- Выделите и не выделите их. (Для этого вам нужна библиотека Highlight или библиотека
facemenu+.el
.
Смотрите также Narrow Indirect , который позволяет создавать косвенные буферы, которые являются клонами данного буфера и сужены к различным его частям.