Sélection de la définition complète de la fonction dans Vim

J’essaie Vim depuis presque une semaine pour tout travail d’édition de texte. Je veux connaître le moyen le plus rapide de sélectionner une définition de fonction C.

Par exemple, si j’ai une fonction comme celle-ci:

void helloworlds( int num ) { int n; for ( n = 0; n < num; ++n ) { printf( "Hello World!\n" ); } } 

Comment pourrais-je supprimer toute la définition, y compris le nom de la fonction?

Comme il est courant dans Vim, il y a beaucoup de façons!

Notez que les deux premières solutions dépendent d’une absence de lignes vides.

  • Si votre curseur est sur la ligne avec le nom de la fonction, essayez d } . Il supprimera tout au prochain bloc (c.-à-d. Votre corps de fonction).

  • Dans le corps même de la fonction, d a p supprimera le “paragraphe”.

  • Vous pouvez supprimer un bloc d’accolades avec d a } . (Si vous aimez cette syntaxe, je recommande le fantastique surround.vim de Tim Pope, qui ajoute plus de fonctionnalités avec une sensation similaire).

  • Vous pouvez également essayer d’utiliser des expressions régulières pour supprimer jusqu’à la prochaine accolade fermée: d / ^ } Entrée

  • ] ] et [ [ passer à l’accolade précédente / précédente de la première colonne (équivalent à utiliser / et ? avec cette regex que j’ai mentionnée ci-dessus. Combiner avec le mouvement d , et vous obtiendrez le même effet. En addons comme Python-mode , Ces opérateurs sont redéfinis pour dire exactement ce que vous recherchez: passer d’une fonction à l’autre.

Comment supprimer le bloc entier, en-tête inclus

Si vous êtes sur l’en-tête / le nom ou la ligne avant le bloc, d a } devrait faire l’affaire.

Si vous êtes en dessous d’un bloc, vous pouvez également utiliser la fonction “offset” pratique d’une recherche Vim. d ? ^ { ? - 1 va supprimer vers l’arrière d’une ligne avant la première occurrence d’une accolade ouvrant la première colonne. Cette commande est un peu difficile à taper. Vous pourriez peut-être en faire un raccourci .

Plugins

Je ne fais pas beaucoup de programmation en C dans Vim, mais il y a sûrement des plugins pour vous aider avec une telle chose. Essayez Vim Scripts ou leur miroir sur GitHub .

Pour supprimer une fonction entière, y compris sa définition, par exemple:

 function tick() { // ... } 
  • Accédez à la ligne avec le nom de la fonction.
  • Déplacez le curseur sur l’accolade d’ouverture, f{ devrait le faire, ou simplement $ .
  • Appuyez sur V%d (Ligne visuelle, déplacez la paire correspondante, supprimez)

Si vos fonctions ressemblent à ceci:

 function tick() { // ... } 
  • Accédez à la ligne avec le nom de la fonction.
  • Appuyez sur J ( rejoignez la ligne actuelle avec la ligne ci-dessous. Cela place également votre curseur sur le dernier caractère de la ligne résultante, { , juste celui dont nous avons besoin pour la commande suivante.)
  • Appuyez sur V%d (ligne visuelle, déplacez la paire correspondante, supprimez.)

ou

  • Accédez à la ligne avec le nom de la fonction.
  • Appuyez sur V[Down]%d (Ligne visuelle, déplacez une ligne vers le bas, déplacez la paire correspondante, supprimez.)

Vous pouvez utiliser ce raccourci pour supprimer non seulement la fonction, mais aussi les lignes entre accolades, c’est-à-dire le code entre les instructions if-else, while, pour les boucles, etc.

Appuyez sur Shitf + v [Vous obtiendrez en mode visuel] au début / à la fin des accolades.

Puis appuyez sur ] +} ie ] + Shitf] – Si vous êtes en accolade.

Puis appuyez sur [+ { ie [+ Shitf [ – Si vous êtes en accolade.

Puis DEL pour supprimer les lignes sélectionnées.

Utilisez ce moyen simple

  1.Go to the function definition 2.dd - delete function definition 3.d -start delete operation 4.shift+5(%) - delete the lines between { to } 

La manière la plus simple et la plus directe est la suivante (fonctionne n’importe où dans la fonction):

 v enter visual mode { move to first brace in function (may have to press more than once) o exchange cursor from top to bottom of selection } extend selection to bottom of function d delete selected text 

La séquence de commande complète serait v{o}d . Notez que vous pouvez faire d’autres opérations en plus de supprimer de la même manière. Par exemple, pour copier la fonction, utilisez y (yank) au lieu de d .

Si vous souhaitez installer des plugins, vim-textobj-function vous donnera vif pour Visual select Inside Function et vaf pour Visual select A Function.

daf supprimera la fonction, à la fois la ligne avec la signature et le corps de la fonction ( {} )

Les objects texte définis par ce plugin sont plus spécifiques et ils ne reposent pas sur le corps de la fonction, ni sur un bloc de texte contigu ou sur { beign placé au premier caractère de la ligne.

L’inconvénient est que vous dépendez d’un plugin externe.

manière non visuelle:

 d/^}/e 

… supprimer en recherchant } à la ligne, y compris pour la suppression.

sans /e (non mentionné dans les réponses ci-dessus), la solution est incomplète.

avec /e – la recherche va à la fin du match, donc la fermeture de la parenthèse est incluse et la commande est aussi bonne pour tirer:

 y/^}/e 

Une autre façon est d’aller à la ligne du début de votre fonction et d’ Vj% : Vj% (ou V%% si votre style met l’accolade sur la même ligne). Cela vous met en mode Visual-Line et le pourcentage vous mène à l’accolade de fermeture correspondante. Dans le second style, le premier% vous amène à l’accolade d’ouverture sur la ligne que vous avez sélectionnée et le second à l’accolade de fermeture correspondante.

Fonctionne également pour les parenthèses, les parenthèses, les commentaires multi-lignes de style C et les directives de préprocesseur.

Voir le manuel pour plus d’informations.

Pré-condition: être quelque part dans la fonction. Accédez à la précédente parenthèse fermante sur la première ligne en utilisant

 [] 

Ensuite, supprimez jusqu’à la prochaine parenthèse fermante sur la première ligne en utilisant

 d][ 

Si votre fonction était séparée par des lignes vierges, tapez simplement:

 dip 

ce qui signifie “supprimer le paragraphe interne”.