У мене часто виникає ситуація, коли мені потрібно застосувати текст по всьому регіону. Для HTML і простих випадків бібліотеки для цього вже є. А як щодо загального випадку? Мені хотілося б запитати, що я вставлю початок і кінець регіону.
У мене часто виникає ситуація, коли мені потрібно застосувати текст по всьому регіону. Для HTML і простих випадків бібліотеки для цього вже є. А як щодо загального випадку? Мені хотілося б запитати, що я вставлю початок і кінець регіону.
Відповіді:
Я погукав і знайшов цю посаду Джона Д. Кука . Він демонструє, як побудувати просту інтерактивну функцію, щоб легко отримати теги 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"
працювала більш надійно?
Я б запропонував інший підхід. Коли є регіон, за визначенням він point
повинен бути на початку (або в кінці) регіону, і mark
буде в кінці (або початку). Що означає, що ви можете ввести потрібний текст у точці, а потім скористатися exchange-point-and-mark
, тобто C-x C-x
перейти на інший кінець регіону. Введіть другу половину вашої обгортки і закінчите.
Ви не отримуєте явного запиту на текст вставки, але я не можу уявити, що існує спосіб досягти тієї самої речі з меншими зусиллями.
multiple-cursors
можна було б налаштувати щось подібне, щоб вставити текст одночасно на початку та в кінці активної області.
C-x C-x
. Зі своєю відповіддю вам потрібно зателефонувати у вашу функцію ( C-c something
), а також потрібно натиснути return
після кожного запису. Отже, що б ви не робили, у вас є ще два натискання клавіш. Однак це не допомагає, якщо ви хочете щось зателефонувати з Elisp.
Просто заради різноманітності:
Іншим способом зробити це з деяким довільним початковим і кінцевим текстом буде використання replace-regexp
в регіоні: відповідність .+
і заміна before \& after
, або будь-який текст, який ви хочете використовувати для before
і after
.
Ви можете написати команду виконувати це, але я думаю про випадок, коли в заданому файлі ви хочете застосувати один і той же текст початку / кінця в кількох місцях. Ви можете записати макрос або просто використовувати історію мінібуфера для повторення в іншому регіоні.
Звичайно, якщо текст, який ви хочете обернути, можна виразити як регулярний вираз, тоді вам навіть не потрібно буде обрати область і можна робити query-replace-regexp
буфер, але, мабуть, текст, який ви хочете обернути, не є таким послідовним.
<?php
...?>
, а потім, вибираючи область та тип<?php
(або палітурку клавіш), закріпіть її в парі. Але afaik не існує простого способу користування цими бібліотеками, якщо у вас є багато одноразових пар.