Navigation dans les projets de code sans utiliser de commandes externes

9

J'essaie de rassembler une boîte à outils de commandes / requêtes Vim, en mode commande ou recherche, pour naviguer dans une base de code sans utiliser Ctags ou d'autres outils externes. Les ctags sont excellents mais le support peut varier en fonction de l'environnement de développement sur lequel vous êtes bloqué. Je voudrais simplement me fier aux connaissances de Vim.

user1332148
la source
4
Vous devriez peut-être dire "outils externes" au lieu de "ctags", car ma première suggestion serait cscope.
muru
1
Une chose que j'utilise est la commande gd. Cela amène le curseur à la déclaration locale de la variable sous le curseur.
nitishch
@muru Je ne veux utiliser aucun outil externe. Ce que j'essaie d'apprendre, ce sont des techniques pour naviguer efficacement dans une base de code en utilisant simplement les commandes Vim. Je sais que cela peut être fait, mais nécessite évidemment une connaissance plus approfondie de Vim que moi. Ce n'est peut-être pas une bonne question SE car elle est si ouverte mais je ne sais pas où chercher.
user1332148

Réponses:

11

"Inclure la recherche" est l'un de ces outils:

[I and ]I      " search current buffer and included files for
               " the word under the cursor, skipping comments
:ilist foo     " same as above but for 'foo'
:ilist /foo    " same as above but for a word containing 'foo'

En ce qui concerne "inclure la recherche", la "recherche par définition" est également intéressante:

[D and ]D      " search current buffer and included files for
               " the definition of the symbol under the cursor
:dlist foo     " same as above but for definition of 'foo'
:dlist /foo    " same as above but for a definition containing 'foo'

:dlist /       " list all definitions from the current buffer
               " and included files

Les deux outils dépendent d'une variété d'options qui peuvent ou non être définies par vos plugins de type de fichier.

Tu vois :help include-search.


Vous pouvez également utiliser gdet gDcomme versions légères de [Det ]D.

Tu vois :help gd.


Dans le tampon actuel, la commande ci-dessous répertorie chaque définition de fonction et son numéro de ligne:

:g/func/#

Tu vois :help :g.


:grepet :vimgrepsont également utiles, ne serait-ce que parce que leur résultat est introduit dans la liste des quickfix avec laquelle vous pouvez naviguer :cn, :cp… et affiché dans la fenêtre très pratique des quickfix.

Voir :help :grep, :help :vimgrepet :help quickfix.


En parlant de la liste quickfix / fenêtre, je l' ai écrit cette fonction (basée sur le travail des autres) pour afficher les résultats de [I, ]I, :ilist, [D, ]Det :dlistdans la liste des quickfix / fenêtre. YMMV bien sûr.


Bien que n'étant pas strictement un outil de navigation, je trouve la fenêtre d'aperçu très utile pour jeter un œil à la signature de la fonction avec laquelle je travaille.

Tu vois :help preview-window.


Cela dit…

Vim ne sait rien de votre code au-delà de quelques modèles d'expression régulière qui peuvent ou non correspondre à votre style de codage ou autre. Cela signifie que la navigation dans le code est mieux effectuée à l'aide d'outils externes tels que ctags, cscope ou GNU GLOBAL.

romainl
la source
5

Il existe de nombreuses façons de naviguer dans le code (inclus dans Vim et externe), je les découvre encore. Ce que j'utilise dans le travail quotidien est:

  • Greping texte dans les fichiers du projet et navigation via la fenêtre quickfix (j'utilise Silver Searcher pour greping).
  • En utilisant des plugins liés au langage, je sais qu'il y en a pour javascript, ruby, go, qui permettent de sauter entre les modules du programme (dans le plugin javascript c'est gf-command
  • Ctrl+O, Ctrl+I- sauter en arrière ou en avant dans "l'historique" de la navigation
  • g; - sauter sur la dernière place éditée dans le fichier
  • Utiliser des marques pour placer des «signets» sur des endroits particuliers. Vous pouvez placer une marque avec la '[some_letter]commande, si la lettre est en majuscule, vous obtiendrez une marque qui sera accessible à partir de n'importe quel fichier (tampon).
Alexander Myshov
la source