如何修改emacs的“搜索和替换”以执行更复杂的任务?

时间:2011-03-21 00:40:37

标签: emacs latex auctex

总共有Emacs noob。所以现在我正在研究Emacs中一个相当大的LaTeX项目,其中有几个地方我需要使用makeidx包索引一些单词。因为我还希望索引的单词是粗体,所以我创建了自己的命令\ind{},这将使参数变为粗体并编入索引。但是现在我对这个命令不满意,所以我想在\ind{whatever}的文本中更改\textbf{whatever}\index{whatever by default}的每个实例。

事情是我确切地知道我想要什么:

  1. 浏览文字,查找\ind{的任何实例,并使用\textbf{
  2. 替换为search-and-replace
  3. 在内存中保存\ind(本例中为“不论”)的参数
  4. 询问用户\index的论点应该是什么。默认情况下(通过敲击回车),它应该是第一个参数,但我也可以改变主意并输入不同的东西(在这种情况下,“默认为”)。如果没有输入(例如只有空格" ")则停止程序。
  5. 记下\index{,新参数和}
  6. 转到文中的下一个出现。
  7. 但是,唉!我不知道怎么做到这一点,所以我需要别人的帮助。如果要花太多时间来解释如何做这样的事情,请你给我发一些关于编写自己的函数的教程吗?

    我希望我很清楚,感谢您的耐心等待!

3 个答案:

答案 0 :(得分:6)

这种做法对我来说似乎过于模糊,但是对于一次性的工作而言,这种做法似乎已经足够......

replace-regexpquery-replace-regexp CM - %)的替换文字中,一个较新的转义序列为\,(...),其中...可以是任何Lisp表达。有一个Lisp函数read-from-minibuffer,它读取用户输入的任意文本,并带有可选的默认值。因此:

C-M - %:开始query-replace-regexp

\\ind{\([^}]+?\)}:要搜索的模式。

\\textbf{\1}\\index{\,(read-from-minibuffer "index content? " \1)}:替换文字。系统将提示用户将文本放在\index{}元素后面的大括号中,并使用\ind{}元素后面的大括号之间的原始文本作为默认值。

请注意,使用query-replace-regexp时,您必须在每次选择后输入 y 来确认每项选择。如果您想避免这一步,请使用 M-x replace-regexp

答案 1 :(得分:3)

为什么不重新定义\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}

答案 2 :(得分:3)

Vlad给你LaTeX解答你的问题。 Emacs解决方案是关键宏:从

开始
C-x (

定义一个新宏,然后执行更改的一个步骤,比如说:

C-s \ind{
<left>ex

然后将参数复制并粘贴到\textbf宏中......您必须小心以可重复的方式移动。完成标准修改后,将光标放在whatever by default之后,并通过

结束定义
C-x )

现在C-x e将调用您刚定义的宏,让光标位于正确的位置以更改要更改的部分您还可以重复e一次多次调用宏