Lorsque je parcours l'aide d'Emacs pour les fonctions via C-h f
, je veux souvent jeter un œil à l'implémentation Elisp / C. Je souhaite entrer view-mode
automatiquement lorsque j'accède au code source de cette façon pour éviter toute modification inutile. Y a-t-il un crochet ou une fonction que je peux conseiller pour accomplir cela?
10
emacs-lisp-mode
et je fais justeC-x C-q
si je veux modifier le code source.(defun set-buffer-read-only () (setq buffer-read-only t)) (add-hook 'emacs-lisp-mode-hook 'set-buffer-read-only)
Réponses:
Mise à jour (après une nuit de sommeil): Cette réponse a un défaut majeur: elle permet
view-mode
lors de la navigation vers n'importe quelle fonction, pas seulement les sources Emacs. Cela peut être corrigé, mais il vaut mieux utiliser la réponse de @phils .En faisant
C-h f describe-function RET
puis lire le code source dedescribe-function
je découvre qu'il crée un « bouton » d'un type spécial pour les liens vers les définitions de fonction:help-function-def
.Courir
zrgrep
avec cette chaîne ("help-function-def
") m'a montré du doigthelp-mode.el.gz
.Après toutes ces fouilles, nous pouvons remplacer ce type de bouton par le nôtre (notez le commentaire dans le code):
Autant que je sache, il n'y a pas de fonction pour ajouter des conseils: Emacs utilise un
lambda
ici. En revanche (comme souligné par @rationalrevolt ) on peut remplacer lahelp-function
propriété duhelp-function-def
type de bouton:la source
button-type-get
etbutton-type-put
de remplacer le lambda par le mien qui transmet au lambda existant.Vous pouvez utiliser des variables locales de répertoire pour rendre les fichiers source d'Emacs en lecture seule par défaut. (Voir aussi C-hig
(emacs) Directory Variables
RET).Créez un fichier appelé
.dir-locals.el
à la racine de l'arborescence de répertoires que vous souhaitez protéger, avec le contenu suivant:Edit: Michał Politowski souligne dans les commentaires que l'activation
view-mode
de cette manière est problématique, car lorsque vous supprimez le tampon avec lui, qcela désactive également le mode, ce qui signifie que la prochaine fois que vous visiterez ce tamponview-mode
ne sera pas activé.Edit 2: Constantine a fourni une solution à ce problème dans les commentaires ci-dessous:
Cela ajoute utilement un test pour s'assurer que le tampon visite déjà un fichier, mais le changement de clé est l'utilisation de
view-mode-enter
au lieu deview-mode
, car le premier prend unEXIT-ACTION
argument qui détermine ce qu'il faut faire quand il qest tapé. Dans ce cas, l'action de sortie consiste à tuer le tampon, en s'assurant que la prochaine fois que le fichier sera visité, il se retrouvera à nouveauview-mode
.Edit 3: En suivant ce chemin, nous pouvons également voir que le spécifié
EXIT-ACTION
est finalement transmis à laview-mode-exit
fonction, et sa docstring nous donne une solution alternative:Par conséquent, nous pouvons utiliser les éléments suivants:
J'utilise l'approche alternative que vous pouvez spécifier entièrement dans votre fichier init (par opposition à la création d'un
.dir-locals.el
fichier), et je fais simplement les fichiers en lecture seule plutôt que d'utiliserview-mode
. Ma configuration ressemble à ceci:Évidemment, vous pouvez faire la même chose pour votre répertoire elpa et tout autre répertoire contenant du code source tiers.
la source
.dir-locals.el
je m'utilise ...)find-file-hook
et uneread-only-dirs
liste, mais j'aime cette approche.((nil . ((eval . (view-mode 1)))))
quel est le moyen le plus simple de faireView-quit
tuer les tampons accessibles via l'aide? Sinon, après avoir quitté la vue source en appuyant surq
, le tampon reste derrière et lorsque vous accédez ultérieurement aux sources à partir du même fichier à partir de l'aide, le mode d'affichage n'est pas démarré.view-mode
.((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))
(notez(view-mode-enter ...)
plutôt que(view-mode 1)
). De cette façon, appuyer surq
tue le tampon etview-mode
est activé la prochaine fois que je visite le même fichier.Je pense que tout ce dont vous avez besoin est d'ajouter un crochet :
la source
view-mode
lors de la navigation vers n'importe quelle fonction utilisantC-h f
, pas seulement les sources Emacs.find-THING
commandes interactives utilisent ce crochet et les boutons d'aide le contournent.Cela ne concerne pas votre cas spécifique, mais le cas plus général de basculer vers
view-mode
chaque fois que vous visitez un fichier source à partir d'un tampon d'aide. Je la propose comme alternative à la réponse de @ Constantine, car elle n'était pas lisible en tant que commentaire.Il me semble que j'ai obtenu cela à l'origine sur EmacsWiki .
la source
Voici une solution qui fonctionne pour la documentation intégrée et un exemple montrant comment l'étendre à ELPA. Il fonctionne en faisant correspondre le chemin d'accès au fichier actuel avec certaines expressions rationnelles et en appliquant
read-only-mode
si l'un d'eux correspond.Notez que le tampon est en lecture seule si vous le consultez
dired
également, pas seulement via l'aide.J'ai ajouté un hook qui s'exécute après la saisie
emacs-lisp-mode
et vérifie si le chemin d'accès au fichier correspond/\.el\.gz$/
, et applique le mode lecture seule dans le cas contraire.Voici un exemple qui vérifie également ELPA, en utilisant l'heuristique que tout chemin contenant
.emacs.d/elpa
est en fait du code ELPA.la source