Как я могу изменить поиск и замену в emacs, чтобы выполнить более сложную задачу?

Всего 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 ответа

Решение

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

В тексте замены для 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 вызывать макрос несколько раз одновременно.

Другие вопросы по тегам