web-dev-qa-db-fra.com

Utiliser Emacs en tant que IDE

Actuellement, mon flux de travail avec Emacs lorsque je code en C ou C++ implique trois fenêtres. Le plus grand à droite contient le fichier avec lequel je travaille. La gauche est divisée en deux: le bas est un shell que je sais taper pour compiler ou créer des commandes. Le haut est souvent une sorte de documentation ou un fichier README que je souhaite consulter pendant que je travaille. Maintenant, je sais qu’il existe de bons utilisateurs d’Emacs, et je suis curieux de savoir quels autres Emacs sont utiles d’un point de vue fonctionnel si l’intention est de les utiliser comme un IDE complet. Plus précisément, la plupart des IDE remplissent généralement ces fonctions sous une forme ou une autre:

  • Éditeur de code source
  • Compilateur
  • Débogage
  • Consultation de la documentation
  • Contrôle de version
  • Fonctions OO telles que la recherche de classe et l'inspecteur d'objets 

Pour certains d'entre eux, la manière dont Emacs peut s'adapter à ces fonctions est assez évidente, mais qu'en est-il du reste? En outre, si un langage spécifique doit être ciblé, je dirais que ce devrait être le C++. 

Edit: Un utilisateur a fait remarquer que j'aurais dû être plus précis lorsque j'ai dit «et le reste». La plupart du temps, j'étais curieux de savoir comment contrôler efficacement les versions, ainsi que la recherche de documentation. Par exemple, dans SLIME, il est assez facile de faire une recherche hyperspec rapide sur une fonction LISP. Existe-t-il un moyen rapide de rechercher quelque chose dans la documentation C++ STL (si j'avais oublié la syntaxe exacte de hash_map , par exemple)?

163
user7545

Vous devrez préciser ce que vous entendez par "le reste". À l'exception de l'inspecteur d'objets (que je connais bien), emacs fait tout ce qui précède assez facilement:

  • éditeur (évident)
  • compilateur - lancez simplement M-x compile et entrez votre commande de compilation. A partir de là, vous pouvez simplement M-x compile et utiliser la valeur par défaut. Emacs capturera les erreurs du compilateur C/C++ (fonctionne mieux avec GCC) et vous aidera à naviguer dans les lignes contenant des avertissements ou des erreurs.
  • Débogage - de la même manière, lorsque vous souhaitez déboguer, saisissez M-x gdb pour créer un tampon gdb avec des liaisons spéciales.
  • Documentation Lookup - emacs dispose d'excellentes liaisons CScope pour la navigation dans le code. Pour les autres documentations: Emacs a aussi un lecteur de pages de manuel, et pour tout le reste, il y a le Web et les livres.
  • contrôle de version - il y a beaucoup de liaisons Emacs pour différents backends VCS (CVS, SCCS, RCS, SVN, GIT)

Edit: Je réalise que ma réponse à propos de la recherche de documentation concernait réellement la navigation dans le code. Voici quelques informations supplémentaires utiles: 

La recherche sur Google révélera sans aucun doute d'autres exemples.

Comme le montre le deuxième lien, il est possible de rechercher des fonctions (et autres) dans une autre documentation, même si elles ne sont pas prises en charge immédiatement.

73
Ben Collins

Je dois recommander Emacs Code Browser comme un environnement de style plus "traditionnel" IDE pour emacs.

EDIT: Je recommande maintenant aussi Magit fortement par rapport à l'interface VCS standard dans emacs.

29
baudtack

Au lieu d'exécuter une commande make dans la fenêtre du shell, avez-vous essayé de compiler M-x? Il lancera votre commande make, affichera des erreurs et, dans de nombreux cas, vous permettra de passer facilement à la ligne de code à l'origine de l'erreur si la sortie comprend des noms de fichier et des numéros de ligne.

Si vous êtes un fan des IDE, vous voudrez peut-être aussi regarder le paquet speedbar d’emacs (speedbar M-x). Et, si vous ne l'avez pas déjà fait, découvrez comment utiliser les tableaux de balises pour naviguer dans votre code.

19
Bryan Oakley

Il y a des coins d'emacs qui, une fois découverts, vous rendent plus productif d'une manière que vous n'aviez jamais imaginée. Comme d'autres l'ont mentionné, l'utilisation de balises est un moyen fantastique et rapide de zoomer sur votre code source et utiliser M-/(dabbrev-expand) fait souvent exactement ce que vous attendez du nom de variable. 

