Emacs: выделение только TODO * в комментариях

FileOutputStream fos = new FileOutputStream("File_Name", true);
fos.write(data);

true позволяет добавлять данные в существующий файл. Если мы напишем

FileOutputStream fos = new FileOutputStream("File_Name");

, он перезапишет существующий файл. Итак, для первого подхода.

17
задан Vadim Kotov 1 November 2017 в 11:31
поделиться

2 ответа

Это возможно, но немного сложнее. В режиме Fixme для выделения ключевых слов используется font-lock , поэтому он работает по мере ввода для выделения ключевых слов. Перехватывает блокировку шрифта на очень низком уровне, в основном запускается после каждого изменения содержимого буфера. Однако он сильно оптимизирован, что позволяет мгновенно появляться на современных компьютерах.

Индикатор TODO слева не работает. Выполните функцию, и все текущие TODO будут выделены; изменение буфера (добавление или удаление TODO) не меняет индикатор бахромы; это изменяется только тогда, когда функция запускается снова.

Ваш подход должен заключаться в таблицах синтаксиса, сначала определяя, когда вы находитесь в комментарии, а затем ища ключевые слова. Сложность заключается в том, чтобы делать это в интерактивном режиме (то есть по мере ввода). Для этого у вас должна быть возможность подключиться к конструкциям font-lock , но функция, которую вы предоставляете для поиска таблицы синтаксиса комментариев, а затем и ключевых слов, лучше будет очень эффективной, так как она будет запускаться каждый раз. и каждый раз при изменении буфера (хотя, я думаю, он будет работать только в измененном регионе). Вы бы хотели поместить все это в font-lock-syntactic-keywords , а не в font-lock-keywords , потому что проход syntactic-keyword происходит до синтаксического прохода (который происходит до ключевое слово pass), и вам нужно установить TODO внутри комментариев до того, как будут установлены сами комментарии.

Извините, это неполный ответ с рабочим кодом .....

3
ответ дан 30 November 2019 в 12:43
поделиться

Может быть, это поможет: есть fn c-in-literal в cc-mode и аналогичный csharp-in-literal в режиме csharp. Возвращаемое значение - c , если в комментарии стиля C, c ++ , если в комментарии стиля C ++ . Вы можете добавить это в код в Emacs: индикатор TODO слева , чтобы получить то, что вы хотите.

(defun annotate-todo ()
   "put fringe marker on TODO: lines in the curent buffer"
  (interactive)
  (let (lit)
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward "TODO:" nil t)
      (progn
        (setq lit (c-in-literal)) ;; or csharp-in-literal
        (if (or (eq lit 'c) (eq lit 'c++))
            (let ((overlay (make-overlay (- (point) 5) (point))))
              (overlay-put overlay 'before-string
                           (propertize "A"
                                       'display
                                       '(left-fringe   ;; right
                                         horizontal-bar
                                         better-fringes-important-bitmap))))))))))
2
ответ дан 30 November 2019 в 12:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: