Saut à la définition de la fonction dans vim
Comment puis-je sauter à la définition d'une fonction à l'aide de vim? Par exemple avec Visual Aider, je peux taper Alt+g en vertu d'une fonction et il ouvre un menu contextuel de la liste des fichiers à l'aide de définitions.
Comment puis-je faire quelque chose comme cela dans vim?
- gnu global est mieux que ctags.
- pouvez-vous nous donner un peu plus de perspicacité au sujet de votre expérience? Avec quelles langues avez-gnu global de travail est la meilleure pour vous? Est-il autre chose que sur le contexte dans lequel vous préféré que moi d'être important? Ou peut-être vous l'avez utilisé dans de nombreux scénarios différents, et vous semblez principalement/préfère toujours ça? Qu'aimez-vous à propos de ce mieux? Merci.
- J'ai tourné votre commentaire dans un wiki de la communauté réponse. J'accueille vos modifications et d'entrée pour cette réponse.
Vous devez vous connecter pour publier un commentaire.
Utilisation ctags. Générer un fichier de tags, et dire vim où il est l'aide de l' :les balises de commande. Ensuite, vous pouvez simplement sauter à la définition de la fonction à l'aide de Ctrl-]
Il y a plus de balises d'astuces et de conseils dans cette question.
ctags
de ctags.sourceforge.net.ctags -R .
vim
etnvim
que les plugins en conjonction avec un autonome dédiée langage serveur qui analyse votre code en temps réel. Il y a beaucoup de LSP serveurs, par exemple Eclipse.JDT.ls pour Java, felixfbecker/php-langage-server pour PHP, et plus.jump to definition
. Il saute juste à l'endroit où il a le même symbole sous le curseur, alors que le véritablejump to definition
comme celui de l'IDE, c'est d'aller à la définition de la fonction ou d'une variable à l'intérieur de classe actuelle, même si d'autres classes ont la même fonction ou des variables.Si tout est contenue dans un fichier, il y a la commande
gd
(comme dans "goto définition"), qui vous mènera à la première occurrence dans le fichier du mot sous le curseur, qui est souvent la définition./
/
est presque toujours pas précise, car il va correspondre à tous les ocurrences. J'ai découvert que vous pouvez réellement faire:tag <function_name>
pour sauter à la définition via ctags.g* fait un travail décent sans ctags mis en place.
Qui est de type g,* (ou tout simplement * - voir ci-dessous) à la recherche du mot sous le curseur (dans ce cas, le nom de la fonction). Appuyez ensuite sur n pour passer à la suivante (ou Maj-n pour les précédentes) événement.
Il ne saute pas directement à la définition, étant donné que cette commande recherche pour le mot sous le curseur, mais si vous ne voulez pas avoir affaire avec la mise en place ctags pour le moment, vous pouvez au moins vous éviter d'avoir à re-saisissez le nom de la fonction à la recherche de sa définition.
--Edit--
Bien que je ai été en utilisant la g* pendant longtemps, j'ai découvert récemment deux raccourcis pour ces raccourcis!
(a) * permet de passer à l'occurrence suivante du mot sous le curseur. (Pas besoin de taper le
g
, le "goto" de vi).(b) # va à l'occurrence précédente, de manière similaire.
N et n encore du travail, mais '#' est souvent très utile pour démarrer la recherche d'abord dans le sens inverse, par exemple, lors de la recherche pour la déclaration d'une variable sous le curseur.
*
etg*
est les limites de mot sur la recherche.*
un\<keyword\>
de recherche (le même que\bkeyword\b
régulière regex), tandis queg*
recherches pourkeyword
sans limites des mots.*
va vous prendre en moyenne de 50 coups avant de trouver la définition.Utilisation
gd
ougD
tout en plaçant le curseur sur n'importe quelle variable dans votre programme.gd
vous mènera au local de la déclaration.gD
vous amène à la déclaration mondiale.plus d'options de navigation peuvent être trouvés dans ici.
Utilisation cscope pour les références croisées de grand projet comme le noyau linux.
Comme Paul Tomblin mentionné que vous avez à utiliser ctags.
Vous pourriez aussi envisager d'utiliser plugins à choisir l'un ou pour un aperçu de la définition de la fonction sous le curseur.
Sans plugins, vous aurez un mal de tête à essayer de sélectionner l'une des centaines surchargé 'doAction" méthodes que construit dans ctags soutien ne prend pas en compte le contexte - juste un nom.
Vous pouvez également utiliser cscope et son " trouver mondial symbole de fonction. Mais votre vim être compilé avec +cscope de soutien qui n'est pas par défaut d'une option de construire.
Si vous savez que la fonction est définie dans le fichier actuel, vous pouvez utiliser 'gD' séquences de touches dans un mode normal de sauter à la définition du mot sous le curseur.
Ici est le plus téléchargé le plugin pour la navigation
http://www.vim.org/scripts/script.php?script_id=273
Ici est celui que j'ai écrit pour sélectionner le contexte tout va à l'étiquette
http://www.vim.org/scripts/script.php?script_id=2507
Detailed description
section de#2507
script est cassé. Pouvez-vous fournir un autre s'il vous plaît?Une autre technique courante consiste à placer le nom de la fonction dans la première colonne. Cela permet à la définition de la trouver avec une simple recherche.
La fonction ci-dessus pourrait alors être trouvé avec la
/^main
à l'intérieur du fichier ou avec:grep -r '^main' *.c
dans un répertoire. Tant que le code est correctement indenté le seul moment où l'identificateur de se produire au début d'une ligne est à la définition de la fonction.Bien sûr, si vous ne l'utilisez pas ctags à partir de ce moment, vous devriez avoir honte de vous-même! Cependant, je trouve cette norme de codification un complément utile ainsi.
1 - install exuberant ctags. Si vous utilisez osx, cet article montre une petite astuce:
http://www.runtime-era.com/2012/05/exuberant-ctags-in-osx-107.html
2 - Si vous ne souhaitez inclure les ctags pour les fichiers dans votre répertoire, exécutez cette commande dans votre répertoire:
Cela va créer un "tags" fichier pour vous.
3 - Si vous êtes à l'aide de Ruby et souhaitent que les ctags pour vos gemmes (ce qui a été vraiment utile pour moi avec RubyMotion locales et les gemmes que j'ai développé), procédez de la manière suivante:
de crédit: https://coderwall.com/p/lv1qww
(Notez que j'ai omis l'option-e qui génère des balises pour emacs au lieu de vim)
4 - Ajouter la ligne suivante à votre ~/.vimrc
(Pourquoi le point virgule: http://vim.wikia.com/wiki/Single_tags_file_for_a_source_tree )
5 - Allez sur le mot que vous souhaitez suivre et frapper
ctrl + ]
; si vous souhaitez revenir en arrière, utilisezctrl+o
(source: https://stackoverflow.com/a/53929/226255)À la deuxième, la réponse de Paul: oui, ctags (surtout exuberant-ctags (http://ctags.sourceforge.net/)) est grand. J'ai également ajouté ça à mon vimrc, si je peux utiliser un fichier de tags pour l'ensemble d'un projet:
La manière moderne de faire, c'est d'exécuter un language server - un application autonome (un pour chaque langage de programmation), qui analyse l'ensemble de votre projet en temps réel et fournit des fonctionnalités de votre éditeur de texte (c'est une solution générale). Vous obtenez des choses comme:
Dans
nvim
etvim8
(ou supérieur), vous communiquer avec lang serveurs par l'installation d'un Langage Serveur de Protocole de plugin:Vous pouvez trouver une liste des activement développé des serveurs de langue et de leurs capacités sur Lang Serveur site web.
Langue Protocole de Serveur a été créé par Microsoft de Code de Visual Studio et publié comme un projet open source avec un permissive licence MIT (normalisée par la collaboration avec Red Hat et Codenvy).
Je recommande l'utilisation de LSP avec la DAP (Debug Adaptateur de Protocole) pour l'ensemble des IDE de l'expérience dans votre éditeur de choix (DAP plugin VIM: vimspector).
Installer
cscope
. Il fonctionne très bien commectags
, mais plus puissant. Pour aller à la définition, à la place de Ctrl + ], ne Ctrl + \ + g. Bien sûr, vous pouvez utiliser les deux en même temps. Mais avec un gros projet (dire le noyau Linux), cscope est miles d'avance.