4

GNU Emacs では、架空の "flyexist.el" のようなものを使用できます。絶対 (Unix) ファイル名 (およびそれらの周りにいくつかの追加テキスト) を含むバッファーがあります。これらのファイルのほとんどは存在しますが、一部が欠落しています。不足しているファイルを強調表示する関数を実行したいと思います (おそらく赤いオーバーレイで)。この関数は、バッファ内のどのテキストがファイル名のように見えるか (いくつかの誤検知は問題ありません) を把握し、file-exists-p で処理する必要があります。

たとえば、私のバッファに含まれていると仮定します

Some random text mentioning /file/that/does/exist.txt, 
some more random text, and a /file/that/does/not-exist.txt

2 番目のファイルを強調表示したい。

このようなものはすでに存在しますか?

4

2 に答える 2

6

私はemacsハッキングに慣れていません...これが私の「マイナーモード」バージョンです。

(defvar filehi-path-re "\\([/$][[:alnum:]$-_.]+\\)+"
  "Regexp used for path matching.")


(defface filehi-file-existing
  '((t (:foreground "White" :background "Green")))
  "Face for existing files.")

(defface filehi-file-missing
  '((t (:foreground "Yellow" :background "Red")))
  "Face for missing files.")

(defun filehi-check-and-highlight (start end)
  "Check if substring is existing file path and highlight it."
    (remove-overlays start end 'name 'filehi-highlight)
    (let ((overlay (make-overlay start end)))
      (overlay-put overlay 'name 'filehi-highlight)
      (overlay-put overlay 'face (if (file-exists-p (substitute-in-file-name
                                                     (buffer-substring start end)))
                                     'filehi-file-existing
                                   'filehi-file-missing))))


(defun filehi-highlight-file-paths (&optional start end _ignore)
   "Run through the buffer and highliht file paths."
    (save-excursion
      (save-match-data ; fixes problem with dabbrev (and may be more...)
        (remove-overlays (point-min) end 'name 'filehi-highlight)
        (let ((prev-end (point-min)))
          (goto-char (point-min)) ; FIXME use something like greedy
                                        ; search-backward
          (while (and (<= (point) end)
                      (re-search-forward filehi-path-re nil t))
            (filehi-check-and-highlight (match-beginning 0) (match-end 0)))))))


(define-minor-mode filehi-mode
  "Minor mode for highlighting existing file paths.
May conflict with other modes..."
  nil " Filehi" nil
  (if filehi-mode
      (progn ; enable mode
        (make-local-hook 'after-change-functions)
        (filehi-highlight-file-paths (point-min) (point-max))
        (add-hook 'after-change-functions 'filehi-highlight-file-paths nil t))
    ; disable mode
    (remove-hook 'after-change-functions 'filehi-highlight-file-paths t)
    (remove-overlays (point-min) (point-max) 'name 'filehi-highlight)))
于 2012-06-04T22:16:38.027 に答える
2

これを試してください(ただし、手動でトリガーするか、他の定期的なルーチンに組み込む必要があります):

(defun x-mark-missing-files ()
  (interactive)
  (save-excursion
   (while (search-forward-regexp "~?/[A-Za-z./-]+")
     (when (not (file-exists-p (match-string 0)))
       (overlay-put
        (make-overlay (match-beginning 0) (match-end 0))
        'face '(:background "red"))))))

ファイル名の正規表現を少しいじって、希望どおりに正しくします。

于 2012-06-04T22:08:08.820 に答える