Я часто разбираю файлы журналов, которые помогаю визуализировать, выделяя определенные последовательности символов с помощью M-s h r + regex, также известной как команда highlight-regexp или hi-lock-face-buffer . Иногда мне нужно регенерировать файл журнала, что делается с помощью команды C-x C-v или find-alternate-file. К сожалению, регенерация также теряет все мое выделение.

TL; DR Есть ли способ восстановить мой буферный файл, сохранив при этом всю подсветку?

Обновить Я использую text-mode, и регулярные выражения сильно различаются в зависимости от моей задачи и файла журнала. Я хотел бы что-то, что переносит все мои выделения в обновленный буфер. Что-то уже существует?

Ответ: Даже лучше, чем сохранение выделения после обновления, в выбранном ответе используется add-hook для создания схемы выделения для определенного журнала. Кроме того, в каждом журнале могут быть разные схемы выделения. Результатом является автоматическая схема выделения, которая соответствует имени конкретного файла журнала, с возможностью переключения схем различных выделений.

2
modulitos 7 Июл 2014 в 12:31

2 ответа

Лучший ответ

Вы можете добавить-крючок, который:

(add-hook 'text-mode-hook
          (lambda ()
            (font-lock-add-keywords nil '(("^\\([^,]*\\)," 1 'font-lock-function-name-face)))))

Какое регулярное выражение вы хотите выделить? Если вы используете несколько регулярных выражений в зависимости от журнала, возможно, удастся перехватить их все. Или вы можете запрограммировать условие: какое регулярное выражение выделять:

(add-hook 'text-mode-hook
          (lambda ()
            (if (condition)
                ;; condition true:
                (font-lock-add-keywords nil '((regexp1 1 'font-lock-function-name-face)))
              ;; condition false:
              (font-lock-add-keywords nil   '((regexp2 1 'font-lock-function-name-face)))
              )
            ))

Также, если вы контролируете создание журналов, вы можете сгенерировать правила подсветки в первой строке:

# -*- eval: (highlight-regexp REGEXP) -*-

(при условии, что # - это символ комментария в вашем журнале).

Изменить :

Вот функция defun, которая переключает подсветку для TestQueryLogic или invoking fork-join и testGudermann:

(defun testing-MapAppLog.txt ()
  "Toggle highlighting `TestQueryLogic' or `invoking fork-join' and `testGudermann'."
  (interactive)
  (cond
   ((get this-command 'state)
    (highlight-regexp "TestQueryLogic"     font-lock-variable-name-face)
    (highlight-regexp "invoking fork-join" font-lock-type-face)
    (unhighlight-regexp "testGudermann")
    (message "Highlighting: TestQueryLogic, invoking fork-join")
    (put this-command 'state nil))
   (t
    (unhighlight-regexp "TestQueryLogic")
    (unhighlight-regexp "invoking fork-join")
    (highlight-regexp "testGudermann" font-lock-preprocessor-face)
    (message "Highlighting: testGudermann")
    (put this-command 'state t))))

Так что вызовите его один раз, чтобы hightlight TestQueryLogic, invoking fork-join, вместо этого вызовите его снова, чтобы hightlight testGudermann. К ключу можно привязать:

(define-key text-mode-map (kbd "M-s t") 'testing-MapAppLog.txt)

И нажмите один или два раза в зависимости от того, что вы хотите выделить.

3
Adobe 7 Июл 2014 в 09:51

Вместо того, чтобы C-x C-v, который в основном говорит "выбросить текущий буфер и использовать этот другой файл вместо", у него нет надежды на сохранение временной информации, такой как ваши шаблоны выделения, вы хотите использовать revert-buffer или, может быть, даже auto-revert-mode или auto-revert-tail-mode.

1
Stefan 7 Июл 2014 в 12:48