Как установить лицо для ключевых слов, которые встречаются в первой строке? - PullRequest
0 голосов
/ 23 мая 2011

Как установить грань для указанных ключевых слов, но только в первой строке?Например, имея этот файл

--- cut here ---
hello world    <-- this "hello" should have face set
hello world    <-- while this "hello" should not
--- cut here ---

только первый привет должен иметь установленное лицо

Я пробовал это

(defun first-line-hello(limit)
  (and (save-excursion (beginning-of-line)
                       (bobp))
       (re-search-forward "hello" limit)))

 (font-lock-add-keywords 'emacs-lisp-mode
                         '((first-line-hello . font-lock-warning-face)))

, но кажется, что по какой-то причине (bobp) возвращаетвсегда true, когда используется в font-lock-Keywords.Я также попытался использовать line-number-at-pos с тем же результатом.

Ответы [ 3 ]

2 голосов
/ 23 мая 2011

Вы близки, но есть несколько проблем.'limit' может быть намного дальше конца первой строки, вам не нужно иметь ошибку, если поиск не удался, и вам нужно перемещать точку независимо от того, пройден поиск или нет.Что все сводится к изменению одной строки в вашей функции:

(defun first-line-hello(limit)
  (and (save-excursion (beginning-of-line)
                       (bobp))
       (re-search-forward "hello" (min (point-at-eol) limit) 'go)))
1 голос
/ 23 мая 2011

Emacs имеет конструкцию регулярного выражения , которая соответствует пустой строке только в начале буфера, поэтому попробуйте это:

(font-lock-add-keywords 'emacs-lisp-mode '(("\\`hello" . font-lock-warning-face)))

Документы говорят:

‘\`’
    matches the empty string, but only at the beginning of the buffer or string being matched against. 
0 голосов
/ 23 мая 2011

Первая строка буфера? Первая строка абзаца?

Несмотря на это, я думаю, что вы могли бы сделать это с вашим собственным второстепенным режимом, в котором вы сканируете буфер / регион так, как вам нравится. При сканировании вам нужно будет начать с начала, отметить местоположение, когда вы впервые видели каждое ключевое слово, выделить его и продолжить сканирование. если вы видите повторяющееся ключевое слово во время сканирования, не выделяйте его.

Я полагаю, что вы не можете сделать это с помощью простых шрифтов-ключевых слов. Они всегда являются ключевыми словами, независимо от того, где они появляются. Но вы можете сделать это с помощью специальных средств сопоставления шрифтов. Получите помощь по номеру font-lock-keywords, и вы увидите:

Каждый элемент в списке ключевых слов на уровне пользователя должен иметь одну из следующих форм:

Сличитель
...

где MATCHER может быть либо регулярным выражением для поиска, либо именем функции для
вызов для выполнения поиска (вызывается с одним аргументом, предел поиска;
он должен вернуть не ноль, переместить точку и установить match-data соответствующим образом, если
это удается; как re-search-forward)

Эти функции сопоставления или регулярные выражения вызываются или оцениваются в произвольных позициях в буфере в, казалось бы, произвольные моменты времени. Использование регулярного выражения по этой причине не сработает, но, используя функцию, вы можете отсканировать обратно к началу буфера, re-search-forward для ключевого слова и выяснить, видите ли вы это ключевое слово впервые, и затем примите соответствующие меры. Вы также можете кэшировать первое увиденное местоположение ключевого слова, а затем управлять кешем в хуке после изменения, но это становится довольно сложным.

РЕДАКТИРОВАТЬ при перечитывании я вижу, что вы пробовали эту последнюю идею, и она не работает для вас. странно.

...