Kiedy przeglądam pomoc Emacsa dla funkcji C-h f
, często chcę zajrzeć do implementacji Elisp / C. Chcę wprowadzić view-mode
automatycznie, gdy uzyskuję dostęp do kodu źródłowego w ten sposób, aby uniknąć niepotrzebnych modyfikacji. Czy jest jakiś haczyk lub funkcja, którą mogę doradzić, aby to osiągnąć?
10
emacs-lisp-mode
i robię to,C-x C-q
jeśli chcę edytować kod źródłowy.(defun set-buffer-read-only () (setq buffer-read-only t)) (add-hook 'emacs-lisp-mode-hook 'set-buffer-read-only)
Odpowiedzi:
Aktualizacja (po nocy snu): Ta odpowiedź ma poważną wadę: umożliwia przejście
view-mode
do dowolnej funkcji, nie tylko źródeł Emacsa. Można to naprawić, ale lepiej użyć odpowiedzi @phils .Dzięki temu
C-h f describe-function RET
, a następnie odczytanie kodu źródłowegodescribe-function
odkryłem, że tworzy „przycisk” specjalnego typu dla linki do definicji funkcji:help-function-def
.Wskazanie na
zrgrep
ten ciąg („help-function-def
”) wskazało mihelp-mode.el.gz
.Po całym tym przekopaniu możemy zastąpić ten typ przycisku naszym własnym (zwróć uwagę na komentarz w kodzie):
O ile mogę stwierdzić, nie ma funkcji, do której można by dodać porady: Emacs używa
lambda
tutaj. Z drugiej strony (jak wskazał @rationalrevolt ) można zastąpićhelp-function
właściwośćhelp-function-def
typu przycisku:źródło
button-type-get
ibutton-type-put
zastąpić lambda własną, która przejdzie do istniejącej lambda.Możesz użyć zmiennych lokalnych katalogu, aby pliki źródłowe Emacsa były domyślnie tylko do odczytu. (Zobacz także C-hig
(emacs) Directory Variables
RET).Utwórz plik o nazwie
.dir-locals.el
w katalogu głównym drzewa katalogów, który chcesz chronić, z następującą zawartością:Edycja: Michał Politowski wskazuje w komentarzach, że włączenie
view-mode
w ten sposób jest problematyczne, ponieważ po zwolnieniu bufora z qnim wyłącza również tryb, co oznacza, że przy następnej wizycie buforview-mode
nie zostanie włączony.Edycja 2: Constantine podał rozwiązanie tego problemu w komentarzach poniżej:
Przydatnie dodaje to test, aby upewnić się, że bufor już odwiedza plik, ale kluczową zmianą jest użycie
view-mode-enter
zamiastview-mode
, ponieważ ten pierwszy przyjmujeEXIT-ACTION
argument, który określa, co zrobić, gdy qzostanie wpisany. W takim przypadku czynnością wyjścia jest zabicie bufora, zapewniając, że przy następnej wizycie plik ponownie się skończyview-mode
.Edycja 3: Podążając tą ścieżką, możemy również zobaczyć, że określony
EXIT-ACTION
jest ostatecznie przekazywany doview-mode-exit
funkcji, a jego dokumentacja daje nam alternatywne rozwiązanie:Dlatego możemy użyć następujących elementów:
Korzystam z alternatywnego podejścia, które możesz określić w całości w pliku init (w przeciwieństwie do tworzenia
.dir-locals.el
pliku), i po prostu zmieniam pliki na tylko do odczytu, zamiast ich używaćview-mode
. Moja konfiguracja wygląda następująco:Oczywiście możesz zrobić to samo dla swojego katalogu elpa i każdego innego katalogu zawierającego kod źródłowy innej firmy.
źródło
.dir-locals.el
sobie i używam ...)find-file-hook
iread-only-dirs
listy, ale podoba mi się to podejście.((nil . ((eval . (view-mode 1)))))
najprościejView-quit
zabić bufory dostępne za pośrednictwem pomocy? W przeciwnym razie po wyjściu z widoku źródłowego przez naciśnięcieq
bufor pozostaje w tyle, a późniejszy dostęp do źródeł z tego samego pliku z pomocy ponownie nie powoduje uruchomienia trybu przeglądania.view-mode
.((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))
(uwaga(view-mode-enter ...)
zamiast(view-mode 1)
). W ten sposób naciśnięcieq
zabija bufor iview-mode
jest włączane przy następnej wizycie tego samego pliku.Myślę, że wystarczy dodać hak :
źródło
view-mode
podczas nawigacji do dowolnej funkcji przy użyciuC-h f
, nie tylko źródeł Emacsa.find-THING
polecenia wykorzystują ten zaczep, a przyciski pomocy omijają go.Nie dotyczy to konkretnego przypadku, ale bardziej ogólny przypadek przełączania się
view-mode
za każdym razem, gdy odwiedzasz plik źródłowy z bufora pomocy. Oferuję ją jako alternatywę dla odpowiedzi @ Constantine, ponieważ nie można jej było odczytać jako komentarza.Wygląda na to, że pierwotnie dostałem to z EmacsWiki .
źródło
Oto rozwiązanie, które działa w przypadku wbudowanej dokumentacji i przykład pokazujący, jak rozszerzyć ją na ELPA. Działa poprzez dopasowanie ścieżki do bieżącego pliku do niektórych wyrażeń regularnych i zastosowanie,
read-only-mode
jeśli którykolwiek z nich jest zgodny.Pamiętaj, że bufor jest tylko do odczytu, jeśli go odwiedzasz,
dired
a nie tylko poprzez pomoc.Dodałem hak, który uruchamia się po wejściu,
emacs-lisp-mode
który sprawdza, czy ścieżka do pliku pasuje/\.el\.gz$/
, i stosuje tryb tylko do odczytu, jeśli tak jest.Oto przykład, który sprawdza również ELPA, używając heurystyki, że każda ścieżka zawierająca
.emacs.d/elpa
jest w rzeczywistości kodem ELPA.źródło