Yanıtlar:
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
Yerleşik ffap paketini deneyin (noktada dosyayı bulun):
http://www.emacswiki.org/emacs/FindFileAtPoint
http://www.gnu.org/software/emacs/manual/html_node/emacs/FFAP.html
Küçük modu kullanmam, yerine bir tuşa ffap
Bir dosya adına vurduğumda.
Harika çözüm Ama kullanmaya katılıyorum ffap
GNU 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)