Як вибрати непомітні регіони в Emacs?


31

Припустимо, я вже вибрав деякий текст у поточному буфері. Чи можливо вибрати інший фрагмент тексту, зберігаючи попередній вибір (і так далі)?

Додано : Одна мотивація для цієї функціональності така: Припустимо, що у мене є текст, який виглядає приблизно так:

paragraph 1 ...

paragraph 2 ...

paragraph 3 ...

paragraph 4 ...

paragraph 5 ...

Я хотів би видалити деякі абзаци (наприклад, 2, 4 і 6) і вставити їх перед абзацом 1.



2
Є пакет мультиселекцій : skamphausen.de/cgi-bin/ska/multiselect Це схоже на швидкий злом.
Тобіас

Залежно від розміру того, що ви обираєте і чому, multiple-cursorsможе дати вам рішення.
Джордон Біондо

@wasamasa Я дотримувався інструкції, наданої у наданому вами посиланні. Після першого вибору я вибрав другий регіон, у якому зберігався ключ Meta. Він був обраний, але є дві проблеми: (1) другий вибір, здається, не є справжнім вибором, оскільки копіювання чи видалення не спрацьовує. (2) таким способом вибрати третій вибір неможливо.
Ім'я

1
У Вікі Emacs є хороший розділ про вторинний вибір . Наприклад, різні вдосконалення роблять його більш корисним з клавіатури.
Дрю

Відповіді:


43