Il est utile d’avoir recours à execute pour obtenir un tampon avec toutes les occurrences d’une expression régulière dans un tampon. C'est très pratique pour refactoriser du code et rechercher des fragments de code ou des utilisations de variables, ou si vous utilisez des marqueurs TODO dans vos fichiers source et que vous souhaitez tous les visiter.

les fonctions flush-lines, sort-numeric-fields, replace-regexp et rectangle peuvent être très utiles pour extraire un dump d'un outil et le convertir en données utiles telles qu'un programme elisp ou un tableur délimité par des virgules. 

J'ai écrit une page sur IDE comme ce que vous pouvez faire avec emacs 

http://justinsboringpage.blogspot.com/2007/09/11-visual-studio-tricks-in-emacs.html

Apprendre à utiliser elisp est un autre excellent moyen de déterminer par vous-même ce que emacs peut faire d'autre que ce qu'un IDE typique peut faire. 

Par exemple, j’ai écrit sur des blogs sur l’écriture de fonctions d’aide de Perforce comme blâme (écrire votre propre moyen signifie que vous pouvez le faire se comporter exactement comme vous le souhaitez) ...

http://justinsboringpage.blogspot.com/2009/01/who-changed-line-your-working-on-last.html

J'ai également écrit du code qui crée dynamiquement des commentaires pour une fonction à un point, qui correspond aux normes de codage avec lesquelles je travaille. 

Aucun de mes codes elisp n'est particulièrement génial, et la plupart d’entre eux existent déjà dans les bibliothèques, mais il est très utile de pouvoir faire en sorte que emacs personnalise des éléments personnalisés lors d’une journée de travail. 

15
justinhj

Vous trouverez une description détaillée de l'intégration de emacs et du contrôle de version sur mon site . Je travaille également sur un article sur l'utilisation d'Emacs en tant qu'environnement de développement pour de nombreuses langues - C/C++, Java, Perl, LISP/Scheme, Erlang, etc.

10
Alex Ott

Ok, tout le monde ici donne des astuces parfaites pour faire d’Emacs un excellent IDE. 

Mais tout le monde devrait garder à l’esprit que, lorsque vous personnalisez votre emacs avec beaucoup d’extension (notamment avec ceux pour la vérification de type à la volée, les recherches de définition de fonction, etc.), votre emacs se chargera très, très lentement pour un éditeur. 

Pour contourner ce problème, je vous recommande vivement d'utiliser emacs dans server mode

C'est assez simple à utiliser, pas besoin de personnaliser votre fichier d'initialisation . Vous avez juste besoin de démarrer emacs en mode démon;

emacs --daemon

Cela créera un serveur emacs, vous pourrez alors le connecter depuis un terminal ou depuis une interface graphique. Je recommanderais également de créer des alias pour faciliter les appels. 

alias ec="emacsclient -t"
alias ecc="emacsclient -c &"
# some people also prefer this but no need to fight here;
alias vi="emacsclient -t"

De cette façon, emacs se lancera encore plus vite que gedit, promis.

Le seul problème possible ici, si vous exécutez le démon emacs à partir de votre utilisateur occasionnel, vous ne pourrez probablement pas vous connecter au serveur emacs en tant que root

Donc, si vous devez ouvrir un fichier avec un accès root; utilisez tramp à la place. Il suffit d’exécuter votre client emacs avec votre utilisateur normal et d’ouvrir des fichiers comme celui-ci;

C-x C-f
/Sudo:root@localhost/some/file/that/has/root/access/permissions
# on some linux distro it might be `/su:root@...` 

Cela m'a facilité la vie, je peux ouvrir mon lourd python personnalisé IDE en quelques millisecondes de cette façon. Vous pouvez également ajouter emacs --daemon au démarrage de votre système ou créer un fichier de bureau pour emacsclient. C'est à toi de voir. 

Vous trouverez plus d'informations sur le démon emacs et le client emacs sur wiki;

http://www.emacswiki.org/emacs/EmacsAsDaemon

http://www.emacswiki.org/emacs/EmacsClient

8
Muhammet Can

