如何将latexmk绑定到Emacs中的一个键,并让它在出现任何错误时显示错误

如何将latexmk绑定到Emacs中的一个键,并让它在出现任何错误时显示错误,emacs,auctex,latexmk,Emacs,Auctex,Latexmk,我正在使用AUCTeX,我想绑定一个密钥,例如,C-0,该密钥执行以下操作: 保存活动文件而不提示我 在活动文件上运行latexmk,而不提示我 如果latexmk遇到任何错误,则显示错误 我的问题不是如何绑定一个键(Tyler在下面的评论中发布了一个链接),而是如何找到一个函数来完成第1-3项 我顺便打电话给Latexmk (添加钩子的乳胶模式钩子(lambda() (推 “(“Latexmk”“Latexmk%s”TeX运行TeX nil t” :help“在文件上运行Latexmk”)

我正在使用AUCTeX,我想绑定一个密钥,例如,
C-0
,该密钥执行以下操作:

  • 保存活动文件而不提示我
  • 在活动文件上运行
    latexmk
    ,而不提示我
  • 如果
    latexmk
    遇到任何错误,则显示错误
  • 我的问题不是如何绑定一个键(Tyler在下面的评论中发布了一个链接),而是如何找到一个函数来完成第1-3项


    我顺便打电话给Latexmk

    (添加钩子的乳胶模式钩子(lambda()
    (推
    “(“Latexmk”“Latexmk%s”TeX运行TeX nil t”
    :help“在文件上运行Latexmk”)
    TeX命令列表)
    
    这是我最新的KRC

    $pdf_mode = 1;
    $recorder = 1;
    $latex = 'latex -recorder -halt-on-error -interaction=nonstopmode -shell-escape';
    $pdflatex = 'pdflatex -recorder -halt-on-error -interaction=nonstopmode -shell-escape';
    

    我使用的是Emacs 23.3和AUCTeX 11.86。

    这是否符合您的要求

    (取消我的tex()
    保存当前缓冲区并运行LaTeX,所有操作都没有提示或进一步的交互
    (互动)
    (保存缓冲区)
    (TeX命令“LaTeX”'TeX主文件-1))
    
    我不使用latexmk,但为了实现这一点,您只需在
    TeX命令列表
    (可能只是“latexmk”或“latexmk”)中为latexmk使用的名称字符串切换字符串“LaTeX”


    我很高兴你这么问,因为这对我现在很有用

    假设您已经使用中的答案将
    latexmk
    添加到AUCTeX的命令列表中,您可以使用以下功能:

    (defun运行latexmk()
    (互动)
    (保存缓冲区)
    (TeX命令“Latexmk”'TeX主文件0)
    (如果(plist get TeX错误报告开关(intern(TeX主文件)))
    (下一个错误);;0->取消确认
    
    并使用任何关键绑定技术将其绑定到
    C-0
    ;这里有一个是TeX模式的本地版本:

    (定义按键TeX模式映射(kbd“C-0”)“运行latexmk”
    
    runlatexmk
    功能基于挖掘
    TeX命令主机
    ,并根据您的需要对其进行简化。请注意,对
    (下一个错误)
    的调用可能并不总是发生,因为LaTeX可能会被错误弄糊涂,并暂停等待输入,类似这样的情况

    (需要“tex buf”)
    (defun运行latexmk()
    (互动)
    (let((TeX保存查询nil)
    (TeX进程异步零)
    (主文件(TeX主文件)))
    (TeX保存文档“”)
    (TeX运行TeX“latexmk”“latexmk”主文件)
    (如果(plist get TeX错误报告开关(实习生主文件))
    (TeX下一个错误t)
    (小缓冲区消息“latexmk done”))
    (添加挂钩“乳胶模式挂钩”
    (lambda()(本地设置键(kbd“C-0”)#“run-latexmk)))
    
    编辑
    TeX save document
    保存您的主文件和任何子文件(如果您只有一个文件,它就是您的主文件),并且当
    TeX save query
    为零时,它不会要求您确认。然后,
    TeX run TeX
    使用通常用于运行
    TeX
    的机制运行latexmk,该机制包括错误消息解析,但由于它通常启动异步进程,因此我们将
    TeX process asynchronous
    设置为nil以等待它结束。奇怪的
    plist get
    表单是检查
    TeX run TeX
    中错误的文档化方法(参见
    TeX buf.el
    中的注释),如果有错误,我们跳到第一个;如果没有错误,我们在迷你缓冲区中显示一条消息只是为了好玩


    最后,
    本地设置键
    是将键绑定到函数的一种方法。

    您要求的功能与默认AucTex包中已有的功能非常接近。您可以从以下问题开始:哪个将为您排序latexmk,然后在必要时调整它,以获得您想要的特定行为。@Tyler谢谢。如何将这样的命令绑定到密钥?如果您按照第一个答案进行操作,
    C-C-C
    应该使用latexmk编译您的tex文件(您可能需要更改配置文件以使latexmk作为默认值弹出,但AucTex通常知道该做什么)。实际运行的命令是
    TeX command master
    ,您可以使用通常的方法绑定它:@Tyler
    C-C-C
    即使是默认命令,仍然会提示我。在我得到“作为变量的符号值为void:TeX mode map”时,有一个后续问题当我尝试键绑定时,即使我在加载后将其包装为“tex”。当我尝试运行latexmk时,我也会得到“tex命令扩展:错误类型参数:stringp,nil”。@N.N.我承认我实际上并没有从键绑定运行它,而只是
    M-x运行latexmk
    ,这对我很有效。。。不过,现在试试看,我看不出你会犯什么错误。您可以通过将
    定义键
    包装为
    (添加钩子的乳胶模式钩子(lambda()(定义键…)来修复“符号值…”错误
    ,这确保您处于LaTeX模式。我可以重现TeX命令扩展错误,但只有在我直接调用它时,上面的代码才不会…使用模式挂钩是解决了这两个问题,还是只解决了一个问题?模式挂钩修复了键绑定,但运行latexmk仍然返回“错误类型参数:stringp,nil”。我已使用有关设置的信息更新了我的问题(如果有)。我确实满足列表中的第1项和第2项。如果有错误,我希望有一个显示错误的窗口。我正在使用pdflatex的
    -interaction=nonstopmode
    ,因此我只希望看到它停止时出现的错误。抱歉,我不知道XMK是如何工作的,所以我不确定要去哪里。你激发了我去研究让Auctex来代替latexmk的想法——应该可以让Auctex计算出在不必不断点击C-C-C的情况下运行pdflatex和bibtex的次数。不过这需要更多的时间来探索。这与我一直在调整的内容非常接近。但至少在我的系统上是这样的(windows框),LaTeX异步运行,因此
    (plist get…)