Ви можете використовувати append-next-kill(зв'язаний C-M-wза замовчуванням) для накопичення тексту, який ви хочете вставити вище paragraph 1:

  1. Вбийте, paragraph 2як зазвичай.

  2. Позначте paragraph 4і натисніть, C-M-wперш ніж вбити. Повторіть цей крок для всіх абзаців, які ви хочете перенести раніше paragraph 1.

Закінчивши, ви можете дістати накопичений текст раніше paragraph 1.


5
Навіть з базовими речами завжди є чомусь новому навчитися! Це дуже корисно, оскільки я зазвичай витрачаю багато натискання клавіш, подорожуючи кільцем убити, коли мені потрібно це зробити. Бажаю, що я міг би підтримати це ще…
Значуще

9

Можна використовувати регістри, поєднані з кільцем марки. Натисніть на поточні позначки 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.


5

Нова підтримка прямокутного регіону в Emacs-24.4 фактично ввела (велику частину) інфраструктуру, необхідну для цієї функціональності [зрештою, прямокутна область - це непомітний регіон].

Отже, тепер має бути можливим реалізувати пакет "розділеного регіону", який забезпечує лише функціонал, про який ви просите.

Правда, багато команд Emacs досі не були пристосовані для використання нової інфраструктури (наприклад, команди, наприклад, upcase-region, або скасувати в регіоні, замінити запити, ...), а отже, ще не працюють належним чином на прямокутники (тож вони не працюватимуть належним чином у "розділеному регіоні"), але це помилки, які, сподіваємось, виправляться з часом.


4

Встановіть браузер-вбити-ring.el

копіюйте і вбивайте всі цікаві регіони.

Перейшов до місця, де слід почати повторну вставку.

M-x browse-kill-ring RET відкриє буфер і помістить курсор у ньому.

Наберіть nдля подорожей.

RET там буде вставлено фрагмент в точку оригіналу / іншого буфера.


3

Якщо лінії, якими ви хочете маніпулювати, можна відрізнити за допомогою регулярного вирівнювання, ви можете скористатися режимом подій, щоб переглянути їх у новому вікні. Потім ви можете скористатися режимом події-редагування для їх редагування, при цьому оригінальний буфер відображає зміни, внесені в буфер Occur.

Це чудово працює, наприклад, у поєднанні з режимом з декількома курсорами : оскільки рядки, які ви вибрали для відображення в буфері Occur, відображаються безперервно, незалежно від того, наскільки вони знаходяться в початковому буфері, ви можете позначити їх усіх або підмножина, а потім активуйте mc/edit-linesта відредагуйте їх усі відразу. (Так, я знаю, що декілька курсорів можуть зробити це все самостійно mc/mark-all-like-this, але приємно мати варіанти.)

Будь-яка інша операція редагування, яку було б легше виконати, якби ви бачили лише ті рядки, над якими хотіли працювати, як-от налаштування складного пошуку і заміни регулярних виразів, або макрос, який потрібно запускати в кожному рядку буфера, також можна зробити так.


3

Це відповідає на ваше загальне запитання, але не особливо на вказаний вами випадок використання (переміщення бітів коду навколо).

Тепер у Emacs є те, що він називає неспорідненим регіоном , що таке вибір, про який ви питаєте. Vanilla Emacs не передбачає особливого способу створення непостійного регіону, за винятком випадків, коли це прямокутник . Але бібліотечні зони так і є.

Зони бібліотеки дозволяють визначати кілька зон у своєму буфері. Список зона є несуміжних областю . Ви також можете розглядати це як кілька регіонів, залежно від того, яким чином ви хочете ним скористатися. Ви можете в будь-який час визначити кілька списків зон, кожен з яких присвоєний іншій змінній зон, і ви можете перемикатися між ними.

Якщо ви також використовуєте бібліотеку Bookmark +, тоді ви можете постійно зберігати списки зон і відновлювати їх у наступних сесіях Emacs. Закладка + також дозволяє призначати закладку довільні теги. Це означає, що ви можете позначити список зон.

Зони в заданому списку зон зазвичай знаходяться в одному буфері, але вони не повинні бути. У цьому перелік зон є загальнішим, ніж непостійний регіон. Більш загальним є те, що кожна зона може містити додаткову інформацію, крім просто обмежених зон, і вона може мати ідентифікатор.

Існує кілька способів створення зони. Одне з найпростіших у використанні C-x n a: воно визначає зону з активної області та додає її до поточного набору зон. ( C-x n n( narrow-to-region) також робить це, крім звуження.)

Ось деякі речі, які ви можете зробити з набором (списком) зон:

  • Сортуйте їх.
  • Об’єднайте (з’єднайте) сусідні або перекриваються зони (що включає їх сортування).
  • Перетинайте їх.
  • Звужте буфер до зони у списку. Цикл серед звужень. Див. Декілька звужень .
  • Виберіть зону зі списку як активну область. Цикл серед регіонів.
  • Шукайте їх (вони спочатку автоматично об’єднуються). Для цього вам потрібна бібліотека Isearch + .
  • Запит на заміну над ними.
  • Виділіть і висвітліть їх. (Для цього вам потрібна бібліотека Highlight або бібліотека facemenu+.el.

Див. Також Вузький непрямий , який дозволяє створювати непрямі буфери, які є клонами даного буфера і звужуються до різних його частин.


2

Інший варіант: Транспонування абзаців

Для повноти ви можете домогтися переупорядкування абзаців (послідовно) з позначеними регіонами і M-0 M-x transpose-paragraph(нульовий аргумент дозволяє tra-parпоміняти місцями пункти, де знаходяться точка і позначка, тобто область починається і закінчується)!

До речі, це працює для всіх transpose-.*команд (-words, -sexp, -sentences, ...) і надзвичайно зручно у багатьох ситуаціях.


2

Інший спосіб - використовувати пакет objed (я автор). Ви можете відзначити будь-який текстовий об'єкт, mколи точка автоматично переміщується до наступного об'єкта поточного типу. Відмітьте позначку будь-якого об’єкта, перейшовши до нього та натисніть m ще раз. Ось приклад скріншоту (показує лінії розмітки, але працює і для інших об'єктів, таких як абзаци, розпуски ...):

введіть тут опис зображення


Коли я намагаюся встановити цей пакет від Melpa, я отримую помилку package-install-from-archive: http://melpa.milkbox.net/packages/objed-20181201.1346.tar: Not found.
Ім'я

@Name Це, здається, потребує оновлення списку пакунків. Спробуйте M-x package-refresh-contentsі тоді M-x package-install.
клемера

@Name Це працює зараз? Повідомте мене, якщо у вас є додаткові запитання.
клемера

Мені вдалося встановити пакет. Здається, працює добре, я не перевірив усіх його особливостей. Дякую.
Ім'я
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.