Pour le contrôle de version, vous pouvez utiliser plusieurs choses, en fonction du système de contrôle de version que vous utilisez. Mais certaines fonctionnalités sont communes à tous.

vc.el est le moyen intégré pour gérer le contrôle de version au niveau du fichier. Il a backends pour la plupart des systèmes de contrôle de version. Par exemple, le backend de Subversion est fourni avec Emacs, et il existe des backends git et d'autres disponibles auprès d'autres sources.

La commande la plus utile est C-x v v (vc-next-action) qui effectue l'action suivante appropriée pour le fichier que vous visitez. Cela peut vouloir dire mettre à jour à partir du référentiel ou valider vos modifications, vc.el relie également C-x C-q d’archiver et de sortir des fichiers si vous utilisez un système qui en a besoin (comme RCS).

D'autres commandes très utiles sont C-x v l et C-x v = qui vous montre le journal et le diff actuel du fichier que vous utilisez.

Mais pour une productivité réelle, évitez d’utiliser les commandes vc.el à fichier unique à des fins autres que simples. Plusieurs packages peuvent vous donner un aperçu du statut de votre arborescence entière et vous donner plus de pouvoir, sans oublier la possibilité de créer des validations cohérentes couvrant plusieurs fichiers.

La plupart d'entre eux sont fortement influencés ou basés sur l'original pcl-cvs/pCV pour CVS. Il y en a même deux qui viennent avec Subversion, psvn.el et dsvn.el. Il y a des paquets pour git etc.

8
dkagedal

Je conviens que vous devriez en apprendre davantage sur la compilation M-x (lier cela et M-x next-error à une courte séquence de touches).

En savoir plus sur les liaisons pour le contrôle de version (par exemple, vc-diff, vc-next-action, etc.)

Regardez dans les registres. Vous pouvez non seulement mémoriser des emplacements dans des tampons, mais également des configurations de fenêtre entières (C-x r w - configuration de fenêtre à enregistrer).

7
HD.

Un point de départ (qui peut n’être pas évident) pour explorer les caractéristiques VC d’Emacs est M-x vc-next-action

Il effectue la "prochaine opération de contrôle de version logique" sur le fichier actuel, en fonction de l'état du fichier et du backend VC. Donc, si le fichier n'est pas sous contrôle de version, il l'enregistre, si le fichier a été modifié, les modifications sont soumises, etc. 

Il faut un peu de temps pour s'y habituer, mais je trouve cela très utile. 

Le raccourci clavier par défaut est C-x v v

6
Chopmo

Il existe un TFS.el pour l’intégration d’emacs dans Microsoft TFS . Cela fonctionne avec n'importe quel TFS, y compris celui qui exécute Codeplex.com. 

Étapes de base pour la configuration:

  1. Placez tfs.el dans votre chemin de chargement.

  2. Dans votre fichier .emacs: 

    (require 'tfs)
    (setq tfs/tf-exe  "c:\\vs2008\\common7\\ide\\tf.exe")
    (setq tfs/login "/login:domain\\userid,password")
          -or-
    (setq tfs/login (getenv "TFSLOGIN"))  ;; if you have this set
    
  3. également dans votre fichier .emacs, définissez des liaisons de clé locales ou globales pour les commandes tfs. ainsi:

    (global-set-key  "\C-xvo" 'tfs/checkout)
    (global-set-key  "\C-xvi" 'tfs/checkin)
    (global-set-key  "\C-xvp" 'tfs/properties)
    (global-set-key  "\C-xvr" 'tfs/rename)
    (global-set-key  "\C-xvg" 'tfs/get)
    (global-set-key  "\C-xvh" 'tfs/history)
    (global-set-key  "\C-xvu" 'tfs/undo)
    (global-set-key  "\C-xvd" 'tfs/diff)
    (global-set-key  "\C-xv-" 'tfs/delete)
    (global-set-key  "\C-xv+" 'tfs/add)
    (global-set-key  "\C-xvs" 'tfs/status)
    (global-set-key  "\C-xva" 'tfs/annotate)
    (global-set-key  "\C-xvw" 'tfs/workitem)
    
4
Cheeso

compile, next-error et previous-error sont toutes des commandes assez importantes pour le développement C++ dans Emacs (fonctionne très bien aussi avec les sorties grep). Les étiquettes, visit-tags-table et find-tag sont également importantes. Achèvement.el est l’un des grands fléaux inconnus du XXe siècle et peut accélérer votre piratage C++ d’un ordre de grandeur. Oh et n'oublions pas Ediff.

Je n'ai pas encore appris à utiliser le contrôle de version sans avoir à visiter un shell, mais maintenant que je suis en cours d'exécution, je le commets beaucoup plus souvent (avec git), je devrai probablement le faire.

3
jfm3

J'utilise emacs sous Windows. Le module de compilation est Nice, mais je voulais que la compilation soit plus intelligente sur la ligne de commande de compilation suggérée. Il est possible d'utiliser "Variables de fichier" pour spécifier compile-command , mais je voulais quelque chose d'un peu plus intelligent que cela. J'ai donc écrit une petite fonction pour aider. Il suppose que la commande de compilation à utiliser invitera l'utilisateur à exécuter compile

La fonction suppose que vous cherchez un fichier vbproj ou csproj ou sln, et si elle est trouvée, elle suggère msbuild. Ensuite, il examine le nom du fichier tampon et, en fonction de cela, suggère différentes choses. Un fichier .wxs signifie qu'il s'agit d'un projet WIX et que vous souhaitez probablement créer un fichier MSI. La logique de devinette suggère une commande nmake pour le fichier MSI. Si c'est un module Javascript, alors la suggestion est d'exécuter jslint-for-wsh.js pour lint le fichier .js. En guise de solution de rechange, cela suggère nmake. 

Le code que j'utilise ressemble à ceci:

(defun cheeso-guess-compile-command ()
  "set `compile-command' intelligently depending on the
current buffer, or the contents of the current directory."
  (interactive)
  (set (make-local-variable 'compile-command)
       (cond
        ((or (file-expand-wildcards "*.csproj" t)
             (file-expand-wildcards "*.vcproj" t)
             (file-expand-wildcards "*.vbproj" t)
             (file-expand-wildcards "*.shfbproj" t)
             (file-expand-wildcards "*.sln" t))
         "msbuild ")

        ;; sometimes, not sure why, the buffer-file-name is
        ;; not set.  Can use it only if set.
        (buffer-file-name
         (let ((filename (file-name-nondirectory buffer-file-name)))
           (cond

            ;; editing a .wxs (WIX Soluition) file
            ((string-equal (substring buffer-file-name -4) ".wxs")
             (concat "nmake "
                     ;; (substring buffer-file-name 0 -4) ;; includes full path
                     (file-name-sans-extension filename)
                     ".msi" ))

            ;; a javascript file - run jslint
            ((string-equal (substring buffer-file-name -3) ".js")
             (concat (getenv "windir")
                     "\\system32\\cscript.exe c:\\users\\cheeso\\bin\\jslint-for-wsh.js "
                     filename))

            ;; something else - do a typical .exe build
            (t
             (concat "nmake "
                     (file-name-sans-extension filename)
                     ".exe")))))
        (t
         "nmake "))))


(defun cheeso-invoke-compile-interactively ()
  "fn to wrap the `compile' function.  This simply
checks to see if `compile-command' has been previously set, and
if not, invokes `cheeso-guess-compile-command' to set the value.
Then it invokes the `compile' function, interactively."
  (interactive)
  (cond
   ((not (boundp 'cheeso-local-compile-command-has-been-set))
    (cheeso-guess-compile-command)
    (set (make-local-variable 'cheeso-local-compile-command-has-been-set) t)))
  ;; local compile command has now been set
  (call-interactively 'compile))

;; in lieu of binding to `compile', bind to my monkeypatched function
(global-set-key "\C-x\C-e"  'cheeso-invoke-compile-interactively)

J'ai essayé de le faire comme "avant conseil" pour la fonction de compilation, mais je n'ai pas réussi à le faire fonctionner correctement. J'ai donc défini une nouvelle fonction et l'ai liée à la combinaison de touches que j'ai utilisée pour compile


EDIT il y a maintenant " smarter-compile.el " qui va encore plus loin dans cette idée.

3
Cheeso

Vous pourriez également trouver tabbar utile. Il émule le seul comportement que j'ai raté lors du passage d'Eclipse à Emacs. Lié à "," et "." pour passer à la barre de tabulation précédente et suivante, cela vous évite de changer de tampon avec Ctrl-x b tout le temps.

Malheureusement, la page Web mentionnée ne fournit pas la version correcte à télécharger. Cependant, la plupart des versions d'Ubuntu le fournissent dans leurs paquets emacs-goodies.

3
wr.

Je sais que c'est un très vieux post. Mais cette question est valable pour les débutants emacs.

OMI le meilleur moyen d'utiliser emacs en tant qu'idéal est d'utiliser un protocole de serveur de langue avec emacs. Vous pouvez trouver toutes les informations sur les serveurs de langues sur le site Web lié. 

Pour une installation rapide, je vous invite vivement à vous rendre sur cette page eglot . IMO eglot fait son travail plutôt bien. Il s'intègre bien aux paquets de complétions automatiques comme la société. Fournit une référence, et plus encore. 

De même, pour un débogueur, vous aurez peut-être besoin de débogueurs spécifiques pour des langues spécifiques. Vous pouvez utiliser gdb depuis emacs. Il suffit de taper M-x gdb

Pour compiler votre code, il est préférable d'utiliser des commandes Shell. Je travaille sur ce projet eproj . Ça va prendre un certain temps pour le terminer. Mais tout ce qu'il fait est de mapper la commande Shell au type de projet. Et construit votre projet via Shell. Il en va de même pour exécuter la commande. J'ai peut-être besoin d'aide pour mener à bien ce projet. Ce n'est pas prêt à l'emploi, mais si vous connaissez un peu d'Elisp, vous pouvez consulter le code. 

Cela dit, il vaut toujours mieux utiliser la commande de compilation emacs.

Pour le contrôle de version, je n’ai encore vu aucun autre paquet pouvant correspondre à la puissance de magit . C'est spécifique à git. Aussi pour git il y a un autre paquet git-timemachine, que je trouve très utile.

La recherche d'objet et de classe est fournie par le protocole du serveur de langage. 

Une arborescence de projet peut être utilisée comme interface avec treemacs .

Il existe également une bibliothèque d'interaction de projet appelée projectile .

Pour l'auto-complétion, je trouve le mode société très utile. 

Vraiment Emacs peut être fait pour faire n'importe quoi.

2
sidharth arya

Recherche de documentation: cela dépend de votre (vos) langage (s) de programmation.

Les bibliothèques C et les appels système sont généralement décrits dans les pages de manuel. Pour cela, vous pouvez utiliser M-x man. Certaines choses peuvent être mieux documentées dans les pages d’information; utilisez M-x info.

Pour elisp lui-même, utilisez C-h f. Pour python, utilisez >>> help(<function, class, module>) dans l'interpréteur.

Je trouve que la plupart des autres langues proposent une documentation au format HTML. Pour cela, essayez un navigateur intégré (j'utilise w3m). Définissez votre variable d'environnement BROWSER sur un script wrapper autour de emacsclient -e "(w3m-goto-url-new-session \"$@\")" (on * nix), au cas où quelque chose pourrait ouvrir un navigateur et que vous souhaitez qu'il soit ouvert dans emacs.

2
Jonas Kölker

Ces dernières années, Clang est devenu une partie importante du support Emacs C++. Atila Neves a parlé de CppCon 2015: "Emacs en tant qu'EDI C++"

Il s’agit d’une discussion de 16 minutes au cours de laquelle il présente des solutions aux sujets suivants:

  • Aller à la définition
  • Auto-complétion
  • Mise en surbrillance de la syntaxe à la volée
  • Rechercher un fichier dans le projet

Les diapositives peuvent être trouvés ici .

1
Philipp Claßen

Dans le style Unix ou X Windows, je ne sais pas s'il existe un IDE intégré qui fonctionne pour tout. 

Pour interagir avec les débogueurs, un seul composant d'un IDE, considérons realgud . Les analyseurs syntaxiques pour les messages de localisation constituent une autre chose qui me soit utile. Ainsi, si vous avez une trace de pile d'appels et souhaitez modifier à un endroit particulier de la pile d'appels, cette interface frontale le fera. 

De loin, ce programme pourrait être amélioré. Mais alors, il pourrait aussi faire appel à des personnes qui travaillent dessus pour l’améliorer. 

Disclaimer: je travaille sur realgud

0
rocky