2010-03-30 4 views
1

Je dois travailler sur des fichiers de code relativement énormes dans vim.Comment limiter les opérations à certaines lignes?

Comment restreindre certaines opérations comme find-next normal-n et d'autres à une fonction/un bloc donné?

Comment savoir visuellement si je suis dans ce bloc ou à l'extérieur?

Les numéros de ligne et de regard semblent bizarres, surtout que les numéros de ligne avec lesquels je dois travailler ont généralement 5 chiffres!

+0

@Closers: Comme il s'agit d'utiliser vim pour manipuler le code source, SO peut être plus approprié que SU. Voir http://meta.stackexchange.com/questions/43198/emacs-questions-superuser-or-stackoverflow. –

Répondre

3

Vous pouvez définir des marques au début et à la fin de votre bloc à l'aide m (par exemple ma, mb) et puis se référer à eux dans la gamme d'une commande ex comme :'a,'b.

Comme bignose said vous pouvez utiliser un bloc visuel pour créer une région implicite pour une commande qui peut être transmis à une commande ex en utilisant :'<,'>

Vous pouvez également utiliser des expressions rationnelles pour délimiter un bloc (par exemple, pour toutes les lignes entre start et end utilisation :/start/,/end/

Par exemple, pour faire une substitution dans une gamme de lignes:

:'<,'>s/foo/bar/g 
:'a,'bs/baz/quux/g 
:/harpo/,/chico/s/zeppo/groucho/g 

Le dernier visuellement La plage sélectionnée est mémorisée afin que vous puissiez la réutiliser sans la resélectionner.

Pour en savoir plus sur les gammes, voir :help range

Vous pouvez encore vous limiter dans une plage en utilisant g//. Par exemple, si vous vouliez remplacer foo avec bar uniquement sur les lignes contenant baz dans la plage sélectionnée:

:'<,'>g/baz/s/foo/bar/g 

Lorsque vous définissez une nouvelle commande ex, vous pouvez passer la plage donnée à l'ex-commande en utilisant comme <line1>,<line2> . Voir :help user-commands pour plus d'informations sur la définition des ex-commandes.Dans une fonction vimscript, vous pouvez accéder à une plage implicitement transmise en utilisant a:firstline et a:lastline. Vous pouvez détecter votre numéro de linge actuel en utilisant line('.') et détecter si vous êtes à l'intérieur du bloc en utilisant une logique booléenne normale (a:firstline <= line('.') && line('.') <= a:lastline). Voir :help functions pour plus d'informations sur les fonctions de vimscript.


Une autre approche consiste à utiliser i internes vim et simples a sélecteurs. Par exemple, pour supprimer l'intégralité d'une chaîne entre guillemets doubles, utilisez da" en mode normal. Pour laisser les guillemets, utilisez di". Voir :help object-select pour plus.

0

Vim utilise Shift-v pour sélectionner les lignes. Après avoir sélectionné une série de lignes, de nombreuses commandes seront alors restreintes à la sélection.

Je ne pense pas que les commandes de recherche (/, n, etc.) sont limitées de cette façon.

+0

N'ajoutez pas de tags [belongs-on-XXX]. http://meta.stackexchange.com/questions/10216/can-we-disallow-the-use-of-belongs-on-xxxxxxx-and-not-programming-related-tag –

+0

Mais alors je dois être en visuel sélectionnez le mode tout le temps. Pas pratique. – Ayman

0

Pour des commandes telles que la recherche et remplacer, vous pouvez facilement vous limiter à quelques lignes:

:.,+3s/foo/bar/cg 

remplace toutes les occurrences de « foo » dans la ligne courante et les 3 lignes avec « bar » suivantes. Cependant, je ne pense pas que vous puissiez le faire pour la recherche.

+0

problème est, mon "bloc" à manipuler est de plus de 1000 lignes, d'un total de plus de 20k. Et je peux ajouter/supprimer des lignes, donc cela ne fonctionnerait pas. – Ayman

+3

Eh bien, si vous faites des dizaines d'opérations ou plus, ce n'est pas trop difficile d'ouvrir une nouvelle fenêtre, couper et coller les lignes sélectionnées et quand vous avez terminé, collez le texte mis à jour. –

Questions connexes