Emacs dosya yollarını vurgulamak ve bağlamak için nasıl edinilir


5

Tamponda / nfs dosya yollarını otomatik olarak bulup, bunlara / linkini vurgulayan bazı emacs lisp kodu var mı? Yani üzerlerine tıklamak bu dosyayı açar mı?

Örnek yol: /nfs/foo/bar/file.txt

Yanıtlar:


7

Muhtemelen bunu zaten yapan bir paket var, ama bilmiyorum.

Bu kod parçası, bir dosyanın yolu gibi göründüğünü düşündüğü metne düğmeler ekler. Fonksiyonu ekleyebilirsiniz 'buttonize-buffer için find-file-hooks veya manuel olarak (veya şartlı olarak) çalıştırın.

(define-button-type 'find-file-button
  'follow-link t
  'action #'find-file-button)

(defun find-file-button (button)
  (find-file (buffer-substring (button-start button) (button-end button))))

(defun buttonize-buffer ()
  "turn all file paths into buttons"
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward "/[^ \t]*" nil t)
      (make-button (match-beginning 0) (match-end 0) :type 'find-file-button))))

; (add-hook 'find-file-hook 'buttonize-buffer)   ; uncomment to add to find file

2
Bu harika. Kaçınılması gereken birkaç karakter daha yaptım ... yeniden arama "/ nfs [^ \ t \ n, \ '\"] * ".. muhtemelen bulacağımdan daha fazlası var, ancak eklemek çok kolay.


1

Harika çözüm Ama kullanmaya katılıyorum ffapGNU Emacs'in bir parçası. ffap birçok ince problemi çözer, çevre değişkenlerini genişletir ve yakalar URL'ler.

Ancak, ffap kendi Lisp'ten kolayca kullanılamaz. Benim yeniden uygulamam buttonize-buffer dayanır ffap-next-regexp ve ffap-guesser. Zor kısım, aşağıda belirtilen hatanın etrafında çalışmak ve dosyanın veya URL'nin başlangıç ​​noktasını bulmaktı; ffap-guesser sağlamaz.

Ayrıştırıcı, geçerli tamponu tarar ve ayrıntıları mesaj tamponuna basar; orada hangi dizelerin dosya olduğu tahmin edilir, hangileri eşleşir ve hangileri düğmelidir.

(defun buttonize-buffer ()
  "Turn all file paths and URLs into buttons."
  (interactive)
  (require 'ffap)
  (deactivate-mark)
  (let (token guess beg end reached bound len)
    (save-excursion
      (setq reached (point-min))
      (goto-char (point-min))
      (while (re-search-forward ffap-next-regexp nil t)
        ;; There seems to be a bug in ffap, Emacs 23.3.1: `ffap-file-at-point'
        ;; enters endless loop when the string at point is "//".
        (setq token (ffap-string-at-point))
        (unless (string= "//" (substring token 0 2))
          ;; Note that `ffap-next-regexp' only finds some "indicator string" for a
          ;; file or URL. `ffap-string-at-point' blows this up into a token.
          (save-excursion
            (beginning-of-line)
            (when (search-forward token (point-at-eol) t)
              (setq beg (match-beginning 0)
                    end (match-end 0)
                    reached end))
            )
          (message "Found token %s at (%d-%d)" token beg (- end 1))
          ;; Now let `ffap-guesser' identify the actual file path or URL at
          ;; point.
          (when (setq guess (ffap-guesser))
            (message "  Guessing %s" guess)
            (save-excursion
              (beginning-of-line)
              (when (search-forward guess (point-at-eol) t)
                (setq len (length guess) end (point) beg (- end len))
                ;; Finally we found something worth buttonizing. It shall have
                ;; at least 2 chars, however.
                (message "    Matched at (%d-%d]" beg (- end 1))
                (unless (or (< (length guess) 2))
                  (message "      Buttonize!")
                  (make-button beg end :type 'find-file-button))
                )
              )
            )
          ;; Continue one character after the guess, or the original token.
          (goto-char (max reached end))
          (message "Continuing at %d" (point))
          )
        )
      )
    )
  )

Fonksiyonu kalıcı olarak kurmak için:

(add-hook 'find-file-hook 'buttonize-buffer)

Daha iyi bir çözüm tamponları "lazily buttonize" etmektir:

(defun buttonize-current-buffer-on-idle (&optional secs)
  "Idle-timer (see \\[run-with-idle-timer]) that buttonizes filenames and URLs.
SECS defaults to 60 seconds idle time."
  (interactive)
  (run-with-idle-timer (or secs 60) t 'buttonize-buffer))

(add-hook 'after-init-hook 'buttonize-current-buffer-on-idle)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.