Emacs 为什么';t字体锁定fontify缓冲区在从小型缓冲区工作时是否从elisp工作?

Emacs 为什么';t字体锁定fontify缓冲区在从小型缓冲区工作时是否从elisp工作?,emacs,elisp,Emacs,Elisp,因此,我正在编写一些elisp来测试一个web服务,而我在语法突出显示方面遇到了麻烦。我正在使用url同步检索来获取HTTP响应,然后编辑文本,以获得我需要查看的XML。不幸的是,语法高亮显示在返回的缓冲区中不起作用,即使我已将其设置为nxml模式,并在脚本中使用了“font lock fontify buffer”。但是,如果我使用“M-x字体锁定FontifBuffer”,高亮显示的效果与我预期的一样。在elisp中使用它和从emacs内部使用它有什么区别吗 以下是我正在整理的剧本的相关部分

因此,我正在编写一些elisp来测试一个web服务,而我在语法突出显示方面遇到了麻烦。我正在使用url同步检索来获取HTTP响应,然后编辑文本,以获得我需要查看的XML。不幸的是,语法高亮显示在返回的缓冲区中不起作用,即使我已将其设置为nxml模式,并在脚本中使用了“font lock fontify buffer”。但是,如果我使用“M-x字体锁定FontifBuffer”,高亮显示的效果与我预期的一样。在elisp中使用它和从emacs内部使用它有什么区别吗

以下是我正在整理的剧本的相关部分。我承认这是我做过的第一个elisp脚本,我可能以一种可笑的错误方式做了一些事情,但到目前为止一切都很好

(defun modality-http-request (url args request-type)
    (let ((url-request-method request-type)
        (url-request-extra-headers '(("Content-Type" . "application/x-www-form-urlencoded")))
        (url-request-data
            (mapconcat (lambda (arg)
                (concat  (url-hexify-string (car arg))
                    "="
                    (url-hexify-string (cdr arg))))
                    args
                    "&")))
        (url-retrieve-synchronously url)))

(defun modality-http-get (url args)
    (modality-http-request url args "GET"))

(defun modality-http-post (url args)
    (modality-http-request url args "POST"))

(defun test-modality (test)
    (interactive "s\Test: ")
        (let ((buffer (modality-http-get (concat (get-modality-path) test) nil)))
            (set-buffer buffer)
            (setq modality-beginning (point))
            (forward-paragraph)
            (next-line)
            (beginning-of-line)
            (setq modality-end (point))
            (delete-region modality-beginning modality-end)
            (bf-pretty-print-xml-region)
            (switch-to-buffer buffer)
            (font-lock-fontify-buffer)))

(defun bf-pretty-print-xml-region ()
  "Pretty format XML markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this.  The function inserts linebreaks to separate tags that have
nothing but whitespace between them.  It then indents the markup
by using nxml's indentation rules."
  (interactive "r")
  (save-excursion
      (nxml-mode)
      (goto-char (point-min))
      (while (search-forward-regexp "\>[ \\t]*\<" nil t) 
        (backward-char) (insert "\n"))
      (indent-region (point-min) (point-max))
      ))
(解除模式http请求(url args请求类型)
(let((url请求方法请求类型)
(url请求额外标题“(“内容类型”“应用程序/x-www-form-urlencoded”))
(url)请求数据
(mapconcat(λ(arg)
(concat(url hexify字符串(car arg))
"="
(url hexify字符串(cdr arg)))
args
"&")))
(url同步检索url)))
(定义http get(url参数)
(模态http请求url参数“GET”))
(定义模态http post(url参数)
(模态http请求url参数“POST”))
(defun测试模式(测试)
(交互式“s\Test:”)
(let((缓冲区(模态http get(concat(获取模态路径)测试)nil)))
(设置缓冲区)
(setq模态起点(点))
(前进段)
(下一行)
(行首)
(setq模态结束(点))
(删除区域模态开始模态结束)
(打印xml区域)
(切换到缓冲区)
(字体锁定FontifBuffer)))
(定义打印xml区域()
“区域中的XML标记格式非常好。您需要有nxml模式
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode 安装要做什么
此函数用于将换行符插入到具有
它们之间只有空格,然后缩进标记
通过使用nxml的缩进规则。”
(交互式“r”)
(省去远足
(nxml模式)
(转到字符(最小点))

(while(search forward regexp“\>[\\t]*\URL使用临时/内部缓冲区(通过名称以空格开头这一事实来识别)。它们很普通,但有些函数对它们进行了特殊处理:字体锁不会被激活,缓冲区通常不会显示给用户(例如,C-x b选项卡不会显示这些缓冲区)。
因此,要么在启用字体锁定之前重命名缓冲区,要么将所需文本复制到另一个名称不以空格开头的缓冲区。

通常,您不必手动调用
font-lock-fontify-buffer
,因为它与
字体锁定模式
相同,这(我认为)默认情况下是启用的。不管出于什么原因,它在url retrieve同步创建的缓冲区中不起作用。特别奇怪的是,如果我将缓冲区的内容复制并粘贴到通过访问文件创建的缓冲区中,语法高亮显示会立即生效。一定有一些缓冲区我不了解。缓冲区“动态创建”不会显示在“缓冲区”菜单中,尽管我可以从“缓冲区列表”功能中看到它。这是一个线索,还是我选错了树?我已经删除了超级用户站点上的问题。我的错。这可能是因为这是一个连接到异步进程的缓冲区,即它不包含任何可开始的内容,并且是一个非同步进程当数据到达时,缓冲区会被格式化。我不认为字体锁是用来处理这种情况的。我想你可以添加一个进程过滤器,以在数据到达时听到声音,并确保缓冲区在那时被格式化。就在我读到这个答案之前,我做了第二个。创建一个新的缓冲区并复制到其中效果很好。