Comment exécuter un programme C à partir de VIM?

Est-il possible de comstackr et d’exécuter un programme C à partir de VIM sans saisir son nom de fichier?

:!gcc -o somename % && ./somename
Lorsque vous utilisez :! ,% sera remplacé par le nom du fichier actuellement ouvert.

Lorsque votre projet devient plus grand, vous pouvez également écrire un fichier Make et comstackr le projet en cours avec :make , s’il y a des erreurs, vim y accédera automatiquement.

Utilisez le code de mappage suivant dans votre fichier .vimrc pour comstackr et exécuter un fichier de programmation en courant alternatif.

  map  : !gcc % && ./a.out  

La touche F8 sert à exécuter le mappage. “%” doit prendre le nom de fichier actuel.

Ou, si vous voulez enregistrer le fichier actuel avant de le comstackr, utilisez

 map  :w  :!gcc % && ./a.out  

Ou, plus idéalement, si vous souhaitez utiliser le fichier nom_base et non le nom par défaut ‘a.out’ comme nom de fichier exécutable, utilisez les éléments suivants:

 map  :w  :!gcc % -o %< && ./%<  

Dans la commande ci-dessus, “<" après "%" supprime l'extension et le point (foo.c => foo), ainsi “% <" est le nom de fichier du fichier.

Vous pouvez trouver cela et des infos similaires dans cmdline.txt. Commande dans vim: help: cmdline.txt . Vous pouvez également trouver des détails spécifiques sur l’utilisation de “%” à ​​l’aide de :help filename-modifiers dans vim.

comme la plupart du temps, vous utiliseriez un Makefile, en plus des réponses données, j’aime aussi voir mes résultats dans un écran “effacé”:

map :w :!clear; make :!./%<

  • :w enregistre le fichier

  • :!clear; make :!clear; make efface l’écran et exécute make

  • :!./%< exécute un programme ( % ) sans l’extension ( < )

TL; DR Aucun Makefile n’est requirejs, &makeprg est également complètement inutile, et pourtant :make %< est suffisant pour comstackr à partir de Vim.

Longue réponse:

Je duplique une réponse que j'ai donnée dans une "question dupliquée" fermée.

Considérant que nous utilisons vim, et non vi,: :make est la voie à suivre.

