Bonjour,
Je me demandais s'il est possible de demander à Emacs d'effectuer
automatiquement certaines actions à l'ouverture d'un fichier.
Concrètement, j'utilise Emacs essentiellement pour écrire des fichiers
tex. Une fois un fichier .tex ouvert, j'ai souvent besoin de réaliser
les 2 actions suivantes:
- passer en mode majeur org-mode (M-x org-mode)
- revenir tout de suite en mode majeur latex-mode (M-x latex-mode)
Autre exemple, la plupart de mes fichiers .tex sont en latin1 et je
les aurais bien converti en utf8 (ce que je fais avec C-x RET f, soit
la commande set-buffer-file-coding-system). Si Emacs le faisait
automatiquement à l'ouverture du fichier sans que j'ai à faire la
manipulation, ce serait pratique.
Je me dis qu'Emacs doit pouvoir réaliser automatiquement ces actions à
l'ouverture du fichier. La seule piste que j'ai trouvé, c'est de
rajouter:
(setq auto-mode-alist (cons '(".tex" . org-mode) auto-mode-alist))
dans mon .emacs, mais cela ne réalise que la première action et je ne
vois pas comment modifier la commande précédente pour obtenir ce que
je veux.
Bonjour,
Je me demandais s'il est possible de demander à Emacs d'effectuer
automatiquement certaines actions à l'ouverture d'un fichier.
Concrètement, j'utilise Emacs essentiellement pour écrire des fichiers
tex. Une fois un fichier .tex ouvert, j'ai souvent besoin de réaliser
les 2 actions suivantes:
- passer en mode majeur org-mode (M-x org-mode)
- revenir tout de suite en mode majeur latex-mode (M-x latex-mode)
Autre exemple, la plupart de mes fichiers .tex sont en latin1 et je
les aurais bien converti en utf8 (ce que je fais avec C-x RET f, soit
la commande set-buffer-file-coding-system). Si Emacs le faisait
automatiquement à l'ouverture du fichier sans que j'ai à faire la
manipulation, ce serait pratique.
Je me dis qu'Emacs doit pouvoir réaliser automatiquement ces actions à
l'ouverture du fichier. La seule piste que j'ai trouvé, c'est de
rajouter:
(setq auto-mode-alist (cons '("\.tex" . org-mode) auto-mode-alist))
dans mon .emacs, mais cela ne réalise que la première action et je ne
vois pas comment modifier la commande précédente pour obtenir ce que
je veux.
Bonjour,
Je me demandais s'il est possible de demander à Emacs d'effectuer
automatiquement certaines actions à l'ouverture d'un fichier.
Concrètement, j'utilise Emacs essentiellement pour écrire des fichiers
tex. Une fois un fichier .tex ouvert, j'ai souvent besoin de réaliser
les 2 actions suivantes:
- passer en mode majeur org-mode (M-x org-mode)
- revenir tout de suite en mode majeur latex-mode (M-x latex-mode)
Autre exemple, la plupart de mes fichiers .tex sont en latin1 et je
les aurais bien converti en utf8 (ce que je fais avec C-x RET f, soit
la commande set-buffer-file-coding-system). Si Emacs le faisait
automatiquement à l'ouverture du fichier sans que j'ai à faire la
manipulation, ce serait pratique.
Je me dis qu'Emacs doit pouvoir réaliser automatiquement ces actions à
l'ouverture du fichier. La seule piste que j'ai trouvé, c'est de
rajouter:
(setq auto-mode-alist (cons '(".tex" . org-mode) auto-mode-alist))
dans mon .emacs, mais cela ne réalise que la première action et je ne
vois pas comment modifier la commande précédente pour obtenir ce que
je veux.
Concrètement, j'utilise Emacs essentiellement pour écrire des fichiers
tex. Une fois un fichier .tex ouvert, j'ai souvent besoin de réaliser
les 2 actions suivantes:
- passer en mode majeur org-mode (M-x org-mode)
- revenir tout de suite en mode majeur latex-mode (M-x latex-mode)
C'est bizarre. Quel effet de bord en attends tu ?
Peut être veux tu en fait latex-mode et le mode mineur orgstruct-mode ?
Autre exemple, la plupart de mes fichiers .tex sont en latin1 et je
les aurais bien converti en utf8 (ce que je fais avec C-x RET f, soit
la commande set-buffer-file-coding-system). Si Emacs le faisait
automatiquement à l'ouverture du fichier sans que j'ai à faire la
manipulation, ce serait pratique.
Je pense que le plus simple sera de mettre une fonction dans
find-file-hook. Note qu'il y a souvent déjà plusieurs fonctions dans
cette liste, et que leur ordre d'exécution peut être important, dans la
mesure où elles ont des effets de bord comme celle que tu veux.
(require 'cl)
(defun sd--mode-name (mode-symbol)
(let ((name (symbol-name mode-symbol)))
(if (string-match "-mode$" name)
(intern (substring name 0 (- (length name) 5)))
mode-symbol)))
(defun sd--ensure-coding (wanted-coding)
(unless (eql buffer-file-coding-system wanted-coding)
(set-buffer-file-coding-system wanted-coding)
(add-file-local-variable 'coding wanted-coding)))
(defun sd--ensure-modes (wanted-major wanted-minors)
;; Bug: this doesn't remove the old major mode local variable line.
(let ((missing-major-p (not (eql major-mode wanted-major)))
(missing-minors (mapcan
(lambda (mm)
(unless (and (boundp mm)
(symbol-value mm))
(list mm)))
wanted-minors)))
;; set the right major mode:
(when missing-major-p
(funcall wanted-major))
;; set the missing minor modes:
(dolist (mm missing-minors)
(funcall mm 1))
;; save them:
(dolist (mm (reverse missing-minors))
(add-file-local-variable 'mode (sd--mode-name mm)))
(when missing-major-p
(add-file-local-variable 'mode (sd--mode-name wanted-major)))))
(defvar *tex-file-regexp* "^/home/sd/.*.tex$")
(defun sd--tex-file-meat ()
(interactive) ; so you may have fun calling it interactively too.
(when (string-match *tex-file-regexp* buffer-file-name)
(sd--ensure-modes 'latex-mode '(orgstruct-mode))
(sd--ensure-coding 'utf-8-unix)))
(pushnew sd--text-file-meat 'find-file-hook)
Concrètement, j'utilise Emacs essentiellement pour écrire des fichiers
tex. Une fois un fichier .tex ouvert, j'ai souvent besoin de réaliser
les 2 actions suivantes:
- passer en mode majeur org-mode (M-x org-mode)
- revenir tout de suite en mode majeur latex-mode (M-x latex-mode)
C'est bizarre. Quel effet de bord en attends tu ?
Peut être veux tu en fait latex-mode et le mode mineur orgstruct-mode ?
Autre exemple, la plupart de mes fichiers .tex sont en latin1 et je
les aurais bien converti en utf8 (ce que je fais avec C-x RET f, soit
la commande set-buffer-file-coding-system). Si Emacs le faisait
automatiquement à l'ouverture du fichier sans que j'ai à faire la
manipulation, ce serait pratique.
Je pense que le plus simple sera de mettre une fonction dans
find-file-hook. Note qu'il y a souvent déjà plusieurs fonctions dans
cette liste, et que leur ordre d'exécution peut être important, dans la
mesure où elles ont des effets de bord comme celle que tu veux.
(require 'cl)
(defun sd--mode-name (mode-symbol)
(let ((name (symbol-name mode-symbol)))
(if (string-match "-mode$" name)
(intern (substring name 0 (- (length name) 5)))
mode-symbol)))
(defun sd--ensure-coding (wanted-coding)
(unless (eql buffer-file-coding-system wanted-coding)
(set-buffer-file-coding-system wanted-coding)
(add-file-local-variable 'coding wanted-coding)))
(defun sd--ensure-modes (wanted-major wanted-minors)
;; Bug: this doesn't remove the old major mode local variable line.
(let ((missing-major-p (not (eql major-mode wanted-major)))
(missing-minors (mapcan
(lambda (mm)
(unless (and (boundp mm)
(symbol-value mm))
(list mm)))
wanted-minors)))
;; set the right major mode:
(when missing-major-p
(funcall wanted-major))
;; set the missing minor modes:
(dolist (mm missing-minors)
(funcall mm 1))
;; save them:
(dolist (mm (reverse missing-minors))
(add-file-local-variable 'mode (sd--mode-name mm)))
(when missing-major-p
(add-file-local-variable 'mode (sd--mode-name wanted-major)))))
(defvar *tex-file-regexp* "^/home/sd/.*\.tex$")
(defun sd--tex-file-meat ()
(interactive) ; so you may have fun calling it interactively too.
(when (string-match *tex-file-regexp* buffer-file-name)
(sd--ensure-modes 'latex-mode '(orgstruct-mode))
(sd--ensure-coding 'utf-8-unix)))
(pushnew sd--text-file-meat 'find-file-hook)
Concrètement, j'utilise Emacs essentiellement pour écrire des fichiers
tex. Une fois un fichier .tex ouvert, j'ai souvent besoin de réaliser
les 2 actions suivantes:
- passer en mode majeur org-mode (M-x org-mode)
- revenir tout de suite en mode majeur latex-mode (M-x latex-mode)
C'est bizarre. Quel effet de bord en attends tu ?
Peut être veux tu en fait latex-mode et le mode mineur orgstruct-mode ?
Autre exemple, la plupart de mes fichiers .tex sont en latin1 et je
les aurais bien converti en utf8 (ce que je fais avec C-x RET f, soit
la commande set-buffer-file-coding-system). Si Emacs le faisait
automatiquement à l'ouverture du fichier sans que j'ai à faire la
manipulation, ce serait pratique.
Je pense que le plus simple sera de mettre une fonction dans
find-file-hook. Note qu'il y a souvent déjà plusieurs fonctions dans
cette liste, et que leur ordre d'exécution peut être important, dans la
mesure où elles ont des effets de bord comme celle que tu veux.
(require 'cl)
(defun sd--mode-name (mode-symbol)
(let ((name (symbol-name mode-symbol)))
(if (string-match "-mode$" name)
(intern (substring name 0 (- (length name) 5)))
mode-symbol)))
(defun sd--ensure-coding (wanted-coding)
(unless (eql buffer-file-coding-system wanted-coding)
(set-buffer-file-coding-system wanted-coding)
(add-file-local-variable 'coding wanted-coding)))
(defun sd--ensure-modes (wanted-major wanted-minors)
;; Bug: this doesn't remove the old major mode local variable line.
(let ((missing-major-p (not (eql major-mode wanted-major)))
(missing-minors (mapcan
(lambda (mm)
(unless (and (boundp mm)
(symbol-value mm))
(list mm)))
wanted-minors)))
;; set the right major mode:
(when missing-major-p
(funcall wanted-major))
;; set the missing minor modes:
(dolist (mm missing-minors)
(funcall mm 1))
;; save them:
(dolist (mm (reverse missing-minors))
(add-file-local-variable 'mode (sd--mode-name mm)))
(when missing-major-p
(add-file-local-variable 'mode (sd--mode-name wanted-major)))))
(defvar *tex-file-regexp* "^/home/sd/.*.tex$")
(defun sd--tex-file-meat ()
(interactive) ; so you may have fun calling it interactively too.
(when (string-match *tex-file-regexp* buffer-file-name)
(sd--ensure-modes 'latex-mode '(orgstruct-mode))
(sd--ensure-coding 'utf-8-unix)))
(pushnew sd--text-file-meat 'find-file-hook)
Je crois que je comprends à peu près sd--ensure-coding;
sd--ensure-modes est plus compliquée pour moi (même s'il me semble
tout de même comprendre les grandes lignes) mais je ne comprends pas
sd--mode-name utilisé par sd--ensure-modes.
(require 'cl)
(defun sd--mode-name (mode-symbol)
(let ((name (symbol-name mode-symbol)))
(if (string-match "-mode$" name)
(intern (substring name 0 (- (length name) 5)))
mode-symbol)))
(defun sd--ensure-coding (wanted-coding)
(unless (eql buffer-file-coding-system wanted-coding)
(set-buffer-file-coding-system wanted-coding)
(add-file-local-variable 'coding wanted-coding)))
(defun sd--ensure-modes (wanted-major wanted-minors)
;; Bug: this doesn't remove the old major mode local variable line.
(let ((missing-major-p (not (eql major-mode wanted-major)))
(missing-minors (mapcan
(lambda (mm)
(unless (and (boundp mm)
(symbol-value mm))
(list mm)))
wanted-minors)))
;; set the right major mode:
(when missing-major-p
(funcall wanted-major))
;; set the missing minor modes:
(dolist (mm missing-minors)
(funcall mm 1))
;; save them:
(dolist (mm (reverse missing-minors))
(add-file-local-variable 'mode (sd--mode-name mm)))
(when missing-major-p
(add-file-local-variable 'mode (sd--mode-name wanted-major)))))
(defvar *tex-file-regexp* "^/home/sd/.*.tex$")
(defun sd--tex-file-meat ()
(interactive) ; so you may have fun calling it interactively too.
(when (string-match *tex-file-regexp* buffer-file-name)
(sd--ensure-modes 'latex-mode '(orgstruct-mode))
(sd--ensure-coding 'utf-8-unix)))
(pushnew sd--text-file-meat 'find-file-hook)
Donc sd--tex-file-meat permet de réaliser les différentes actions et
avec (pushnew sd--text-file-meat 'find-file-hook), cette fonction est
«lancée par find-file» uniquement sur les fichiers tex grâce à
when (string-match *tex-file-regexp* buffer-file-name), c'est çà?
Je crois que je comprends à peu près sd--ensure-coding;
sd--ensure-modes est plus compliquée pour moi (même s'il me semble
tout de même comprendre les grandes lignes) mais je ne comprends pas
sd--mode-name utilisé par sd--ensure-modes.
(require 'cl)
(defun sd--mode-name (mode-symbol)
(let ((name (symbol-name mode-symbol)))
(if (string-match "-mode$" name)
(intern (substring name 0 (- (length name) 5)))
mode-symbol)))
(defun sd--ensure-coding (wanted-coding)
(unless (eql buffer-file-coding-system wanted-coding)
(set-buffer-file-coding-system wanted-coding)
(add-file-local-variable 'coding wanted-coding)))
(defun sd--ensure-modes (wanted-major wanted-minors)
;; Bug: this doesn't remove the old major mode local variable line.
(let ((missing-major-p (not (eql major-mode wanted-major)))
(missing-minors (mapcan
(lambda (mm)
(unless (and (boundp mm)
(symbol-value mm))
(list mm)))
wanted-minors)))
;; set the right major mode:
(when missing-major-p
(funcall wanted-major))
;; set the missing minor modes:
(dolist (mm missing-minors)
(funcall mm 1))
;; save them:
(dolist (mm (reverse missing-minors))
(add-file-local-variable 'mode (sd--mode-name mm)))
(when missing-major-p
(add-file-local-variable 'mode (sd--mode-name wanted-major)))))
(defvar *tex-file-regexp* "^/home/sd/.*\.tex$")
(defun sd--tex-file-meat ()
(interactive) ; so you may have fun calling it interactively too.
(when (string-match *tex-file-regexp* buffer-file-name)
(sd--ensure-modes 'latex-mode '(orgstruct-mode))
(sd--ensure-coding 'utf-8-unix)))
(pushnew sd--text-file-meat 'find-file-hook)
Donc sd--tex-file-meat permet de réaliser les différentes actions et
avec (pushnew sd--text-file-meat 'find-file-hook), cette fonction est
«lancée par find-file» uniquement sur les fichiers tex grâce à
when (string-match *tex-file-regexp* buffer-file-name), c'est çà?
Je crois que je comprends à peu près sd--ensure-coding;
sd--ensure-modes est plus compliquée pour moi (même s'il me semble
tout de même comprendre les grandes lignes) mais je ne comprends pas
sd--mode-name utilisé par sd--ensure-modes.
(require 'cl)
(defun sd--mode-name (mode-symbol)
(let ((name (symbol-name mode-symbol)))
(if (string-match "-mode$" name)
(intern (substring name 0 (- (length name) 5)))
mode-symbol)))
(defun sd--ensure-coding (wanted-coding)
(unless (eql buffer-file-coding-system wanted-coding)
(set-buffer-file-coding-system wanted-coding)
(add-file-local-variable 'coding wanted-coding)))
(defun sd--ensure-modes (wanted-major wanted-minors)
;; Bug: this doesn't remove the old major mode local variable line.
(let ((missing-major-p (not (eql major-mode wanted-major)))
(missing-minors (mapcan
(lambda (mm)
(unless (and (boundp mm)
(symbol-value mm))
(list mm)))
wanted-minors)))
;; set the right major mode:
(when missing-major-p
(funcall wanted-major))
;; set the missing minor modes:
(dolist (mm missing-minors)
(funcall mm 1))
;; save them:
(dolist (mm (reverse missing-minors))
(add-file-local-variable 'mode (sd--mode-name mm)))
(when missing-major-p
(add-file-local-variable 'mode (sd--mode-name wanted-major)))))
(defvar *tex-file-regexp* "^/home/sd/.*.tex$")
(defun sd--tex-file-meat ()
(interactive) ; so you may have fun calling it interactively too.
(when (string-match *tex-file-regexp* buffer-file-name)
(sd--ensure-modes 'latex-mode '(orgstruct-mode))
(sd--ensure-coding 'utf-8-unix)))
(pushnew sd--text-file-meat 'find-file-hook)
Donc sd--tex-file-meat permet de réaliser les différentes actions et
avec (pushnew sd--text-file-meat 'find-file-hook), cette fonction est
«lancée par find-file» uniquement sur les fichiers tex grâce à
when (string-match *tex-file-regexp* buffer-file-name), c'est çà?