Как я могу изменить поиск и замену в emacs, чтобы выполнить более сложную задачу? - PullRequest
2 голосов
/ 21 марта 2011

всего Emacs Noob здесь.Итак, сейчас я работаю над довольно большим LaTeX-проектом в Emacs, в котором есть пара мест, где мне нужно проиндексировать некоторые слова, используя пакет makeidx.Поскольку я также хотел, чтобы индексированные слова были выделены жирным шрифтом, я создал собственную команду \ind{}, которая заставила бы аргумент выделяться жирным шрифтом и индексироваться.Но сейчас я недоволен этой командой, поэтому я хотел бы изменить каждый экземпляр \ind{whatever} в моем тексте на \textbf{whatever}\index{whatever by default}.

Дело в том, что я точно знаю, чего хочу:

  1. Просмотрите текст, найдите любой экземпляр \ind{ и замените на \textbf{, используя search-and-replace
  2. Сохраните аргумент \ind (в данном случае «что угодно»)в памяти
  3. Спросите пользователя, каким должен быть аргумент \index.По умолчанию (нажав Enter), это должен быть первый аргумент, но я также могу изменить свое мнение и ввести что-то другое («по умолчанию» в данном случае).Если нет ввода (например, только пробел " "), остановите программу.
  4. Запишите \index{, новый аргумент и }.
  5. Перейти к следующему вхождению втекст.

Но, увы! Я не знаю, как этого добиться, поэтому мне нужна чья-то помощь.Если объяснение того, как это сделать, займет слишком много времени, не могли бы вы прислать мне какое-нибудь руководство по написанию моих собственных функций?

Надеюсь, я прояснил ситуацию, и спасибо за ваше терпение!

Ответы [ 3 ]

6 голосов
/ 21 марта 2011

Мне кажется, что такой подход не совсем обычен, но он работает и кажется достаточным для разовой работы ...

В тексте замены для 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 , если вы хотите избежать этого шага.

3 голосов
/ 21 марта 2011

Влад даст вам ответ LaTeX на вашу проблему.Решением Emacs является ключ-макрос: начните с

C-x (

, чтобы определить новый макрос, затем сделайте один шаг вашего изменения, скажем:

C-s \ind{
<left>ex

Затем скопируйте и вставьтеаргумент в макросе \textbf ... Вы должны быть осторожны, чтобы двигаться так, чтобы это можно было повторить.Как только стандартная модификация будет завершена, вы поместите курсор после whatever by default и завершите определение с помощью

C-x )

now C-x e вызовет макрос, который вы только что определили, позволяя вашему курсору в правильном местеизменить часть, которую вы хотите изменить Вы можете также повторить e, чтобы вызвать макрос несколько раз одновременно.

3 голосов
/ 21 марта 2011

Почему бы просто не переопределить \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}.

...