Як обернути даний текст по регіону


11

У мене часто виникає ситуація, коли мені потрібно застосувати текст по всьому регіону. Для HTML і простих випадків бібліотеки для цього вже є. А як щодо загального випадку? Мені хотілося б запитати, що я вставлю початок і кінець регіону.


Ви хочете скористатися ним, щоб вставити довільний вміст один раз, або ж кілька пар, багато разів? В останньому випадку такі бібліотеки, як smartparens, можуть виявитися корисними, і їх можна поширити за допомогою спеціальних пар. Наприклад, ви можете додати пару <?php... ?>, а потім, вибираючи область та тип <?php(або палітурку клавіш), закріпіть її в парі. Але afaik не існує простого способу користування цими бібліотеками, якщо у вас є багато одноразових пар.
Т. Веррон

@ T.Verron: Я знаю, що вони існують. Але для тих моментів, коли є унікальна потреба пройти код та позначити речі, найкраще підходить одна загальна, багаторазова функція
nperson325681

Відповіді:


6

Я погукав і знайшов цю посаду Джона Д. Кука . Він демонструє, як побудувати просту інтерактивну функцію, щоб легко отримати теги HTML / XML по регіону. З цього я змінив функцію запитувати двічі.

(defun tag-word-or-region (text-begin text-end)
  "Surround current word or region with given text."
  (interactive "sStart tag: \nsEnd tag: ")
  (let (pos1 pos2 bds)
    (if (and transient-mark-mode mark-active)
        (progn
          (goto-char (region-end))
          (insert text-end)
          (goto-char (region-beginning))
          (insert text-begin))
      (progn
        (setq bds (bounds-of-thing-at-point 'symbol))
        (goto-char (cdr bds))
        (insert text-end)
        (goto-char (car bds))
        (insert text-begin)))))

Що ще важливіше, ця функція може бути використана і як допоміжний інструмент, наприклад, коли ви хочете прив’язати клавіші для відображення певних бітів тексту.

(defun tag-php ()
  (interactive)
  (tag-word-or-region "<?php " "?>"))

До речі, спосіб обробки цих крайових випадків не є оптимальним; пошук початку може часом провалюватися, і обидва теги залиште в кінці. Можливо evil, я використовую тут втручання. Можливо, функція типу interactive "r" працювала більш надійно?
nperson325681

4

Я б запропонував інший підхід. Коли є регіон, за визначенням він pointповинен бути на початку (або в кінці) регіону, і markбуде в кінці (або початку). Що означає, що ви можете ввести потрібний текст у точці, а потім скористатися exchange-point-and-mark, тобто C-x C-xперейти на інший кінець регіону. Введіть другу половину вашої обгортки і закінчите.

Ви не отримуєте явного запиту на текст вставки, але я не можу уявити, що існує спосіб досягти тієї самої речі з меншими зусиллями.


Якщо текст початку та кінця однаковий, мені цікаво, чи multiple-cursorsможна було б налаштувати щось подібне, щоб вставити текст одночасно на початку та в кінці активної області.
глюкас

Це звучить як ручний спосіб, який користувачі менших редакторів змушені робити. У будь-якому разі я читаю використання макросів як підтексту з вашої відповіді. Мені подобається твій стиль
nperson325681

1
@progo - Спасибі :) Це звучить як більш ручний підхід, але він фактично використовує менше натискань клавіш, ніж ваша альтернатива. При такому підході, крім обгорткового тексту, вам потрібно лише C-x C-x. Зі своєю відповіддю вам потрібно зателефонувати у вашу функцію ( C-c something), а також потрібно натиснути returnпісля кожного запису. Отже, що б ви не робили, у вас є ще два натискання клавіш. Однак це не допомагає, якщо ви хочете щось зателефонувати з Elisp.
Тайлер

3

Просто заради різноманітності:

Іншим способом зробити це з деяким довільним початковим і кінцевим текстом буде використання replace-regexpв регіоні: відповідність .+і заміна before \& after, або будь-який текст, який ви хочете використовувати для beforeі after.

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

Звичайно, якщо текст, який ви хочете обернути, можна виразити як регулярний вираз, тоді вам навіть не потрібно буде обрати область і можна робити query-replace-regexpбуфер, але, мабуть, текст, який ви хочете обернути, не є таким послідовним.

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