Почему font-lock-fontify-buffer не работает от elisp, когда он работает из минибуфера? - PullRequest
2 голосов
/ 03 февраля 2012

Итак, я взломал некоторые тесты для тестирования веб-службы и столкнулся с проблемой подсветки синтаксиса.Я использую url-retrieve-синхронно, чтобы получить HTTP-ответ, а затем редактирую текст, чтобы получить только тот XML, который мне нужен.К сожалению, подсветка синтаксиса не работает в возвращаемом буфере, хотя я установил его в nxml-mode и использовал «font-lock-fontify-buffer» в скрипте.Однако, если я сделаю «Mx font-lock-fontify-buffer», подсветка будет работать так, как я ожидал.Есть ли какая-то разница между использованием его в 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))
      ))

1 Ответ

1 голос
/ 03 февраля 2012

URL использует временные / внутренние буферы (распознается тем, что их имя начинается с пробела). Они обычные, но некоторые функции обрабатывают их специально: блокировка шрифта не будет активирована, и буфер обычно не будет показан пользователю (например, C-x b TAB не будет показывать эти буферы) Поэтому переименуйте буфер перед включением блокировки шрифтов или скопируйте нужный текст в другой буфер, имя которого не начинается с пробела.

...