2013-09-22 3 views
1

Следующий код не выделяет 23 в 23-23, если вставлен и оценен в буфере нуля, но не выполняется в текстовом буфере.граница слова в символах блокировки шрифтов Emacs

;; Example 1 


'(1234 23 23-23 end) 

(progn 
    (font-lock-add-keywords nil 
          `(("\\b23\\b" 
          (0 'success)) 
          "end")) 
    (font-lock-fontify-buffer)) 

Почему терпят неудачу, когда M-x isearch-forward-regexp RET \b23\b все еще соответствует 23 «S в 23-23?

Даже если я перехожу к следующему коду, выделяется только первый 23 в 23-23.

;;; Example 2 

'(1234 23 23-23 end) 

(progn 
    (font-lock-add-keywords nil 
          `((,(rx (or word-boundary 
             "-") 
            (group "23") 
            (or word-boundary 
             "-")) 
          (1 'success)) 
          "end")) 
    (font-lock-fontify-buffer)) 

Сторона примечания: «конец» есть, чтобы я мог определить, плохо ли сформирован маркер для 23. Если он плохо сформирован или сигнализирует об ошибках, конец не будет подсвечиваться.


;;; Example 3 (with xy instead of 23. also passing t and 'append.) 
;;; if evaluated in the scratch buffer, it doesn't highlight xy in xy-xy 

'(wxyz xy xy-xy end) 

(progn 
    (font-lock-add-keywords nil 
          `(("\\bxy\\b" 
          (0 'success t)) 
          "end") 
          'append) 
    (font-lock-fontify-buffer)) 
+0

Режимы могут определять свои собственные графические объекты, где значение символа может быть определено по-разному (присвоено другому классу символов). В частности, символы, такие как дефисы, символы подчеркивания, знак сигила (те, которые несколько раз считаются составляющими слова, а иногда и нет), могут быть изменены локально. Вероятно, вам следует изучить локальный графический режим и посмотреть, какой класс sytnax назначен этому символу. –

+0

@wvxvw 'M-x описать-синтаксис' говорит, что класс синтаксиса для дефиса ASCII - это класс символа как в режиме lisp-взаимодействия (буфера нуля), так и в текстовом режиме в' emacs -Q'. –

+0

Не так давно я столкнулся с подобной проблемой. Что делать, если вы попытаетесь заменить '\\ b' на' \\ <' '\\> 'или' \\ _ <' and '\\_> '? Я не могу вспомнить, в чем разница. –

ответ

1

Тот факт, что он не в буфере *scratch* предполагает, что это проблема в текущем режиме. Есть два основных варианта:

  • Что @wvcvw предложил: проверить, что класс синтаксиса символов 2 и 3 есть.

  • font-lock-keywords, которые уже определены для режима взаимодействия с вашим кодом - например, они переопределяют его. Попробуйте добавить 'APPEND в качестве третьего аргумента в font-lock-add-keywords. Попробуйте добавить t в качестве выражения HIGHLIGHT вашему ползучести sexp (см. Документ). Это должно позволить вашему подчеркиванию переопределить все, что может быть уже в противном случае.

Кстати, вы говорите, что это не работает в «текстовом буфере», но что это значит? От emacs -Q, оценивая ваш код в буфере в text-mode, показывает, что он делает работы. Изучите, что такое режим «текстового буфера», и попробуйте приведенные выше предложения (при необходимости, оба пули, но сначала попробуйте второй).

+0

Синтаксис символов для 2 и 3 - это слово, а для символа ASCII - символ, в режиме lisp-взаимодействия и в текстовом режиме, в соответствии с тем, что 'C-u C-x =' говорит от 'emacs -Q'. Я добавил пример 3 с предложенными переопределениями. В буферах текстового режима я хотел сказать, что подсветка не прерывается в буфере текстового режима, т. Е. Выделение выполняется успешно. Еще с новым примером 3 (из 'emacs -Q')' xy' внутри 'xy-xy' не выделяется в буфере нуля. –

+0

Когда я делаю ваш пример 3 в 'emacs -Q' в буфере текстового режима,' xy' *** подсвечивается *** в 'xy-xy' (только символ дефиса не подсвечен). То же самое в режиме Emacs-Lisp. Если вы не видите это из 'emacs -Q', попробуйте посмотреть' C-h v font-lock-keywords', чтобы узнать, что происходит. Немного трудно поверить, что мы увидим такую ​​разницу с 'emacs -Q'. Возможно, вы используете 'emacs -Q -nw'? (Не знаю, может ли это иметь значение.) – Drew

+0

Поскольку я использую Emacs в MS Windows, то, что я запускал, был 'runemacs.exe -Q'. Я попробовал использовать 'set' вместо' append' в [Пример 4] (https://gist.github.com/jiyoo/6676050) для упрощения. Когда я вычисляю форму progn в примере 4 в буфере режима emacs-lisp из 'runemacs.exe -Q',' xy' в 'xy-xy' не подсвечивается. То же самое с 'ab-ab'. Значение 'font-lock-keywords', похоже, не содержит ничего, что могло бы помешать. 'isearch-forward-regexp' продолжает распознавать' xy' в 'xy-xy' в отличие от блокировки шрифтов. –

Смежные вопросы