В буфере Emacs Lisp не работает режим блокировки шрифтов, пока пользователь не откроет - PullRequest
1 голос
/ 24 марта 2010

Моя проблема в том, что я открываю буфер с помощью (set-buffer (find-tag-noselect (current-word))), а затем пытаюсь скопировать некоторый текст из этого буфера. Текст, который я получаю, имеет только свойства (fontified nil). find-tag-noselect автоматически открывает буфер, найденный в файле TAGS, но, похоже, он не запускает режим блокировки шрифтов над ним. Когда я вручную переключаюсь на этот буфер после того, как он был открыт, а затем снова запускаю функцию, когда он копирует текст, к нему присоединяются все правильные свойства текста. Итак, что мне нужно сделать, чтобы этот буфер был полностью инициализирован, чтобы в него была скопирована правильная подсветка синтаксиса?

(defvar newline-string "
")

(defun get-initial-indent-regexp-python()
  "Gets the initial amount of spaces for the function we are looking at, does not account for tabs"
  (concat "^" (get-current-indent-string) (concat "[^ #" newline-string "]")))


(defun get-end-of-function-python(spaces-regex)
  "Gets the point at the end of a python block"
  (save-excursion
    (forward-line 1)
    (while (and (not (looking-at spaces-regex)) (equal (forward-line 1) 0)))
    (point)))

(defun get-point-at-end-of-function ()
  "This might be better served checking the major mode."
  (setq extension (file-name-extension (buffer-file-name)))
  (if (equal extension "py")
      (get-end-of-function-python (get-initial-indent-regexp-python))))
(defun inline-function ()
  "Must change to overlays, be able to toggle visibility"
  (interactive)
  (let (text indent-string)
                    ; clean all overlays without attached buffer
    (save-excursion
      (set-buffer (find-tag-noselect (current-word)))
      (setq text (buffer-substring (point) (get-point-at-end-of-function))))

    (setq text (concat newline-string text))
    (save-excursion
      (move-end-of-line nil)
      (let (overlay)
    (setq overlay (make-overlay (point) (+ (point) 1) (current-buffer)))
    (overlay-put overlay 'display text)
    (setq inline-func-overlays (cons overlay inline-func-overlays))))))

Ответы [ 3 ]

2 голосов
/ 06 марта 2012

То, что происходит, заключается в том, что блокировка шрифта выполняется на лету, так что только отображаемые части буфера становятся «осознанными». Если вы хотите / должны отменить эту оптимизацию, вам потребуются разные функции в зависимости от обстоятельств (в зависимости от того, как настроена блокировка шрифтов). Мы должны добавить новую функцию font-lock-sure-fontified для этого, но пока вы можете взять ps-print-.el в качестве примера:

(defun ps-print-ensure-fontified (start end)
  (cond ((and (boundp 'jit-lock-mode) (symbol-value 'jit-lock-mode))
     (jit-lock-fontify-now start end))
    ((and (boundp 'lazy-lock-mode) (symbol-value 'lazy-lock-mode))
     (lazy-lock-fontify-region start end))))
0 голосов
/ 24 марта 2010

Попробуйте явно вызвать 'font-lock-fontify-buffer'.

0 голосов
/ 24 марта 2010

Я не совсем уверен, что вы пытаетесь сделать, но set-buffer не отображает буфер, поэтому его действие заканчивается, когда завершается текущая команда. Обычно это полезно только для временных переключателей буфера внутри функции, и я полагаю, что по этой причине он не запускает font-lock в буфере. Когда вы вручную переходите в буфер, вы, вероятно, используете другую функцию - switch-to-buffer.

...