Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Raccourcis clavier avec action différente selon mode

32 réponses
Avatar
Astier
Bonjour,

Apr=E8s avoir utilis=E9 Emacs pour r=E9diger du code LaTeX avec AucTeX, je
viens de me mettre au HTML avec l'aide du html-helper-mode charg=E9
ainsi (si =E7a peut servir pour la suite) :

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;;HTML
(autoload 'html-helper-mode "html-helper-mode" "Yay HTML" t)
(setq auto-mode-alist (cons '("\\.html$" . html-helper-mode) auto-
mode-alist))
(setq html-helper-do-write-file-hooks t)
(setq html-helper-build-new-buffer t)
; Utiliser le menu expert
(setq html-helper-use-expert-menu t)
; Indenter automatiquement lorsque l'on appuie sur entr=E9e
(defun my-html-helper-load-hook ()
(define-key html-mode-map (kbd "RET") 'newline-and-indent))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Dans mon .emacs, j'avais fait quelques modifications au niveau des
raccourcis clavier notamment en ce qui concerne l'automatisation des
guillemets fran=E7ais (\og \fg avec l'extension french de babel) :

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
(defun insert-french-quotes () "insert french quotes and go between
them" (interactive)
(insert "\\og \\fg{}")
(backward-char 5))
(global-set-key (kbd "M-\"") 'insert-french-quotes)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Pour le HTML, j'ai attribu=E9 un autre raccourci clavier pour les
guillemets fran=E7ais : « » avec espace ins=E9cable ainsi :

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
(defun insert-html-french-quotes () "insert french quotes in html and
go between" (interactive)
(insert "\« \ »")
(backward-char 13))
(global-set-key (kbd "C-\"") 'insert-html-french-quotes)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Je viens =E0 vous afin de savoir s'il =E9tait possible de faire en sorte
qu'un m=EAme raccourci clavier puisse produire une action diff=E9rente
selon le mode dans lequel on se trouve : ainsi, le raccourci clavier
C-" pourrait produire des guillemets fran=E7ais que l'on soit en latex
ou en html. Je suppose que pour ce faire il faut mettre en place une
sorte de "condition" mais mes recherches ne m'ont pas vraiment
renseign=E9 :/


Merci, =E0 bient=F4t.

10 réponses

1 2 3 4
Avatar
Jacques L'helgoualc'h
Le 29-07-2008, Astier a écrit :
Bonjour,



bonjour,

Après avoir utilisé Emacs pour rédiger du code LaTeX avec AucTeX, je
viens de me mettre au HTML avec l'aide du html-helper-mode chargé
ainsi (si ça peut servir pour la suite) :

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;;HTML


[...]
(define-key html-mode-map (kbd "RET") 'newline-and-indent))


_____^^^^^^^^^^^^^^^^^^^^^^^^

[...]
(global-set-key (kbd "M-"") 'insert-french-quotes)


___~~~~~~^^^^^^^^

[...]
(global-set-key (kbd "C-"") 'insert-html-french-quotes)


___~~~~~~^^^^^^^^

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Je viens à vous afin de savoir s'il était possible de faire en sorte
qu'un même raccourci clavier puisse produire une action différente
selon le mode dans lequel on se trouve : ainsi, le raccourci clavier
C-" pourrait produire des guillemets français que l'on soit en latex
ou en html. Je suppose que pour ce faire il faut mettre en place une
sorte de "condition" mais mes recherches ne m'ont pas vraiment
renseigné :/



Pour avoir des raccourcis adaptés aux modes, il ne faut pas les laisser
se battre à coups de global-set-key :)

Pour AucTeX, j'ai un raccourci conditionnel :

(define-key LaTeX-mode-map (kbd "C-c f") 'my-frac-or-foot)

(defun my-footnote ()
"Ouvre une footnote"
(interactive)
(search-backward-regexp "[])>».,[:alnum:]]")
(forward-char)
(insert "footnote{%n .}")
(newline-and-indent)
(beginning-of-line)
(backward-char 4))

(defun my-fraction ()
"Insère une fraction"
(interactive)
(insert "frac{}{}")
(backward-char 3))

(defun my-frac-or-foot ()
"Insère une fraction ou une footnote selon le contexte"
(interactive)
(if (texmathp)
(my-fraction)
(my-footnote)))

Merci, à bientôt.



de rien,
--
Jacques L'helgoualc'h
Avatar
Astier
On 29 juil, 10:52, Jacques L'helgoualc'h <lhh+ wrote:
Le 29-07-2008, Astier a écrit :

Pour avoir des raccourcis adaptés aux  modes, il ne faut pas les lais ser
se battre à coups de global-set-key :)




Arf...

Pour AucTeX, j'ai un raccourci conditionnel :

    (define-key LaTeX-mode-map (kbd "C-c f") 'my-frac-or-foot)

  (defun my-footnote ()
    "Ouvre une footnote"
    (interactive)
    (search-backward-regexp "[])>».,[:alnum:]]")
    (forward-char)
    (insert "footnote{%n  .}")
    (newline-and-indent)
    (beginning-of-line)
    (backward-char 4))

  (defun my-fraction ()
    "Insère une fraction"
    (interactive)
    (insert "frac{}{}")
    (backward-char 3))

  (defun my-frac-or-foot ()
    "Insère une fraction ou une footnote selon le contexte"
    (interactive)
    (if (texmathp)
        (my-fraction)
      (my-footnote)))




Ah oui c'est un peu plus "complexe" que je ne pensais :/ Je vais
essayer de faire ça.

Sinon, une autre solution consisterait à avoir plusieurs .emacs
portant chacun les spécificités des modes ; à moins que cette approch e
soit totalement "ridicule" ou inutile ?

A bientôt.

> Merci, à bientôt.

de rien,
--
Jacques L'helgoualc'h
Avatar
Erwan David
Astier écrivait :

On 29 juil, 10:52, Jacques L'helgoualc'h <lhh+ wrote:
Le 29-07-2008, Astier a écrit :

Pour avoir des raccourcis adaptés aux  modes, il ne faut pas les laisser
se battre à coups de global-set-key :)




Arf...

Pour AucTeX, j'ai un raccourci conditionnel :

    (define-key LaTeX-mode-map (kbd "C-c f") 'my-frac-or-foot)

  (defun my-footnote ()
    "Ouvre une footnote"
    (interactive)
    (search-backward-regexp "[])>».,[:alnum:]]")
    (forward-char)
    (insert "footnote{%n  .}")
    (newline-and-indent)
    (beginning-of-line)
    (backward-char 4))

  (defun my-fraction ()
    "Insère une fraction"
    (interactive)
    (insert "frac{}{}")
    (backward-char 3))

  (defun my-frac-or-foot ()
    "Insère une fraction ou une footnote selon le contexte"
    (interactive)
    (if (texmathp)
        (my-fraction)
      (my-footnote)))




Ah oui c'est un peu plus "complexe" que je ne pensais :/ Je vais
essayer de faire ça.

Sinon, une autre solution consisterait à avoir plusieurs .emacs
portant chacun les spécificités des modes ; à moins que cette approche
soit totalement "ridicule" ou inutile ?



S'il y a global-set-key, c'est aussi qu'il y a "local-set-key" qui
modifie la keymap pour le buffer uniquement. En mettant ces localset-key
dans le hook du mode, tout roule...

--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé
Avatar
Jacques L'helgoualc'h
Le 02-08-2008, Erwan David a écrit :
Astier écrivait :
On 29 juil, 10:52, Jacques L'helgoualc'h <lhh+ wrote:




[...]
Pour avoir des raccourcis adaptés aux  modes, il ne faut pas les laisser
se battre à coups de global-set-key :)



Arf...

Pour AucTeX, j'ai un raccourci conditionnel :

    (define-key LaTeX-mode-map (kbd "C-c f") 'my-frac-or-foot)






[...]
  (defun my-frac-or-foot ()
    "Insère une fraction ou une footnote selon le contexte"
    (interactive)
    (if (texmathp)
        (my-fraction)
      (my-footnote)))



Ah oui c'est un peu plus "complexe" que je ne pensais :/ Je vais
essayer de faire ça.





Là, c'est à cause du sous-mode mathématique d'AucTeX, qui n'est actif
que dans certaines parties du buffer...

Sinon, une autre solution consisterait à avoir plusieurs .emacs
portant chacun les spécificités des modes ; à moins que cette approche
soit totalement "ridicule" ou inutile ?





Tu peux faire ce que tu veux, avec plusieurs instances spécialisées
d'Emacs au besoin. Par exemple, pour accélérer l'appel de mon Éditeur
favori, j'utilise un Emacs serveur lancé une fois pour toutes, et
l'appelle par gnuclient : j'ai donc dans mon ~/.xsession une ligne

emacs -iconic -l ~/.elisp21/server.el &

qui charge, après ~/.emacs, le supplément suivant :

,----[ server.el ]
| ;;; serveur de gnuclient
| (when window-system
| (when (fboundp 'gnuserv-start)
| (gnuserv-start)
| (defun adieu ()
| (unless (y-or-n-p "Ça va pas, la tête... ?! ")
| (keyboard-quit)))
| (add-hook 'server-switch-hook
| (lambda ()
| (set-frame-position (make-frame) 0 0)))
| (add-hook 'server-done-hook 'delete-frame)))
`----

et dans mon ~/.emacs, la définition générale d'adieu

(defun adieu ()
(unless (y-or-n-p "Fermer cette instance d'Emacs ?")
(keyboard-quit)))
(add-hook 'kill-emacs-hook
'adieu)

pour ne pas fermer l'Emacs serveur par inadvertance.


S'il y a global-set-key, c'est aussi qu'il y a "local-set-key" qui
modifie la keymap pour le buffer uniquement. En mettant ces localset-key
dans le hook du mode, tout roule...



Le « local-set-key » est encore plus spécialisé, il me semble que la
méthode du *-mode-map est mieux adaptée aux raccourcis qui sont définis
une fois pour toutes au premier chargement du mode :

(eval-after-load "latex" '(my-LaTeX-init))

avec mes ajouts de LaTeX-mode-map dans la fonction appelée.
--
Jacques L'helgoualc'h
Avatar
Astier
Jacques L'helgoualc'h a écrit :
Le 02-08-2008, Erwan David a écrit :
Astier écrivait :
On 29 juil, 10:52, Jacques L'helgoualc'h <lhh+ wrote:




[...]
Pour avoir des raccourcis adaptés aux modes, il ne faut pas les laisser
se battre à coups de global-set-key :)


Arf...

Pour AucTeX, j'ai un raccourci conditionnel :

(define-key LaTeX-mode-map (kbd "C-c f") 'my-frac-or-foot)






[...]
(defun my-frac-or-foot ()
"Insère une fraction ou une footnote selon le contexte"
(interactive)
(if (texmathp)
(my-fraction)
(my-footnote)))


Ah oui c'est un peu plus "complexe" que je ne pensais :/ Je vais
essayer de faire ça.





Là, c'est à cause du sous-mode mathématique d'AucTeX, qui n'est actif
que dans certaines parties du buffer...

Sinon, une autre solution consisterait à avoir plusieurs .emacs
portant chacun les spécificités des modes ; à moins que cette approche
soit totalement "ridicule" ou inutile ?





Tu peux faire ce que tu veux, avec plusieurs instances spécialisées
d'Emacs au besoin. Par exemple, pour accélérer l'appel de mon Éditeur
favori, j'utilise un Emacs serveur lancé une fois pour toutes, et
l'appelle par gnuclient : j'ai donc dans mon ~/.xsession une ligne

emacs -iconic -l ~/.elisp21/server.el &

qui charge, après ~/.emacs, le supplément suivant :

,----[ server.el ]
| ;;; serveur de gnuclient
| (when window-system
| (when (fboundp 'gnuserv-start)
| (gnuserv-start)
| (defun adieu ()
| (unless (y-or-n-p "Ça va pas, la tête... ?! ")
| (keyboard-quit)))
| (add-hook 'server-switch-hook
| (lambda ()
| (set-frame-position (make-frame) 0 0)))
| (add-hook 'server-done-hook 'delete-frame)))
`----

et dans mon ~/.emacs, la définition générale d'adieu

(defun adieu ()
(unless (y-or-n-p "Fermer cette instance d'Emacs ?")
(keyboard-quit)))
(add-hook 'kill-emacs-hook
'adieu)

pour ne pas fermer l'Emacs serveur par inadvertance.


S'il y a global-set-key, c'est aussi qu'il y a "local-set-key" qui
modifie la keymap pour le buffer uniquement. En mettant ces localset-key
dans le hook du mode, tout roule...



Le « local-set-key » est encore plus spécialisé, il me semble que la
méthode du *-mode-map est mieux adaptée aux raccourcis qui sont définis
une fois pour toutes au premier chargement du mode :

(eval-after-load "latex" '(my-LaTeX-init))

avec mes ajouts de LaTeX-mode-map dans la fonction appelée.



Désolé pour le délai, je me suis mis au HTML/CSS/javascript ce qui m'a
un peu éloigné de ces modifications.
J'essaierai de m'y mettre la semaine prochaine, après avoir digéré vos
propos.

A bientôt.
Avatar
Astier
Astier a écrit :

Bonjour,

Désolé de "déterrer" ce topic, mais j'ai pris le temps de me mettre les
mains dans le cambouis.

Pour AucTeX, j'ai un raccourci conditionnel :

(define-key LaTeX-mode-map (kbd "C-c f") 'my-frac-or-foot)






[...]
(defun my-frac-or-foot ()
"Insère une fraction ou une footnote selon le contexte"
(interactive)
(if (texmathp)
(my-fraction)
(my-footnote)))











Donc, si je comprends bien, il faudrait que je fasse un truc dans le genre :

#####
(define-key LaTeX-mode-map (kbd "M-"") 'franguill')
(define-key html-mode-map (kbd "M-"") 'franguill')


(defun franguill ()
"Insère des guillemets français"
(interactive)
(insert "og fg{}")
(backward-char 5))
#####

à moins qu'il faille passer par une condition ?

Sinon, une autre solution consisterait à avoir plusieurs .emacs
portant chacun les spécificités des modes ; à moins que cette approche
soit totalement "ridicule" ou inutile ?




Tu peux faire ce que tu veux, avec plusieurs instances spécialisées
d'Emacs au besoin. Par exemple, pour accélérer l'appel de mon Éditeur
favori, j'utilise un Emacs serveur lancé une fois pour toutes, et
l'appelle par gnuclient : j'ai donc dans mon ~/.xsession une ligne





ok, donc, gnuclient appartient au paquet gnuserv que je viens d'installer.
je suppose que le fichier ~/.xsession est chargé lors du lancement d'une
session graphique ? Si c'est bien le cas, comment cela se passe lorsque
l'on travaille dans les tty ?

emacs -iconic -l ~/.elisp21/server.el &





donc on lance un serveur Emacs. Pour lancer emacs par la suite, il
suffit d'appeler emacs ou d'utiliser les lanceurs traditionnels ---
celui de mon tableau de bord correspond à /usr/bin/emacs22 ?

qui charge, après ~/.emacs, le supplément suivant :

,----[ server.el ]
| ;;; serveur de gnuclient
| (when window-system
| (when (fboundp 'gnuserv-start)
| (gnuserv-start)
| (defun adieu ()
| (unless (y-or-n-p "Ça va pas, la tête... ?! ")
| (keyboard-quit)))
| (add-hook 'server-switch-hook
| (lambda ()
| (set-frame-position (make-frame) 0 0)))
| (add-hook 'server-done-hook 'delete-frame)))
`----

et dans mon ~/.emacs, la définition générale d'adieu

(defun adieu ()
(unless (y-or-n-p "Fermer cette instance d'Emacs ?")
(keyboard-quit)))
(add-hook 'kill-emacs-hook
'adieu)





euh... c'est bien un fichier "externe", qui se trouve ici :
~/.elisp21/server.el --- dans mon cas ~/.elisp22/server.el puisque j'ai
emacs22 (ou ça ne change rien) ?

De plus, si je me crée plusieurs ~/.emacs --- par exemple ~/.emacstex et
~/.emacshtml, comment faire pour les appeler au juste ? J'ai regardé
dans le man d'emacs et il ne m'a pas semblé voir d'option permettant de
choisir l'init file.

pour ne pas fermer l'Emacs serveur par inadvertance.


Le « local-set-key » est encore plus spécialisé, il me semble que la
méthode du *-mode-map est mieux adaptée aux raccourcis qui sont définis
une fois pour toutes au premier chargement du mode :

(eval-after-load "latex" '(my-LaTeX-init))

avec mes ajouts de LaTeX-mode-map dans la fonction appelée.





Là j'ai du mal à saisir...

Merci pour vos éclaircissements,

A bientôt.
Avatar
Jacques L'helgoualc'h
Le 12-09-2008, Astie a écrit :
Astier a écrit :

Bonjour,



bonjour,

Désolé de "déterrer" ce topic, mais j'ai pris le temps de me mettre les
mains dans le cambouis.

Pour AucTeX, j'ai un raccourci conditionnel :

(define-key LaTeX-mode-map (kbd "C-c f") 'my-frac-or-foot)






[...]
(defun my-frac-or-foot ()
"Insère une fraction ou une footnote selon le contexte"
(interactive)
(if (texmathp)
(my-fraction)
(my-footnote)))











Donc, si je comprends bien, il faudrait que je fasse un truc dans le genre :

#####
(define-key LaTeX-mode-map (kbd "M-"") 'franguill')
(define-key html-mode-map (kbd "M-"") 'franguill')

(defun franguill ()
"Insère des guillemets français"
(interactive)
(insert "og fg{}")
(backward-char 5))
#####

à moins qu'il faille passer par une condition ?



Heu, la fonction « franguill » est spécifique à (La)TeX, en html il en
faudrait une autre... mon exemple conditionnel concerne deux parties
d'un /même/ buffet en mode LaTeX.


[...] j'utilise un Emacs serveur lancé une fois pour toutes, et
l'appelle par gnuclient : j'ai donc dans mon ~/.xsession une ligne





ok, donc, gnuclient appartient au paquet gnuserv que je viens d'installer.
je suppose que le fichier ~/.xsession est chargé lors du lancement d'une
session graphique ?



Oui.

Si c'est bien le cas, comment cela se passe lorsque
l'on travaille dans les tty ?



ça ne marche pas (avec emacs 21). Il me semble que ça pourrait le faire
avec une version plus récente ?

emacs -iconic -l ~/.elisp21/server.el &





donc on lance un serveur Emacs. Pour lancer emacs par la suite, il
suffit d'appeler emacs ou d'utiliser les lanceurs traditionnels ---
celui de mon tableau de bord correspond à /usr/bin/emacs22 ?



Voilà : un Emacs indépendant ne charge pas le bout de code serveur.

qui charge, après ~/.emacs, le supplément suivant :

,----[ server.el ]
| ;;; serveur de gnuclient
| (when window-system
| (when (fboundp 'gnuserv-start)
| (gnuserv-start)
| (defun adieu ()
| (unless (y-or-n-p "Ça va pas, la tête... ?! ")
| (keyboard-quit)))
| (add-hook 'server-switch-hook
| (lambda ()
| (set-frame-position (make-frame) 0 0)))
| (add-hook 'server-done-hook 'delete-frame)))
`----

et dans mon ~/.emacs, la définition générale d'adieu

(defun adieu ()
(unless (y-or-n-p "Fermer cette instance d'Emacs ?")
(keyboard-quit)))
(add-hook 'kill-emacs-hook
'adieu)





euh... c'est bien un fichier "externe", qui se trouve ici :
~/.elisp21/server.el --- dans mon cas ~/.elisp22/server.el puisque j'ai
emacs22 (ou ça ne change rien) ?



Ça dépend de ce que l'on met dans son ~/.emacs...

J'ai préféré séparer ces répertoires suivant les versions, d'autant que
les *.el doivent être byte-compilés avec la version utilisée.

Mon ~/.emacs, lui, est tout petit, et n'a pas besoin de l'être :

;;; -*-emacs-lisp-*-
(setq debug-on-error t)
(setq message-log-max 300)

(cond
((= emacs-major-version 21) (add-to-list 'load-path (expand-file-name "~/.elisp21")))
((= emacs-major-version 22) (add-to-list 'load-path (expand-file-name "~/.elisp22")))
( t (add-to-list 'load-path (expand-file-name "~/.elisp"))))

(setq custom-file "~/.custom") ;; il faudra sans doute distinguer selon
;; la version aussi...
(if (> emacs-major-version 20)
(load custom-file))

(load-library "emacs") ;; charge un de mes ~/.elisp2?/emacs.el


Tout à la fin de ce(s) dernier(s), j'ai un
(require 'trucs)
qui charge trucs.el, pour éviter de byte-compiler à chaque essai le
fichier principal

De plus, si je me crée plusieurs ~/.emacs --- par exemple ~/.emacstex et
~/.emacshtml, comment faire pour les appeler au juste ? J'ai regardé
dans le man d'emacs et il ne m'a pas semblé voir d'option permettant de
choisir l'init file.



Ben, tu peux utiliser les options

--no-init-file, -q load neither ~/.emacs nor default.el

et

--load, -l FILE load FILE of Emacs Lisp code using the load function

pour charger ~/.montrucenplumes.el, mais pour un mode particulier, le
plus simple est d'avoir des fichiers dédiés, chargés en cas de besoin :

;;; blank-mode
(autoload 'blank-mode "blank-mode"
"Toggle blank visualization." t)
(autoload 'blank-mode-customize "blank-mode"
"Customize blank visualization." t)
(global-set-key [f6] 'blank-mode)

À l'appel d'une des fonctions « 'blank-mode... », le fichier
"blank-mode" (.el, voire .elc) sera chargé (si besoin (et s'il
est trouvé dans le load-path)).


Le « local-set-key » est encore plus spécialisé, il me semble que la
méthode du *-mode-map est mieux adaptée aux raccourcis qui sont définis
une fois pour toutes au premier chargement du mode :

(eval-after-load "latex" '(my-LaTeX-init))

avec mes ajouts de LaTeX-mode-map dans la fonction appelée.





Là j'ai du mal à saisir...



J'ai rassemblé dans la fonction my-LaTeX-init mes nombreuses
définitions, initialisations, etc. ne concernant qu'AUCTeX...

Le « eval-after-load » ne l'exécutera qu'une fois.


Merci pour vos éclaircissements,



De rien, ça me permet de faire améliorer/remplacer mes bouts de code
(souvent pêchés ailleurs...) par les autres contributeurs.

A bientôt.



Au plaisir,
--
Jacques L'helgoualc'h
Avatar
Jacques L'helgoualc'h
Le 12-09-2008, Astie a écrit :
Astier a écrit :

Bonjour,



bonjour,

Désolé de "déterrer" ce topic, mais j'ai pris le temps de me mettre les
mains dans le cambouis.

Pour AucTeX, j'ai un raccourci conditionnel :

(define-key LaTeX-mode-map (kbd "C-c f") 'my-frac-or-foot)






[...]
(defun my-frac-or-foot ()
"Insère une fraction ou une footnote selon le contexte"
(interactive)
(if (texmathp)
(my-fraction)
(my-footnote)))











Donc, si je comprends bien, il faudrait que je fasse un truc dans le genre :

#####
(define-key LaTeX-mode-map (kbd "M-"") 'franguill')
(define-key html-mode-map (kbd "M-"") 'franguill')

(defun franguill ()
"Insère des guillemets français"
(interactive)
(insert "og fg{}")
(backward-char 5))
#####

à moins qu'il faille passer par une condition ?



Heu, la fonction « franguill » est spécifique à (La)TeX, en html il en
faudrait une autre... mon exemple conditionnel concerne deux parties
d'un /même/ buffer en mode LaTeX.


[...] j'utilise un Emacs serveur lancé une fois pour toutes, et
l'appelle par gnuclient : j'ai donc dans mon ~/.xsession une ligne





ok, donc, gnuclient appartient au paquet gnuserv que je viens d'installer.
je suppose que le fichier ~/.xsession est chargé lors du lancement d'une
session graphique ?



Oui.

Si c'est bien le cas, comment cela se passe lorsque
l'on travaille dans les tty ?



ça ne marche pas (avec emacs 21). Il me semble que ça pourrait le faire
avec une version plus récente ?

emacs -iconic -l ~/.elisp21/server.el &





donc on lance un serveur Emacs. Pour lancer emacs par la suite, il
suffit d'appeler emacs ou d'utiliser les lanceurs traditionnels ---
celui de mon tableau de bord correspond à /usr/bin/emacs22 ?



Voilà : un Emacs indépendant ne charge pas le bout de code serveur.

qui charge, après ~/.emacs, le supplément suivant :

,----[ server.el ]
| ;;; serveur de gnuclient
| (when window-system
| (when (fboundp 'gnuserv-start)
| (gnuserv-start)
| (defun adieu ()
| (unless (y-or-n-p "Ça va pas, la tête... ?! ")
| (keyboard-quit)))
| (add-hook 'server-switch-hook
| (lambda ()
| (set-frame-position (make-frame) 0 0)))
| (add-hook 'server-done-hook 'delete-frame)))
`----

et dans mon ~/.emacs, la définition générale d'adieu

(defun adieu ()
(unless (y-or-n-p "Fermer cette instance d'Emacs ?")
(keyboard-quit)))
(add-hook 'kill-emacs-hook
'adieu)





euh... c'est bien un fichier "externe", qui se trouve ici :
~/.elisp21/server.el --- dans mon cas ~/.elisp22/server.el puisque j'ai
emacs22 (ou ça ne change rien) ?



Ça dépend de ce que l'on met dans son ~/.emacs...

J'ai préféré séparer ces répertoires suivant les versions, d'autant que
les *.el doivent être byte-compilés avec la version utilisée.

Mon ~/.emacs, lui, est tout petit, et n'a pas besoin de l'être :

;;; -*-emacs-lisp-*-
(setq debug-on-error t)
(setq message-log-max 300)

(cond
((= emacs-major-version 21) (add-to-list 'load-path (expand-file-name "~/.elisp21")))
((= emacs-major-version 22) (add-to-list 'load-path (expand-file-name "~/.elisp22")))
( t (add-to-list 'load-path (expand-file-name "~/.elisp"))))

(setq custom-file "~/.custom") ;; il faudra sans doute distinguer selon
;; la version aussi...
(if (> emacs-major-version 20)
(load custom-file))

(load-library "emacs") ;; charge un de mes ~/.elisp2?/emacs.el


Tout à la fin de ce(s) dernier(s), j'ai un
(require 'trucs)
qui charge trucs.el, pour éviter de byte-compiler à chaque essai le
fichier principal

De plus, si je me crée plusieurs ~/.emacs --- par exemple ~/.emacstex et
~/.emacshtml, comment faire pour les appeler au juste ? J'ai regardé
dans le man d'emacs et il ne m'a pas semblé voir d'option permettant de
choisir l'init file.



Ben, tu peux utiliser les options

--no-init-file, -q load neither ~/.emacs nor default.el

et

--load, -l FILE load FILE of Emacs Lisp code using the load function

pour charger ~/.montrucenplumes.el, mais pour un mode particulier, le
plus simple est d'avoir des fichiers dédiés, chargés en cas de besoin :

;;; blank-mode
(autoload 'blank-mode "blank-mode"
"Toggle blank visualization." t)
(autoload 'blank-mode-customize "blank-mode"
"Customize blank visualization." t)
(global-set-key [f6] 'blank-mode)

À l'appel d'une des fonctions « 'blank-mode... », le fichier
"blank-mode" (.el, voire .elc) sera chargé (si besoin (et s'il
est trouvé dans le load-path)).


Le « local-set-key » est encore plus spécialisé, il me semble que la
méthode du *-mode-map est mieux adaptée aux raccourcis qui sont définis
une fois pour toutes au premier chargement du mode :

(eval-after-load "latex" '(my-LaTeX-init))

avec mes ajouts de LaTeX-mode-map dans la fonction appelée.





Là j'ai du mal à saisir...



J'ai rassemblé dans la fonction my-LaTeX-init mes nombreuses
définitions, initialisations, etc. ne concernant qu'AUCTeX...

Le « eval-after-load » ne l'exécutera qu'une fois.


Merci pour vos éclaircissements,



De rien, ça me permet de faire améliorer/remplacer mes bouts de code
(souvent pêchés ailleurs...) par les autres contributeurs.

A bientôt.



Au plaisir,
--
Jacques L'helgoualc'h
Avatar
Astier
Jacques L'helgoualc'h a écrit :
bonjour,



Bonjour,

Pour AucTeX, j'ai un raccourci conditionnel :

(define-key LaTeX-mode-map (kbd "C-c f") 'my-frac-or-foot)






[...]
(defun my-frac-or-foot ()
"Insère une fraction ou une footnote selon le contexte"
(interactive)
(if (texmathp)
(my-fraction)
(my-footnote)))










Donc, si je comprends bien, il faudrait que je fasse un truc dans le genre :

#####
(define-key LaTeX-mode-map (kbd "M-"") 'franguill')
(define-key html-mode-map (kbd "M-"") 'franguill')

(defun franguill ()
"Insère des guillemets français"
(interactive)
(insert "og fg{}")
(backward-char 5))
#####

à moins qu'il faille passer par une condition ?



Heu, la fonction « franguill » est spécifique à (La)TeX, en html il en
faudrait une autre... mon exemple conditionnel concerne deux parties
d'un /même/ buffer en mode LaTeX.




Ok, c'est maintenant clair. Il faut donc qu'une même combinaison de
touches appelle deux fonctions différentes, chacune d'entre elles
s'appliquant à un certain mode.

[...] j'utilise un Emacs serveur lancé une fois pour toutes, et
l'appelle par gnuclient : j'ai donc dans mon ~/.xsession une ligne





ok, donc, gnuclient appartient au paquet gnuserv que je viens d'installer.
je suppose que le fichier ~/.xsession est chargé lors du lancement d'une
session graphique ?



Oui.

Si c'est bien le cas, comment cela se passe lorsque
l'on travaille dans les tty ?



ça ne marche pas (avec emacs 21). Il me semble que ça pourrait le faire
avec une version plus récente ?


J'essaierai prochainement avec la version 22.2.1

emacs -iconic -l ~/.elisp21/server.el &





donc on lance un serveur Emacs. Pour lancer emacs par la suite, il
suffit d'appeler emacs ou d'utiliser les lanceurs traditionnels ---
celui de mon tableau de bord correspond à /usr/bin/emacs22 ?



Voilà : un Emacs indépendant ne charge pas le bout de code serveur.

qui charge, après ~/.emacs, le supplément suivant :

,----[ server.el ]
| ;;; serveur de gnuclient
| (when window-system
| (when (fboundp 'gnuserv-start)
| (gnuserv-start)
| (defun adieu ()
| (unless (y-or-n-p "Ça va pas, la tête... ?! ")
| (keyboard-quit)))
| (add-hook 'server-switch-hook
| (lambda ()
| (set-frame-position (make-frame) 0 0)))
| (add-hook 'server-done-hook 'delete-frame)))
`----

et dans mon ~/.emacs, la définition générale d'adieu

(defun adieu ()
(unless (y-or-n-p "Fermer cette instance d'Emacs ?")
(keyboard-quit)))
(add-hook 'kill-emacs-hook
'adieu)





euh... c'est bien un fichier "externe", qui se trouve ici :
~/.elisp21/server.el --- dans mon cas ~/.elisp22/server.el puisque j'ai
emacs22 (ou ça ne change rien) ?



Ça dépend de ce que l'on met dans son ~/.emacs...

J'ai préféré séparer ces répertoires suivant les versions, d'autant que
les *.el doivent être byte-compilés avec la version utilisée.

Mon ~/.emacs, lui, est tout petit, et n'a pas besoin de l'être :

;;; -*-emacs-lisp-*-
(setq debug-on-error t)
(setq message-log-max 300)

(cond
((= emacs-major-version 21) (add-to-list 'load-path (expand-file-name "~/.elisp21")))
((= emacs-major-version 22) (add-to-list 'load-path (expand-file-name "~/.elisp22")))
( t (add-to-list 'load-path (expand-file-name "~/.elisp"))))

(setq custom-file "~/.custom") ;; il faudra sans doute distinguer selon
;; la version aussi...
(if (> emacs-major-version 20)
(load custom-file))

(load-library "emacs") ;; charge un de mes ~/.elisp2?/emacs.el




Donc si je comprends bien, on a un ~/.emacs global, avec des définitions
"classiques", genre : taille et "apparence" de la fenêtre, thème
utilisé, fonte, raccourcis génériques... qui ensuite, selon le mode
appelé charge un fichier de configuration particulier, comme ceci :
####
(cond
((= LaTeX-mode) (add-to-list 'load-path (expand-file-name
"~/.elisp22/latex")))
((= html-mode) (add-to-list 'load-path (expand-file-name
"~/.elisp22/html")))
(load-library "emacs")
#####
c'est bien cela ?
Sinon, à quoi sert le fichier ~/.custom qui est chargé --- si je saisis
--- lorsque tu charges un emacs dont la version est inférieure à 20 ?
D'ailleurs, pourquoi utiliser différentes versions d'emacs ?

Tout à la fin de ce(s) dernier(s), j'ai un
(require 'trucs)
qui charge trucs.el, pour éviter de byte-compiler à chaque essai le
fichier principal



Encore une fois, j'ai du mal à saisir :/

De plus, si je me crée plusieurs ~/.emacs --- par exemple ~/.emacstex et
~/.emacshtml, comment faire pour les appeler au juste ? J'ai regardé
dans le man d'emacs et il ne m'a pas semblé voir d'option permettant de
choisir l'init file.



Ben, tu peux utiliser les options

--no-init-file, -q load neither ~/.emacs nor default.el

et

--load, -l FILE load FILE of Emacs Lisp code using the load function

pour charger ~/.montrucenplumes.el, mais pour un mode particulier, le
plus simple est d'avoir des fichiers dédiés, chargés en cas de besoin :

;;; blank-mode
(autoload 'blank-mode "blank-mode"
"Toggle blank visualization." t)
(autoload 'blank-mode-customize "blank-mode"
"Customize blank visualization." t)
(global-set-key [f6] 'blank-mode)

À l'appel d'une des fonctions « 'blank-mode... », le fichier
"blank-mode" (.el, voire .elc) sera chargé (si besoin (et s'il
est trouvé dans le load-path)).



Alors, je comprends bien la portée limitée de passer par le chargement
d'un fichier spécifique, mais je ne saisis pas trop le bout de code
ci-dessus : n'est-ce pas déjà ce que l'on fait avec le code "avec
condition" dans le ~/.emacs (code entre ####) ?


Le « local-set-key » est encore plus spécialisé, il me semble que la
méthode du *-mode-map est mieux adaptée aux raccourcis qui sont définis
une fois pour toutes au premier chargement du mode :

(eval-after-load "latex" '(my-LaTeX-init))

avec mes ajouts de LaTeX-mode-map dans la fonction appelée.




Là j'ai du mal à saisir...



J'ai rassemblé dans la fonction my-LaTeX-init mes nombreuses
définitions, initialisations, etc. ne concernant qu'AUCTeX...


Ok, mais alors quelle est la forme de cette fonction ? Dans quel fichier
se place-t-elle ? Dans le fichier ~/.emacs ou dans le .emacs spécifique
à latex ?
Et par curiosité, quelle sont vos "nombreuses définitions,
initialisations, etc. ne concernant qu'AUCTeX" ?

Le « eval-after-load » ne l'exécutera qu'une fois.



Comment ça ?

Merci pour vos éclaircissements,



De rien, ça me permet de faire améliorer/remplacer mes bouts de code
(souvent pêchés ailleurs...) par les autres contributeurs.

A bientôt.



Au plaisir,



Désolé si certaines de mes questions sont "simplistes" mais j'essaye de
poursuivre ma compréhension d'emacs.

Merci encore, à bientôt.
Avatar
Jacques L'helgoualc'h
Le 13-09-2008, Astier a écrit :
Jacques L'helgoualc'h a écrit :


[...]
J'ai préféré séparer ces répertoires suivant les versions, d'autant que
les *.el doivent être byte-compilés avec la version utilisée.

Mon ~/.emacs, lui, est tout petit, et n'a pas besoin de l'être :

;;; -*-emacs-lisp-*-
(setq debug-on-error t)
(setq message-log-max 300)

(cond
((= emacs-major-version 21) (add-to-list 'load-path (expand-file-name "~/.elisp21")))
((= emacs-major-version 22) (add-to-list 'load-path (expand-file-name "~/.elisp22")))
( t (add-to-list 'load-path (expand-file-name "~/.elisp"))))

(setq custom-file "~/.custom") ;; il faudra sans doute distinguer selon
;; la version aussi...
(if (> emacs-major-version 20)
(load custom-file))

(load-library "emacs") ;; charge un de mes ~/.elisp2?/emacs.el



Donc si je comprends bien, on a un ~/.emacs global, avec des définitions
"classiques", genre : taille et "apparence" de la fenêtre, thème
utilisé, fonte, raccourcis génériques... qui ensuite, selon le mode
appelé charge un fichier de configuration particulier, comme ceci :
####


[...]
(load-library "emacs")
#####
c'est bien cela ?



Pas tout à fait : ~/.emacs est ultra-minimal, et devrait être compatible
avec toutes les versions... d'une version majeure à l'autre, les thèmes,
fontes, etc. et/ou la façon de les configurer peuvent varier, devenir
obsolètes, ... --- pour les modes, voir plus bas.

Une fois le load-path complété, Emacs y trouvera son emacs.el

Sinon, à quoi sert le fichier ~/.custom qui est chargé



La notion de « custom-file » semble être apparue avec la version 21, et
stocke les « customisations » obtenues via le buffer *Customize*. J'ai
voulu éviter qu'Emacs écrive ces dernières directement dans ~/.emacs :
outre le partage entre versions, je peux aussi partager mon ~/.emacs
entre plusieurs utilisateurs (moi-latex, moi-root, moi-testeur-fou ...)
sans casser tous mes Emacs.

D'ailleurs, pourquoi utiliser différentes versions d'emacs ?



Au moins pendant la phase de transition entre deux versions majeures ---
Debian Etch en est encore à emacs21.

Tout à la fin de ce(s) dernier(s), j'ai un
(require 'trucs)
qui charge trucs.el, pour éviter de byte-compiler à chaque essai le
fichier principal



Encore une fois, j'ai du mal à saisir :/



Je mets les bouts d'elisp glanés ici et là ou fait maison dans trucs.el,
et quand ils me semblent satisfaisants, je les déplace dans le fichier
principal ; la byte-compilation (fichier.el ---> fichier.elc) accélère
le chargement du code, mais devient caduque à la moindre modification de
fichier.el (Emacs compare les dates).

[...]
;;; blank-mode
(autoload 'blank-mode "blank-mode"
"Toggle blank visualization." t)
(autoload 'blank-mode-customize "blank-mode"
"Customize blank visualization." t)
(global-set-key [f6] 'blank-mode)

À l'appel d'une des fonctions « 'blank-mode... », le fichier
"blank-mode" (.el, voire .elc) sera chargé (si besoin (et s'il
est trouvé dans le load-path)).



Alors, je comprends bien la portée limitée de passer par le chargement
d'un fichier spécifique, mais je ne saisis pas trop le bout de code
ci-dessus :



Au premier appel (appui sur F6) de la fonction blank-mode, le fichier
blank-mode.el qui la définit sera chargé.

n'est-ce pas déjà ce que l'on fait avec le code "avec
condition" dans le ~/.emacs (code entre ####) ?

####
(cond
((= LaTeX-mode) (add-to-list 'load-path (expand-file-name
"~/.elisp22/latex")))
((= html-mode) (add-to-list 'load-path (expand-file-name
"~/.elisp22/html")))
####



Le load-path est une liste de répertoires, est-ce que tu veux utiliser
un ~/.elisp22/html/ (contenant plusieurs *.el) ?

Ton bout de code, s'il marchait, complèterait (si besoin) le load-path,
mais ne chargera pas un *fichier* ~/.elisp22/html.el.

Si je l'essaie,

Debugger entered--Lisp error: (wrong-number-of-arguments #<subr => 1)
(= LaTeX-mode)
(cond ((= LaTeX-mode) (add-to-list ... ...)) ((= html-mode) (add-to-list ... ...)))
eval((cond ((= LaTeX-mode) (add-to-list ... ...)) ((= html-mode) (add-to-list ... ...))))
eval-last-sexp-1(nil)
eval-last-sexp(nil)
call-interactively(eval-last-sexp)

La fonction = attend deux arguments à comparer, comme dans

(= emacs-major-version 21)

et LaTeX-mode est une commande, pas une variable...

M-x apropos RET = RET
M-x apropos RET LaTeX-mode RET

t'en diront davantage.


Le « local-set-key » est encore plus spécialisé, il me semble que la
méthode du *-mode-map est mieux adaptée aux raccourcis qui sont définis
une fois pour toutes au premier chargement du mode :

(eval-after-load "latex" '(my-LaTeX-init))

avec mes ajouts de LaTeX-mode-map dans la fonction appelée.




Là j'ai du mal à saisir...



J'ai rassemblé dans la fonction my-LaTeX-init mes nombreuses
définitions, initialisations, etc. ne concernant qu'AUCTeX...


Ok, mais alors quelle est la forme de cette fonction ? Dans quel fichier
se place-t-elle ? Dans le fichier ~/.emacs ou dans le .emacs spécifique
à latex ?



Dans mon fichier

(concat "~/.elisp" (number-to-string emacs-major-version) "/emacs.el")

mais tu peux utiliser un ~/.emacs22.d/latex.el si tu préfères ne pas le
charger systématiquement : comme mon serveur Emacs peut tourner pendant
plusieurs semaines d'affilée, c'est bien le diable si le LaTeX-mode ne
s'active pas...

Et par curiosité, quelle sont vos "nombreuses définitions,
initialisations, etc. ne concernant qu'AUCTeX" ?



Il y a sûrement des améliorations à apporter :

(defun my-LaTeX-init ()
"Définitions pour le LaTeX-mode"

;; pour auctex
(defcustom LaTeX-equation-label "eq-"
"*Default prefix to equation labels."
:group 'LaTeX-label
:type 'string)

(setq-default
tex-dvi-view-command "/usr/bin/xdvi"
tex-dvi-print-command "lpr"
TeX-auto-save t
TeX-parse-self t
TeX-master nil
;; Postscript
ps-paper-type 'a4
;; LaTeX
LaTeX-command-style '( ;;("^french$" "frlatex") ; ligne à ajouter
("." "latex")))

;; Auctex - math-abbrev-prefix = ² (kbd "²")
;; (setq LaTex-math-abbrev-prefix [2226])
;;LaTeX-math-abbrev-prefix [?262])

(defun my-LaTeX-setup ()
"Configuration LaTeX-mode"
(interactive)
(auto-fill-mode t)
(setq fill-column 100 ; <-texte->
ispell-parser 'tex
TeX-insert-braces nil)
(LaTeX-math-mode t)
(when window-system
(flyspell-mode 1)))

(add-hook 'LaTeX-mode-hook 'my-LaTeX-setup)

(defun my-displaymaths ()
"Ouvre un « displaymath »"
(interactive)
(newline-and-indent)
(indent-for-tab-command)
(insert "begin{displaymath}")
(newline-and-indent)
(newline-and-indent)
(insert "end{displaymath}")
(indent-for-tab-command)
(previous-line 1)
(indent-for-tab-command))

(defun my-display-maths ()
"Ouvre un « displaymaths »"
(interactive)
(newline-and-indent)
(indent-for-tab-command)
(insert "[")
(newline-and-indent)
(newline-and-indent)
(insert "]")
(indent-for-tab-command)
(previous-line 1)
(indent-for-tab-command))

(defun my-footnote ()
"Ouvre une footnote"
(interactive)
(search-backward-regexp "[])>».,[:alnum:]]")
(forward-char)
(insert "footnote{%n .}")
(newline-and-indent)
(beginning-of-line)
(backward-char 4))

(defun my-fraction ()
"Insère une fraction"
(interactive)
(insert "frac{}{}")
(backward-char 3))

(defun my-display-fraction ()
"Insère une grande fraction"
(interactive)
(insert "dfrac{}{}")
(backward-char 3))

(defun my-frac-or-foot ()
"Insère une fraction ou une footnote selon le contexte"
(interactive)
(if (texmathp)
(my-fraction)
(my-footnote)))

(defun my-nombre ()
"Insère "nombre{}""
(interactive)
(insert "nombre{}")
(backward-char 1))

(defun index-current-word ()
"Indexe le mot sous ou précédant le curseur"
(interactive)
(forward-char)
(backward-word 1)
(forward-word 1)
(insert (concat "index{" (current-word) "}")))

(defun my-label ()
"Ouvre un label"
(interactive)
(forward-char)
(backward-word 1)
(insert "label{}")
(backward-char 1))

(defun my-latex-keys ()
"Touches LaTeX"
(interactive)
(setq skeleton-pair t)
(define-key LaTeX-mode-map "$" 'skeleton-pair-insert-maybe)
(define-key LaTeX-mode-map "{" 'skeleton-pair-insert-maybe)
(define-key LaTeX-mode-map "(" 'skeleton-pair-insert-maybe)
(define-key LaTeX-mode-map "[" 'skeleton-pair-insert-maybe)
(define-key LaTeX-mode-map (kbd "C-c f") 'my-frac-or-foot)
(define-key LaTeX-mode-map (kbd "C-c F") 'my-display-fraction)
(define-key LaTeX-mode-map (kbd "C-c n") 'my-nombre)
(define-key LaTeX-mode-map [S-f12] 'wysiwyg-latex-tabular)
(define-key LaTeX-mode-map (kbd "C-c !") 'TeX-next-error)
(define-key LaTeX-mode-map (kbd "C-c i") 'index-current-word)
(define-key LaTeX-mode-map (kbd "C-c l") 'my-label)
(define-key LaTeX-mode-map (kbd "C-c m") 'my-display-maths)
(setq LaTex-math-abbrev-prefix (kbd "<pause>")))

(my-latex-keys)

;; reftex -- D. Kastrup
(require 'reftex)
(add-hook 'LaTeX-mode-hook 'turn-on-reftex)
(setq reftex-plug-into-AUCTeX t)

(require 'font-latex))

Le « eval-after-load » ne l'exécutera qu'une fois.



Comment ça ?



(eval-after-load "latex" '(my-LaTeX-init))

Une fois le fichier latex.el chargé, les diverses définitions resteront
disponibles pour tous les fichiers *.tex...

[...]
Désolé si certaines de mes questions sont "simplistes" mais j'essaye de
poursuivre ma compréhension d'emacs.



moi aussi :)

Merci encore, à bientôt.



de rien,
--
Jacques L'helgoualc'h
1 2 3 4