Как я могу изменить поиск и замену в emacs, чтобы выполнить более сложную задачу?
Всего Emacs Noob здесь. Так что сейчас я работаю над довольно большим LaTeX-проектом в Emacs, в котором есть пара мест, где мне нужно проиндексировать некоторые слова, используя пакет makeidx. Поскольку я также хотел, чтобы индексированные слова были выделены жирным шрифтом, я создал свою собственную команду \ind{}
что сделало бы аргумент смелым и проиндексированным. Но сейчас я недоволен этой командой, поэтому я хотел бы изменить каждый экземпляр \ind{whatever}
в моем тексте \textbf{whatever}\index{whatever by default}
,
Дело в том, что я точно знаю, чего хочу
- Просмотрите текст, найдите любой экземпляр
\ind{
и заменить на\textbf{
с помощьюsearch-and-replace
- Сохранить аргумент
\ind
("что угодно" в этом случае) в памяти - Спросите меня, что пользователь должен аргумент
\index
быть. По умолчанию (нажав Enter) это должен быть первый аргумент, но я также могу передумать и ввести что-то другое ("по умолчанию" в данном случае). Если нет ввода (только пробел" "
например) остановить программу. - Записывать
\index{
, новый аргумент и}
, - Перейти к следующему вхождению в тексте.
Но, увы! Я не знаю, как этого добиться, поэтому мне нужна чья-то помощь. Если объяснение того, как это сделать, займет слишком много времени, не могли бы вы выслать мне учебник о написании моих собственных функций?
Я надеюсь, что я проясняюсь, и спасибо за ваше терпение!
3 ответа
Этот подход кажется мне неординарным, но он работает и кажется достаточным для разовой работы...
В тексте замены для replace-regexp
а также query-replace-regexp
(CM-%), одна более новая escape-последовательность \,(...)
, где ...
может быть любым выражением Lisp. Есть функция Lisp read-from-minibuffer
который читает произвольный текст, набранный пользователем, с необязательным значением по умолчанию. Следовательно:
CM-%: старт query-replace-regexp
,
\\ind{\([^}]+?\)}
: Шаблон для поиска.
\\textbf{\1}\\index{\,(read-from-minibuffer "index content? " \1)}
: Текст замены. Пользователю будет предложено ввести текст в фигурные скобки после \index{}
элемент, используя оригинальный текст между фигурными скобками после \ind{}
элемент по умолчанию.
Обратите внимание, что при использовании query-replace-regexp
, вам придется подтвердить каждый выбор, набирая y после каждого. Используйте Mx replace-regexp, если вы хотите избежать этого шага.
Почему бы просто не переопределить \ind
чтобы он мог получить необязательный аргумент?
Например:
\newcommand{\ind}[2][]{%
\def\first{#1}%
\ifx\first\empty
\textbf{#2}\index{#2}%
\else
\textbf{#2}\index{#1}%
\fi
}
Таким образом, вы можете использовать \ind{whatever}
или же \ind[whatever-else]{whatever}
,
Влад даст вам ответ LaTeX на вашу проблему. Решением Emacs является макрос-ключ: начните с
C-x (
чтобы определить новый макрос, затем сделайте один шаг вашего изменения, скажем:
C-s \ind{
<left>ex
Затем скопируйте и вставьте аргумент в \textbf
макрос... Вы должны быть осторожны, чтобы двигаться так, чтобы это можно было повторить. Как только стандартная модификация сделана, вы позволяете курсору после whatever by default
и закончить определение
C-x )
сейчас C-x e
вызовет макрос, который вы только что определили, поместив курсор в нужное место, чтобы изменить деталь, которую вы хотите изменить. Вы также можете повторить e
вызывать макрос несколько раз одновременно.