2009-04-18 4 views
7

ReSharper a une fonctionnalité intéressante appelée "étendre la sélection": en appuyant sur CTRL+W (je pense que c'est la valeur par défaut) à plusieurs reprises, vous sélectionnez de plus en plus à partir de l'emplacement de votre curseur actuel. C'est d'abord un mot, puis de plus en plus de mots, une ligne, un bloc de lignes interne puis externe (par exemple un bloc if), puis une fonction, etc ...Existe-t-il un moyen d'émuler la fonctionnalité «étendre la sélection» de ReSharper dans Vim?

Fondamentalement, en appuyant plusieurs fois sur la combinaison de touches, vous pouvez finir par sélectionner le fichier entier. Je suis sûr qu'au moins certains d'entre vous le sauront.

Je viens de commencer à apprendre toutes les subtilités de vim et je n'ai pas assez d'expérience pour voir comment quelque chose comme ça pourrait être implémenté dans Vim (bien que je suppose que c'est possible). Donc, ma question s'adresse à Vim gourous: est-ce que cela peut être fait et comment?

Mise à jour: un peu d'histoire. J'ai parlé à mon ex-patron de tous les avantages de Vim, et il pense que tout est génial. Sa seule question/problème était: at-il "étendre la sélection"? Ma question à ce jour a été no. Donc, si quelqu'un connaît la réponse, je vais enfin gagner une discussion: P (et peut-être créer un nouveau Vim convertir :-))

+1

Incroyable comment personne répondant ici n'a reconnu le besoin d'un analyseur (partiel) approprié. Resharper implémente cette fonctionnalité (géniale) au-dessus d'un modèle logique du code: le code DOM. C'est aussi ce qui permet aux refactorings de travailler sur les sélections effectuées. Sans analyseur approprié, vous sélectionnez les «choses» mais pas les (sous-) expressions correctes. Ce dernier serait utile, mais pas actuellement pris en charge dans Vim _That. sauf si vous comptez le support de Lisp: 'vabababo2k' est parfait pour lisp_ :) – sehe

+0

@sehe: Vous avez, bien sûr, tout à fait raison. Je réfléchis à ce problème depuis que j'ai posé la question ici (il y a longtemps!) et j'ai réalisé que même si je réussis à créer cette fonctionnalité, cela ne fonctionnera que pour une langue spécifique ou une famille de langues. Dommage, n'est-ce pas? :) –

+0

J'ai réfléchi moi-même aussi. Je serais heureux avec une solution à 90% (je peux faire des refactorings assez rapidement dans Vim manuellement pour l'instant). Cependant, une sous-expression-matching-selection-expander 'utilisable' est vraiment ma fonction de rêve n ° 1. Je suis convaincu qu'il est très possible de trouver un analyseur qui va DoTheRightThing pour C#, Java, C++ et C; Les seuls cas de bords collants que j'attends sont C# vs C++ 0x lambdas. Donc, je les laisserais probablement dehors pendant un certain temps (et je m'assurerais que c'est branché). Je suis toujours en train de décider de ce qu'il faut utiliser, car je déteste le script vim. Je me penche vers python, mais je suis fatigué d'exclure les bases utilisateurs – sehe

Répondre

3

J'ai rapidement essayé ce problème. Ça ne marche pas comme ça. N'hésitez pas à faire des modifications et à publier sur le wiki vim ou en tant que plugin si vous l'avez raffiné.

chances sont que vous voudriez faire ag: resharp_list pour chaque langue (par exemple une pour les langues paranthesised, etc.).

Tout ce qui est nécessaire est un marqueur pour la position du curseur d'origine: il marqueurs et autocommande timeout qui réinitialise l'index.

"resharp emulator 
"TODO this needs a marker 
"also c-w is bad mapping as it has a lag with all the other- 
"window mappings 
" 
let g:resharp_index = 0 

let g:resharp_select = ['iw', 'is', 'ip', 'ggVG'] 

func! ResharpSelect() 
    if g:resharp_index >= len (g:resharp_select) 
     let g:resharp_index = 0 
    endif 

    exe "norm \<esc>v" . g:resharp_select[g:resharp_index] 
    let g:resharp_index = g:resharp_index + 1 
endfun 

nnoremap <c-w> :call ResharpSelect()<cr> 
vnoremap <c-w> :call ResharpSelect()<cr> 

"Something to reset on timeout. TODO this doesn't work 
au CursorHold :let g:resharp_index = 0<cr> 
+0

Juste essayé, c'est un bon début! J'espère que je vais apprendre le script vim un jour et l'étendre –

+0

Pour rendre cela plus vim-vous, vous devriez probablement être la mise en œuvre des mappages opérateur – sehe

3

La réponse est oui. Une fois en mode Visual, vous pouvez utiliser toutes les méthodes de navigation habituelles ainsi que certaines méthodes supplémentaires.

Certains de mes favoris? Tout d'abord frappé v alors en mode normal pour obtenir en mode visuel puis appuyez sur:

  1. iw - pour sélectionner le mot intérieur. Idéal pour sélectionner un mot tout en excluant les accolades ou les guillemets environnants
  2. w - appuyez plusieurs fois pour continuer à sélectionner chaque mot suivant.
  3. b - sélectionnez WordWise Backwords
  4. ^ - sélectionner tous de la position actuelle au début du texte sur la ligne
  5. $ - tout sélectionner la position actuelle à la fin de la ligne

Je suis sûr que d'autres ici pourraient ajouter à cette liste aussi bien. Oh et n'oubliez pas le mode Visual Block Block Cv l'essayer dans vim avec les commandes ci-dessus cela fonctionne en deux dimensions :-)

+0

Je suis relativement familier avec le mode visuel, mais la différence principale est que vous devez bouger vos doigts et penser à ce que vous voulez sélectionner ensuite (ou, en d'autres termes, _where_ pour étendre votre sélection). Le but est de fusionner tous ceux-ci séquentiellement à une seule combinaison de touches. [J'espère que je suis assez clair, je ne suis pas un locuteur natif anglais] –

+0

Eh bien, c'est faisable dans Vim, il faut juste écrire une fonction vim qui passe par différents niveaux de sélection, et mapper une frappe à cette fonction. – rampion

2

Si vous parlez de Vim (et vous devriez être :-), vous pouvez commencer marquer le texte avec la commande v, alors vous avez toutes les commandes de déplacement du curseur standard (et, comme vous le savez, il y a un lot d'entre eux) qui va étendre la sélection, ainsi que le déplacement du curseur.

Ensuite, vous faites ce que vous voulez avec le texte sélectionné.

Voir here pour les détails sanglants.

+0

Le même commentaire que pour Jeremy Wall :) –

2

Il faudrait écrire une fonction qui enregistrerait la sélection en cours, puis essayer des sélections de plus en plus larges, jusqu'à ce que la nouvelle sélection dépasse la sélection sauvegardée ou sélectionne tout le texte.Certaines sélections possibles sont:

  • viw - select mot
  • vis - select phrase
  • vip - sélectionnez le paragraphe
  • VIB - sélectionner du texte dans les supports les plus intimes
  • v2iB - sélectionner du texte dans le prochain la plupart des supports les plus intimes
  • ggVG - sélectionner tout le texte
+0

C'est exactement ce que je veux dire, seul problème étant que je ne suis pas familier avec le langage de script Vim. :( –

1

Je pense que Jeremy Wall se dirige dans la bonne direction. Et pour aller un peu plus loin dans cette direction, vous pouvez regarder le script "surround.vim" de Tim Pope. Une bonne description est disponible on github. Ou, si vous préférez, obtenez-le à partir de vim.org. Cela vous aidera probablement à faire certaines choses que vous aimeriez faire, même si cela ne semble pas avoir de fonction, simplement en sélectionnant dans une balise. Faites-moi savoir si j'ai tort. En fin de compte, ce que vous aimeriez vraiment, c'est une hiérarchie d'objets texte englobants. Vous devriez lire sur les objets texte si vous ne l'avez pas fait. Un bon aperçu est here. Notez que vous pouvez saisir plusieurs objets en une seule fois en utilisant les comptes, ou le faire de manière itérative (essayez vawasap}}} en mode normal).

Vous pouvez également obtenir des scripts qui définissent d'autres objets-texte, tels que this one qui utilise l'indentation pour définir un objet-texte. Cela fonctionnera pour beaucoup de langues si vous mettez en forme selon des normes communes, et garanti pour python. Un inconvénient est que le curseur se termine à la fin du bloc visuel, donc, par exemple, vous ne pouvez pas facilement tout sélectionner entre some(), puis obtenir le nom de la fonction qui les précède ... Mais je viens de trouver dans this post que vous pouvez changer ce comportement avec o. Cool!

Je suppose que vous serez plus efficace pour passer à travers les sélections intermédiaires à long terme.

De toute façon, je serais curieux de voir si quelqu'un d'autre propose une solution plus générale aussi!

+0

Merci pour les liens! posé cette question il y a «longtemps», les scripts Vim me semblent encore magiques :) –

Questions connexes