IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Applications et environnements graphiques Discussion :

exécuter une commande au démarrage d'emacs


Sujet :

Applications et environnements graphiques

  1. #1
    Candidat au Club
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut exécuter une commande au démarrage d'emacs
    Bonjour à tous, j'ai une question à propos de la personnalisation d'emacs.

    Je n'aime pas trop l'affichage des numéros de lignes dans la barre de statut, c'est plus pratique pour moi d'avoir cette information affichée dans la marge de gauche de chaque ligne comme dans la plupart des éditeurs.

    Cette option n'est bizarrement pas disponible par défaut dans emacs mais peut être ajoutée très facilement grâce à un des nombreux script elisp disponibles sur le web. J'utilise une version modifiée de lineno.el.

    J'active ça en 2 lignes dans mon .emacs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (require 'lineno)
    (global-set-key [f12] 'lineno-minor-mode)
    Je peux ensuite afficher les numéros de ligne avec "M-x lineno-minor-mode" ou en appuyant sur la touche [f12].

    Mon problème est que je voudrais ne pas avoir à appeler cette fonction, j'aimerai que ce mode soit activé automatiquement quand j'ouvre un fichier...

    J'ai essayé d'ajouté (setq lineno-minor-mode t) à mon .emacs mais ça ne marche pas...

    Comment faire pour forcer emacs à activer ce mode au démarrage ? Et de façon générale peut-on forcer emacs à executer une commande "M-x ..." au démarrage ?

    Merci d'avance

  2. #2
    Membre expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Points : 3 378
    Points
    3 378
    Par défaut
    Bonjour et bienvenue,
    Citation Envoyé par 0nce_ Voir le message
    Et de façon générale peut-on forcer emacs à executer une commande "M-x ..." au démarrage ?
    Ça, aucune idée, mais j'aimerais bien savoir également.

    Citation Envoyé par 0nce_ Voir le message
    Comment faire pour forcer emacs à activer ce mode au démarrage ? Et de façon générale peut-on forcer emacs à executer une commande "M-x ..." au démarrage ?
    Là en revanche, j'ai trouvé un truc qui marche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ;; Affichage des numeros de lignes à l'ouverture du fichier:
    (add-hook 'find-file-hook
              'lineno-minor-mode
              )
    On doit pouvoir l'appliquer à certains types de fichiers uniquement, en l'ajoutant simplement aux ...-hook adéquats.
    Forum LaTeX : pour des réponses rapides et appropriées, pensez à poster un
    ECM = Exemple (reproduit le problème) Complet (document compilable) Minimal (ne postez pas votre thèse !)

    Une solution vous convient ? N'oubliez pas le tag


    )><))))°>

  3. #3
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    Sauf erreur de ma part, il te suffit d'appeler ta commande dans ton .emacs :

    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par pitipoisson Voir le message
    Bonjour et bienvenue,

    Citation:
    Envoyé par 0nce_
    Et de façon générale peut-on forcer emacs à executer une commande "M-x ..." au démarrage ?

    Ça, aucune idée, mais j'aimerais bien savoir également.

    Bonjour,

    je ne comprends pas la difficulté ?

    Si tu veux exécuter une commande au démarrage, il suffit de la mettre dans ton .emacs, non?

    Une commande n'est jamais qu'une fonction interactive, c'est-à-dire une fonction qui peut être exécutée interactivement.

    Mais toutes les fonctions (interactives ou non) peuvent être exécutées depuis un interprète lisp (genre ielm) ou depuis un fichier interprété (genre .emacs).

    Par exemple, si tu veux exécuter l'équivalent de M-x line-number-mode RET, il suffit de mettre dans ton .emacs quelque chose comme (line-number-mode 1).

    Ai-je loupé quelque chose dans ta question?

    )jack(

    PS: pour exécuter interactivement une commande depuis une fonction lisp, on peut utiliser quelque chose comme (call-interactively 'line-number-mode).

  5. #5
    Candidat au Club
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour les réponses !

    Par exemple, si tu veux exécuter l'équivalent de M-x line-number-mode RET, il suffit de mettre dans ton .emacs quelque chose comme (line-number-mode 1).
    Ben justement c'est ce que j'ai fait au début mais ce n'est pas aussi simple...

    Apparemment j'ai réussi à résoudre le problème donc j'indique ici la solution au cas où quelqu'un d'autre serait intéressé.

    Pour activer un mode mineur au démarrage d'emacs, il faut le lier à un ou plusieurs modes majeurs. Donc dans mon fichier .emacs j'ai ajouté les lignes suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (defun activate-at-startup ()
      (lineno-minor-mode 1))
     
    (add-hook 'c-mode-hook 'activate-at-startup)
    (add-hook 'emacs-lisp-mode-hook 'activate-at-startup)
    (add-hook 'text-mode-hook 'activate-at-startup)
    (add-hook 'fundamental-mode-hook 'activate-at-startup)


    Par contre je n'ai pas trouvé de "super-mode" qui englobe tous les autres donc il semble obligatoire de lister tous les modes majeurs pour lesquels on veut activer le mode mineur.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par 0nce_ Voir le message
    Merci pour les réponses !



    Ben justement c'est ce que j'ai fait au début mais ce n'est pas aussi simple...

    Apparemment j'ai réussi à résoudre le problème donc j'indique ici la solution au cas où quelqu'un d'autre serait intéressé.

    Pour activer un mode mineur au démarrage d'emacs, il faut le lier à un ou plusieurs modes majeurs. Donc dans mon fichier .emacs j'ai ajouté les lignes suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (defun activate-at-startup ()
      (lineno-minor-mode 1))
     
    (add-hook 'c-mode-hook 'activate-at-startup)
    (add-hook 'emacs-lisp-mode-hook 'activate-at-startup)
    (add-hook 'text-mode-hook 'activate-at-startup)
    (add-hook 'fundamental-mode-hook 'activate-at-startup)


    Par contre je n'ai pas trouvé de "super-mode" qui englobe tous les autres donc il semble obligatoire de lister tous les modes majeurs pour lesquels on veut activer le mode mineur.
    Bonjour,

    j'avais écrit un long message, mais j'ai tout perdu :-( Merci, IE...

    En résumé, il ne faut pas confondre démarrage d'emacs et ouverture d'un fichier. Il ne faut pas confondre global à emacs et local à un buffer.

    Russell Young a choisi de faire un mode mineur local à chaque buffer.

    Du coup, ta solution est la bonne! Tu indiques à emacs que, à chaque fois qu'un buffer passe dans un des modes que tu utilises (donc, en gros, à l'ouverture d'un fichier), tu souhaites utiliser, pour ce buffer, le mode mineur.

    Rq: la solution de pitipoisson devrait fonctionner aussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ;; Affichage des numeros de lignes à l'ouverture du fichier:
    (add-hook 'find-file-hook
              'lineno-minor-mode
              )

    On pourrait aussi en faire un mode global en ajoutant à "lineno.el" quelque chose comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    (defun lineno-major-mode (&optional force)
      (interactive)
      (if (or (and (not force) lineno-change-overlay) (and force (<= force 0))) 
    	  (lineno-off)
        (add-hook 'post-command-hook 'lineno-major-post-command)))
     
    (defun lineno-major-post-command ()
      (unless lineno-change-overlay
        (setq lineno-change-overlay (make-overlay 0 (+ 2 (buffer-size)) nil nil t)
              lineno-window-limits '(-1 . 0)
              lineno-update-from nil)
        (overlay-put lineno-change-overlay 'modification-hooks '(lineno-modification))
        (overlay-put lineno-change-overlay 'insert-in-front-hooks '(lineno-modification))
        (overlay-put lineno-change-overlay 'insert-behind-hooks '(lineno-modification))
        (overlay-put lineno-change-overlay 'lineno t))
      (lineno-post-command))
    puis, dans le .emacs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    (require 'lineno)
    (lineno-major-mode 1)
    Le principe est d'ajouter le mode au hook post-command-hook global et non au hook local (cf. dernier argument de add-hook).

    J'ai essayé et ça a l'air de fonctionner assez bien, mais, comme c'est global, ça affecte tous les buffers, y compris le minibuffer et même la liste des buffers (C-x C-b) et il est possible que cela ait des conséquences imprévues!

    En principe, ce n'est pas trop grave, car, à la première erreur, la variable globale post-command-hook est effacée, ce qui annule le lineno-major-mode.

    Peut-être faudrait-il gérer une liste de buffers interdits et ajouter un test dans le 'unless'...
    à voir...

    )jack(

  7. #7
    Candidat au Club
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ça c'est de la réponse détaillée

    J'avoue que j'étais un peu perdu au début avec ces histoires de modes. Je vais tester ta méthode pour faire de lineno un mode global.

    Merci encore!

  8. #8
    Membre expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Points : 3 378
    Points
    3 378
    Par défaut
    Citation Envoyé par pitipoisson Voir le message
    Citation Envoyé par Once_
    Et de façon générale peut-on forcer emacs à executer une commande "M-x ..." au démarrage ?
    Ça, aucune idée, mais j'aimerais bien savoir également.
    Citation Envoyé par jack-ft Voir le message
    Bonjour,

    je ne comprends pas la difficulté ?
    ...

    Par exemple, si tu veux exécuter l'équivalent de M-x line-number-mode RET, il suffit de mettre dans ton .emacs quelque chose comme (line-number-mode 1).
    En fait j'avais une commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    M-x ess-add-MM-keys RET
    que je n'arrivais pas à inclure dans mon .emacs (de la façon que tu indique, ça me donnais une erreur et ça plantait l'évaluation du .emacs au démarrage).
    Je n'avais juste pas tenté un simple ! (c'est gangsoleil qui m'a mis sur la voie)

    Citation Envoyé par jack-ft Voir le message
    PS: pour exécuter interactivement une commande depuis une fonction lisp, on peut utiliser quelque chose comme (call-interactively 'line-number-mode).
    Pas mal ça, je le garde sous le coude pour l'occase.

    En tout cas, je me joint à Once_ pour vous adresser à tous des remerciements pour vos intéressantes réponses.
    Forum LaTeX : pour des réponses rapides et appropriées, pensez à poster un
    ECM = Exemple (reproduit le problème) Complet (document compilable) Minimal (ne postez pas votre thèse !)

    Une solution vous convient ? N'oubliez pas le tag


    )><))))°>

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par pitipoisson Voir le message
    En fait j'avais une commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    M-x ess-add-MM-keys RET
    que je n'arrivais pas à inclure dans mon .emacs (de la façon que tu indique, ça me donnais une erreur et ça plantait l'évaluation du .emacs au démarrage).
    Euh... en l'occurrence, je ne suis pas sûr de voir clairement ce que tu veux dire par "de la façon que tu indique"...

    Pour la commande ess-add-MM-keys, je ferais la chose suivante:
    C-h f ess-add-MM-keys RET
    pour voir quels sont les arguments attendus par cette fonction et quel est le fichier qui la définit. (Comme je n'ai pas cette fonction chez moi, je ne ne peux pas vraiment le faire).

    Puis, dans .emacs, j'ajouterais quelque chose comme (suivant le fichier):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (require 'MM-fonctions)
    (ess-add-MM-keys)
    Je n'avais juste pas tenté un simple ! (c'est gangsoleil qui m'a mis sur la voie)
    Oui. C'est la manière d'appeler une fonction en lisp! On ouvre une parenthèse, on met le nom de la fonction puis on met les arguments, s'il y en a, et on ferme la parenthèse.

    Pas mal ça, je le garde sous le coude pour l'occase.

    En tout cas, je me joint à Once_ pour vous adresser à tous des remerciements pour vos intéressantes réponses.
    Le genre de situation où j'utilise call-interactively, c'est quand je veux appliquer une commande à la sélection courante ou bien au mot courant si rien n'est sélectionné, comme la fonction jd-backquote-current-sexp, alors que les autres commandes (comme jd-quote-region) s'appliquent exclusivement à la sélection (ainsi qu'en atteste le "(interactive "r")"):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    ;;; [jack] 000518
    (defun jd-backquote-current-sexp ()
      (interactive)
      (if (region-active-p)
          (call-interactively 'jd-backquote-region)
        (let ((point (point)) end)
          (condition-case error
              (backward-sexp)
            (t (forward-sexp)))
          (while (< (point) point)
            (forward-sexp))
          (setq end (point))
          (backward-sexp)
          (jd-backquote-region (point) end))))
     
    ;;; [jack] 020313
    (defun jd-backquote-region (start end)
      (interactive "r")
      (jd-encapsulate-region start end "`" "'"))
     
    (defun jd-quote-region (start end)
      (interactive "r")
      (jd-encapsulate-region start end "\"" "\""))
     
    (defun jd-brace-region (start end)
      (interactive "r")
      (jd-encapsulate-region start end "{" "}"))
     
    (defun jd-encapsulate-region (start end prefix postfix &optional full-lines)
      (interactive "r\nP")
      (goto-char end)
      (when (and full-lines (not (bolp)))
        (forward-line))
      (insert postfix)
      (save-excursion
        (goto-char start)
        (when (and full-lines (not (bolp)))
          (beginning-of-line))
        (insert prefix)))
    HTH

    )jack(

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/01/2011, 12h51
  2. Réponses: 4
    Dernier message: 04/12/2009, 12h18
  3. exécuter une commande de logiciel
    Par MrsFrizz dans le forum C
    Réponses: 4
    Dernier message: 17/01/2006, 10h48
  4. exécuter une commande système à partir de sqlplus?
    Par c_moi_c_moi dans le forum Oracle
    Réponses: 24
    Dernier message: 08/11/2005, 15h11
  5. Exécuter une commande linux.
    Par casafa dans le forum Linux
    Réponses: 4
    Dernier message: 20/07/2005, 23h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo