Utiliser Emacs comme IDE

Actuellement, mon stream 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 étant un shell que j’utilise pour taper comstack ou faire des commandes, et le haut est souvent une sorte de documentation ou de fichier README que je veux consulter pendant que je travaille. Maintenant, je sais qu’il y a quelques utilisateurs Emacs très compétents, et je suis curieux de savoir ce que d’autres fonctions d’Emacs sont utiles si l’intention est de l’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
  • Le débogage
  • Recherche de documentation
  • Contrôle de version
  • Fonctionnalités OO comme la recherche de classe et l’inspecteur d’objects

Pour certains d’entre eux, il est assez évident que Emacs puisse s’adapter à ces fonctions, mais qu’en est-il du rest? En outre, si une langue spécifique doit être ciblée, je dirais que ce devrait être C ++.

Edit: Un utilisateur a souligné que j’aurais dû être plus précis lorsque j’ai dit “et le rest”. J’étais surtout 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 hyperspéc rapide sur une fonction Lisp. Existe-t-il un moyen rapide de rechercher quelque chose dans la documentation C ++ STL (si j’ai oublié la syntaxe exacte de hash_map , par exemple)?

Vous devrez être précis quant à ce que vous entendez par “le rest”. A part l’inspecteur d’object (que je connais), emacs fait tout ce qui précède assez facilement:

  • éditeur (évident)
  • compilateur – lancez simplement la Mx comstack et entrez votre commande de compilation. A partir de là, vous pouvez simplement Mx comstack et utiliser la valeur par défaut. Emacs va capturer les erreurs du compilateur C / C ++ (fonctionne mieux avec GCC) et vous aide à naviguer vers les lignes contenant des avertissements ou des erreurs.
  • Débogage – de même, lorsque vous souhaitez déboguer, tapez Mx gdb et il créera un tampon gdb avec des liaisons spéciales
  • Documentation Lookup – emacs possède d’excellentes liaisons CScope pour la navigation dans le code. Pour d’autres documentations: Emacs a aussi un lecteur de pages de manuel, et pour tout le rest, il y a le Web et les livres.
  • contrôle de version – il y a beaucoup de liaisons Emacs pour différents backends VCS (tout cela me vient à l’esprit: CVS, SCCS, RCS, SVN, GIT)

Edit: Je me rends compte que ma réponse sur la recherche de documentation concernait vraiment la navigation dans le code. Voici quelques informations complémentaires:

  • Recherche de pages de manuel, de manuels d’informations et de documentation Elisp depuis emacs
  • Recherche de la documentation Python depuis Emacs .

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 sockets en charge immédiatement.

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

EDIT : Je recommande aussi maintenant Magit par- dessus l’interface VCS standard dans emacs.

Au lieu d’exécuter une commande make dans la fenêtre shell, avez-vous essayé la compilation Mx? Il exécutera votre commande make, affichera les erreurs et, dans de nombreux cas, facilitera l’access à la ligne de code à l’origine de l’erreur si la sortie inclut des noms de fichiers et des numéros de ligne.

Si vous êtes un fan des IDE, vous pouvez aussi regarder le paquet de speedbar d’emacs (Mx speedbar). Et si vous ne l’avez pas encore fait, découvrez comment utiliser les tables de balises pour naviguer dans votre code.

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

L’utilisation de la méthode Lancer est utile pour obtenir un tampon contenant toutes les occurrences d’une expression régulière dans un tampon. C’est très pratique lors de la refactorisation du code et de la recherche de fragments de code ou d’utilisations de variables, ou si vous utilisez des marqueurs TODO dans vos fichiers sources 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 fichier de certains outils et les convertir en données utiles telles qu’un programme elisp ou une feuille de calcul délimitée par des virgules.

J’ai écrit une page sur IDE comme des choses que vous pouvez faire avec emacs

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

Apprendre elisp est un autre excellent moyen de répondre par vous-même à ce que les emacs peuvent faire au-delà de ce qu’un IDE typique peut faire.

Par exemple, j’ai blogué à propos de l’écriture des fonctions d’aide de Perforce, comme le blâme (écrire vos propres moyens pour 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 un code qui crée dynamicment des commentaires pour une fonction au 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 existent déjà dans les bibliothèques, mais il est vraiment utile de pouvoir faire en sorte que emacs fasse des choses personnalisées au cours d’une journée de travail.

Vous pouvez trouver une description détaillée de l’intégration emacs et contrôle de version sur mon site . Je travaille également sur un article sur l’utilisation d’Emacs comme environnement de développement pour de nombreux langages – C / C ++, Java, Perl, Lisp / Scheme, Erlang, etc.

Pour le contrôle de version, vous pouvez utiliser plusieurs éléments, selon le système de contrôle de version que vous utilisez. Mais certaines fonctionnalités sont communes à tous.

vc.el est le moyen intégré de gérer le contrôle de version au niveau des fichiers. Il dispose de backends pour la plupart des systèmes de contrôle de version. Par exemple, le backend Subversion est fourni avec Emacs, et il existe des backend git et d’autres disponibles à partir d’autres sources.

La commande la plus utile est Cx vv (vc-next-action) qui effectue l’action suivante appropriée pour le fichier que vous visitez. Cela peut signifier la mise à jour à partir du référentiel ou la validation de vos modifications, vc.el relie également Cx Cq pour archiver et extraire les fichiers si vous utilisez un système qui en a besoin (comme RCS).

Les autres commandes très utiles sont Cx vl et Cx v = qui vous indiquent le journal et la diff actuelle du fichier que vous utilisez.

Mais pour une productivité réelle, vous devriez éviter d’utiliser les commandes vc.el à fichier unique, sauf pour les choses simples. Plusieurs packages peuvent vous donner un aperçu de l’état de votre arborescence dans son ensemble et vous donner plus de puissance, sans parler de 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 les pcl-cvs / pcvs d’ origine 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.

Ok, tout le monde ici donne des conseils parfaits pour faire d’emacs un grand IDE.

Mais tout le monde doit garder à l’esprit que lorsque vous personnalisez vos emacs avec beaucoup d’extensions (en particulier avec celles pour la vérification à la volée, les recherches de définition de fonction, etc.), vos emacs se chargeront très, très lentement pour un éditeur.

Pour contourner ce problème, je recommande fortement d’utiliser emacs en server mode .

Il est assez simple à utiliser, pas besoin de personnaliser votre fichier init. Il vous suffit de démarrer emacs en mode démon;

 emacs --daemon 

Cela créera un serveur emacs, puis vous pourrez le connecter depuis un terminal ou depuis l’interface graphique. Je recommande également de créer des alias pour faciliter l’appel.

 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 pouvez probablement pas connecter le serveur emacs en tant que root .

Donc, si vous devez ouvrir un fichier avec un access root, utilisez plutôt tramp . Il suffit de lancer votre client emacs avec votre utilisateur habituel et d’ouvrir des fichiers comme celui-ci;

 Cx Cf /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 IDE python personnalisé en plusieurs millisecondes. Vous pouvez également append emacs –daemon au démarrage de votre système ou créer un fichier de bureau pour emacsclient. C’est à toi de voir.

Plus d’informations sur le démon emacs et le client emacs sont disponibles sur le wiki;

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

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

Je suis d’accord que vous devriez apprendre à comstackr Mx (lier cela et Mx next-error à une séquence de touches courte).

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 aussi des configurations de fenêtres entières (Cx rw – window-configuration-to-register).

Un sharepoint départ (qui peut ne pas être évident) pour explorer les fonctionnalités VC d’Emacs est Mx vc-next-action .

Il effectue la “prochaine opération de contrôle de version logique” sur le fichier en cours, 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.

La liaison par défaut est Cx vv

Il y a un TFS.el pour l’intégration d’emacs dans Microsoft TFS . Il fonctionne avec tous les TFS, y compris le TFS qui exécute Codeplex.com.

Étapes de base pour configurer:

  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 raccourcis clavier locaux ou globaux 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) 

comstack, next-error et previous-error sont toutes des commandes très importantes pour le développement C ++ dans Emacs (elles fonctionnent aussi très bien sur les sorties grep). Etags, visit-tags-table et find-tag sont également importants. completion.el est l’une des grandes piratages méconnus du 20ème siècle, et peut accélérer votre piratage C ++ d’un ordre de grandeur. Oh, n’oublions pas ediff.

Je n’ai pas encore appris à utiliser le contrôle de version sans visiter un shell, mais maintenant que je cours, je le ferai beaucoup plus fréquemment (avec git).

Vous pouvez également trouver la tabbar utile. Il émule le seul comportement que j’ai manqué lors du passage d’Eclipse à Emacs. Lié à “,” et “.” pour passer à la barre des tabs précédente et suivante, il vous évite de changer le tampon en 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 livrent dans leurs paquets emacs-goodies.

J’utilise emacs sous Windows. le module de compilation est sympa, mais je voulais comstackr pour être plus intelligent sur la ligne de commande de compilation suggérée. Il est possible d’utiliser des “variables de fichier” pour spécifier la comstack-command , mais je voulais quelque chose de plus intelligent. J’ai donc écrit une petite fonction pour aider. Il devine la commande de compilation à utiliser, pour demander à l’utilisateur, lors de l’exécution de la comstack .

La fonction de recherche recherche un fichier vbproj ou csproj ou sln et, si elle est trouvée, 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 souhaiterez probablement créer un fichier MSI. Par conséquent, la logique de proposition 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 lisser le fichier .js. En guise de repli, il suggère nmake.

Le code que j’utilise ressemble à ceci:

 (defun cheeso-guess-comstack-command () "set `comstack-command' intelligently depending on the current buffer, or the contents of the current directory." (interactive) (set (make-local-variable 'comstack-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 ((ssortingng-equal (subssortingng buffer-file-name -4) ".wxs") (concat "nmake " ;; (subssortingng buffer-file-name 0 -4) ;; includes full path (file-name-sans-extension filename) ".msi" )) ;; a javascript file - run jslint ((ssortingng-equal (subssortingng 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-comstack-interactively () "fn to wrap the `comstack' function. This simply checks to see if `comstack-command' has been previously set, and if not, invokes `cheeso-guess-comstack-command' to set the value. Then it invokes the `comstack' function, interactively." (interactive) (cond ((not (boundp 'cheeso-local-comstack-command-has-been-set)) (cheeso-guess-comstack-command) (set (make-local-variable 'cheeso-local-comstack-command-has-been-set) t))) ;; local comstack command has now been set (call-interactively 'comstack)) ;; in lieu of binding to `comstack', bind to my monkeypatched function (global-set-key "\Cx\Ce" 'cheeso-invoke-comstack-interactively) 

J’ai essayé de le faire comme “avant conseil” pour la fonction de compilation mais je ne pouvais pas le faire fonctionner de manière satisfaisante. J’ai donc défini une nouvelle fonction et l’ai liée à la même combinaison de touches que j’ai utilisée pour comstack .


EDIT il y a maintenant ” smarter-comstack.el ” qui prend cette idée un peu plus loin.

Sur la recherche de documentation: cela dépend de votre langage de programmation.

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

Pour elisp lui-même, utilisez Ch f . Pour python, utilisez >>> help() dans l’interpréteur.

Je trouve que la plupart des autres langages proposent une documentation au format HTML. Pour cela, essayez un navigateur intégré (j’utilise w3m). Définissez votre variable d’environnement emacsclient -e "(w3m-goto-url-new-session \"$@\")" sur un script d’encapsulation autour d’ emacsclient -e "(w3m-goto-url-new-session \"$@\")" (sur * nix), au cas où un navigateur pourrait s’ouvrir et que vous souhaitez qu’il s’ouvre à l’intérieur des emacs.

Ces dernières années, Clang est devenu une partie importante du support C ++ d’Emacs. Atila Neves a parlé de CppCon 2015: “Emacs en tant qu’IDE C ++”

C’est un exposé de 16 minutes, où il montre des solutions pour les sujets suivants:

  • Aller à la définition
  • Achèvement automatique
  • Surlignage de la syntaxe à la volée
  • Rechercher un fichier dans le projet

Des diapositives peuvent être trouvées ici .

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érez realgud . L’autre chose que je trouve utile, ce sont les parsingurs pour les messages de localisation, de sorte que si vous avez une trace de stack d’appels et souhaitez la modifier à un endroit particulier de la stack d’appels, cette interface frontale peut le faire.

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

Disclaimer: Je travaille sur realgud