Sur les systèmes de type Linux (cela s'applique également à cygwin, mais pas à Windows - dans ce cas, voyez les autres réponses qui modifient &makeprg , laissez les choses autrement sinon), où gnumake est installé, si vous n'avez pas de fichier Makefile. dans votre projet, et si votre projet est constitué d’un seul fichier, tapez simplement :make %< . Ce sera suffisant (vous pouvez jouer avec $CXXFLAGS , $CFLAGS et $LDFLAGS pour ajuster les options de compilation). Ensuite, pour exécuter le programme, tapez :!./%< ou, avec les dernières versions de vim, exécutez :terminal ./%< .

Si votre projet est composé de plusieurs fichiers, vous aurez besoin d'un fichier Makefile pour tirer parti de :make .

Si vous gérez votre projet avec CMake et si vous le comstackz dans un répertoire (ou plusieurs -> debug, release, ...) en dehors de l'arborescence des sources, l'intégration nécessitera un plugin. Autant que je sache, je suis le seul à proposer un tel plugin: BuildToolsWrapper intègre la gestion de CMake (choix du répertoire de construction, possibilité de choisir entre le débogage, la publication ou n’importe quel répertoire de construction). Il doit être associé à l’un des plug- in local_vimrc .

Dans tous les cas, appeler directement le compilateur depuis Vim (ou dehors) avec:! :!g++ -o %< % ou ce que nous faisions il y a 15 ans sur vi. Vim a une fonctionnalité merveilleuse: il peut intégrer (oui, comme dans IDE) le compilateur. Voir :h quickfix . Naviguer entre les erreurs directement depuis l'éditeur est beaucoup plus facile que d'extraire une ligne d'erreur avec nos yeux, de recopier le numéro de ligne dans l'éditeur, de retourner dans le shell pour voir ce qui a été rejeté, ... Cela peut suffire en C, mais en C ++, lorsque nous "essayons d'appeler une surcharge qui n'existe pas", nous ne pouvons pas travailler de cette façon (basculer entre l'éditeur et le shell).

Enfin, si vous souhaitez comstackr sur une seule touche ces projets mono-fichier, vous pouvez append dans votre fichier .vimrc:

 nnoremap   :make %< 

Si vous souhaitez adapter automatiquement la commande de compilation en fonction du type de projet projet animal domestique mono-fichier ou projet multi-fichier du monde réel, il faut plus de câblage, et c'est ce que fait BTW - il lit diverses options à connaître Que faire.

Dernière remarque: &makeprg est préférable de laisser &makeprg seul, du moins pas à g ++ / gcc / clang / clang ++ / gfortran / ... Parce que chaque fois que vous changez de langue, vous devez la changer (sauf si vous utilisez :setlocal ) . Avec la solution que je recommande, si je veux utiliser clang ++ au lieu de g ++, tout ce que je dois faire est de définir :let $CXX='clang++' (ou $CC en C), puis appelez :make %< . Je peux même définir :let $CXXFLAGS='-std=c++11' à comstackr en C ++ 11 - la même variable sera utilisée pour activer les avertissements, utiliser un désinfectant, etc.

Ajouter cette ligne dans votre fichier vimrc

 nnoremap   :!clear;gcc % -o % && ./% 

Il ne rest plus qu’à appuyer sur la touche f8 pour comstackr et exécuter votre programme c.

Je pensais juste append ceci à ces réponses ici. Comme cela a été mentionné, vous pouvez utiliser la commande :make dans vim. Ce qui n’a pas encore été mentionné, c’est que :make peut invoquer d’autres programmes que make .

 :set makeprg=gcc\ % 

Cela provoquera :make exécutera gcc avec le symbole % remplacé par le nom du fichier actuel.

Vous pouvez alors avoir envie et faire

 :set makeprg=gcc\ %\ &&\ ./a.out 

et simplement en tapant :make comstackra et exécutera votre programme. Vous pouvez également le faire pour d’autres langues.

 :set makeprg=cabal\ repl :set makeprg=python\ % 

Nous sums en 2018, vim 8 est publié depuis 2 ans et est livré avec toutes les dissortingbutions Linux et Mac OS X. Cependant, de nombreux tutoriels vim enseignent encore quelque chose il y a dix ans.

Vous pouvez comstackr vos programmes C ++ / Java dans vim aussi facilement que Sublime Text ou NotePad ++ avec des plugins dédiés pour Vim 8 ou NeoVim.

Par exemple, le plug- in AsyncRun vous permettra d’exécuter des commandes shell en arrière-plan et de lire les sorties de la fenêtre de correction rapide en temps réel. Voir la capture d’écran .

Tout comme les programmes de compilation dans les IDE, les erreurs de compilation seront mises en correspondance par errorformat et seront mises en évidence et deviendront sélectionnables. Vous pouvez parcourir les erreurs dans la fenêtre du correctif ou continuer l’édition en cours de compilation.

Installation rapide

Copiez et collez les lignes ci-dessous sur votre vimrc:

 Plug 'skywind3000/asyncrun.vim' " open quickfix window automatically when AsyncRun is executed " set the quickfix window 6 lines height. let g:asyncrun_open = 6 " ring the bell to notify you job finished let g:asyncrun_bell = 1 " F10 to toggle quickfix window nnoremap  :call asyncrun#quickfix_toggle(6) 

Lorsque vous entrez «: AsyncRun echo hello» dans la ligne de commande:

voir la capture ici

Vous verrez le résultat de la commande en temps réel dans la fenêtre de correction rapide ouverte.

Comstackr et exécuter un seul fichier

Comstackr un seul fichier avec AsyncRun est beaucoup plus simple que le système de compilation de Sublime Text. Nous pouvons configurer F9 pour cela:

 noremap   :AsyncRun gcc -Wall -O2 "$(VIM_FILEPATH)" -o "$(VIM_FILEDIR)/$(VIM_FILENOEXT)"  

Les macros sous la forme $(..) seront développées en tant que nom de fichier ou répertoire réel, puis nous aurons F5 pour exécuter le fichier exécutable:

 noremap   :AsyncRun -raw -cwd=$(VIM_FILEDIR) "$(VIM_FILEDIR)/$(VIM_FILENOEXT)"  

Le guillemet double est utilisé pour gérer les noms de chemin contenant des espaces. L’option -cwd=$(VIM_FILEDIR) signifie que vous exécutez le fichier dans le répertoire du fichier. Le nom de chemin absolu $(VIM_FILEDIR)/$(VIM_FILENOEXT) est utilisé car linux a besoin d’un préfixe ./ pour exécuter les exécutables dans le répertoire en cours, contrairement à Windows. L’utilisation du nom de chemin absolu du fichier binary peut résoudre ce problème de plate-forme croisée.

Une autre option -raw signifie que la sortie ne correspondra pas à errorformat de vim et sera affichée telle quelle dans Quickfix. Vous pouvez maintenant comstackr votre fichier avec F9, vérifier les erreurs de compilation dans la fenêtre de correction rapide et appuyer sur F5 pour exécuter le fichier binary.

Construire des projets C / C ++

Quel que soit l’outil de construction que vous utilisez, créez ou créez, la construction de projet consiste à agir sur un groupe de fichiers. Cela nécessite de localiser le répertoire racine du projet. AsyncRun utilise une méthode simple appelée marqueurs racine pour identifier la racine du projet. La racine du projet est identifiée comme étant le répertoire ancêtre le plus proche du fichier en cours qui contient l’un de ces répertoires ou fichiers:

 let g:asyncrun_rootmarks = ['.svn', '.git', '.root', '_darcs'] 

Si aucun des répertoires parents ne contient ces marqueurs racine, le répertoire du fichier actuel est utilisé comme racine du projet. Cela nous permet d’utiliser soit soit $(VIM_ROOT) pour représenter la racine du projet. et F7 peuvent être configurés pour construire le projet actuel:

 noremap   :AsyncRun -cwd= make  

Que se passe-t-il si votre projet actuel ne figure dans aucun référentiel git ou subversion? Comment savoir où se trouve mon projet racine? La solution est très simple, il suffit de placer un fichier .root vide à la racine de votre projet, il sera facilement localisé.

Passons maintenant à la configuration F8 pour exécuter le projet actuel:

 noremap   :AsyncRun -cwd= -raw make run  

Le projet sera exécuté dans son répertoire racine. Bien sûr, vous devez définir la règle d’exécution dans votre propre fichier Make. puis remappez F6 pour tester:

 noremap   :AsyncRun -cwd= -raw make test  

Si vous utilisez cmake, F4 peut être une carte pour mettre à jour votre Makefile:

 nnoremap   :AsyncRun -cwd= cmake .  

En raison de l’implémentation de c runtime, si le processus en cours d’exécution est un environnement autre que tty, toutes les données de stdout seront mises en mémoire tampon jusqu’à la fin du processus. Donc, il doit y avoir un fflush(stdout) après votre instruction printf si vous voulez voir la sortie en temps réel. ou vous pouvez fermer le tampon stdout au début en

 setbuf(stdout, NULL); 

Entre-temps, si vous écrivez du code C ++, un std :: endl peut être ajouté à la fin de std :: cout. Il peut forcer le vidage du tampon stdout. Si vous développez sur Windows, AsyncRun peut ouvrir une nouvelle fenêtre cmd pour le processus enfant:

 nnoremap   :AsyncRun -cwd=$(VIM_FILEDIR) -mode=4 "$(VIM_FILEDIR)/$(VIM_FILENOEXT)"  nnoremap   :AsyncRun -cwd= -mode=4 make run  

L’utilisation de l’option -mode=4 sous Windows ouvrira une nouvelle fenêtre d’invite pour exécuter la commande, tout comme les programmes de ligne de commande exécutés dans Visual Studio. Enfin, nous avons ces mappages de clés ci-dessous:

  • F4: mise à jour du Makefile avec cmake.
  • F5: exécuter le fichier unique
  • F6: lancer le test du projet
  • F7: projet de construction
  • F8: exécuter le projet
  • F9: comstackr le fichier unique
  • F10: bascule la fenêtre de correction rapide

Cela ressemble plus à un système de compilation dans NotePad ++ et GEdit. Si vous utilisez beaucoup cmake, vous pouvez écrire un simple script shell situé dans ~/.vim/script/build.sh pour combiner F4 et F7: il mettra à jour le fichier Makefile si CMakeList.txt a été modifié, puis exécutera make.

Utilisation avancée

Vous pouvez également définir des scripts shell dans votre référentiel dotfiles et exécuter le script avec F3:

 nnoremap  :AsyncRun -cwd= sh /path/to/your/dotfiles/script/build_advanced.sh  

Les variables d’environnement shell suivantes sont définies par AsyncRun:

 $VIM_FILEPATH - File name of current buffer with full path $VIM_FILENAME - File name of current buffer without path $VIM_FILEDIR - Full path of current buffer without the file name $VIM_FILEEXT - File extension of current buffer $VIM_FILENOEXT - File name of current buffer without path and extension $VIM_CWD - Current directory $VIM_RELDIR - File path relativize to current directory $VIM_RELNAME - File name relativize to current directory $VIM_ROOT - Project root directory $VIM_CWORD - Current word under cursor $VIM_CFILE - Current filename under cursor $VIM_GUI - Is running under gui ? $VIM_VERSION - Value of v:version $VIM_COLUMNS - How many columns in vim's screen $VIM_LINES - How many lines in vim's screen $VIM_SVRNAME - Value of v:servername for +clientserver usage 

Toutes les variables d’environnement ci-dessus peuvent être utilisées dans votre build_advanced.sh . L’utilisation du fichier de script de shell externe peut faire un travail plus complexe qu’une commande unique.

Symboles Grep

Parfois, si votre environnement linux distant n’est pas bien configuré, grep est le moyen le plus économique de rechercher une définition de symbole et des références parmi les sources. Maintenant nous aurons F2 pour rechercher le mot clé sous le curseur:

 if has('win32') || has('win64') noremap  :AsyncRun! -cwd= grep -n -s -R  --include='*.h' --include='*.c*' ''  else noremap  :AsyncRun! -cwd= findstr /n /s /C:"" "\%CD\%\*.h" "\%CD\%\*.c*"  endif 

Le script ci-dessus exécutera grep ou findstr dans le répertoire racine de votre projet et recherchera les symboles uniquement dans les fichiers .c , .cpp et .h . Déplacez maintenant le curseur et appuyez sur F2. Les références aux symboles du projet en cours seront immédiatement affichées dans la fenêtre du correctif.

Ce clavier simple suffit pour la plupart du temps. Et vous pouvez améliorer ce script pour prendre en charge davantage de types de fichiers ou d’autres outils grep dans votre vimrc.

C’est le moyen pratique de construire / exécuter des projets C / C ++ dans Vim 8 ou NeoVim. Tout comme le système de construction de Sublime Text et le NppExec de NotePad ++.

Plus de tutoriels vim obsolètes, essayez quelque chose de nouveau.

Après quelques recherches (y compris cette page), j’ai décidé d’append ce raccourci:

 map  :w :!gcc % -o %<.x -Wall -Wextra 2>errors.err; cat errors.err 

Vous pouvez également inclure les -ansi -pedantic-errors si vous le souhaitez.

Le fichier errors.err vous aidera avec le correctif rapide vi.

Ajoutez ces trois lignes à votre fichier .vimrc

 au FileType c set makeprg=gcc\ % au FileType cpp set makeprg=g++\ % map :make && ./a.out 

Vous pouvez comstackr et exécuter votre programme en appuyant sur le bouton F7 .

Il peut être intéressant d’append que le plugin SingleComstack offre cette fonctionnalité pour le C et d’autres langues, comme l’a déclaré l’auteur:

SingleComstack est un plugin Vim visant à faciliter la compilation ou l’exécution d’un fichier source unique sans quitter Vim. Considérez cette situation: vous venez d’écrire un petit fichier source C pour un petit test, mais vous devez écrire un Makefile pour le comstackr, ou quitter Vim pour le comstackr, ou le comstackr avec “! Gcc” sans la fonctionnalité de correction rapide, car la marque de Vim commande utilise uniquement la commande “make”? Ce plugin va vous aider.

Mappages suggérés pour F9 et F10 :

 nmap  :SCComstack nmap  :SCComstackRun