Question

À l'aide de Vim je veux souvent de remplacer un bloc de code avec un bloc que je viens d'arrachement.

Mais quand je supprime le bloc de code qui doit être remplacé, ce bloc lui-même va dans le registre qui efface le bloc j'ai juste tiré.Donc j'ai l'habitude de les extraire, puis en insérant, puis en supprimant ce que je ne voulais pas, mais avec de gros blocs de code cela devient malpropre en essayant de garder le bloc inséré et le bloc à supprimer séparé.

Alors, quel est le meilleurs et le plus rapide pour remplacer du texte dans Vim?

  • est-il un moyen pour supprimer du texte sans le mettre dans le registre?
  • est-il possible de dire par exemple"remplacer le mot suivant" ou "remplacer le paragraphe suivant"
  • ou est le meilleur moyen de faire en quelque sorte utiliser le multi-registre fonctionnalité?
Était-ce utile?

La solution

Pour supprimer quelque chose sans l'enregistrer dans un registre, vous pouvez utiliser le "trou noir s'enregistrer":

"_d

Bien sûr, vous pouvez également utiliser l'une des autres registres que de ne pas tenir quelque chose que vous êtes intéressé dans.

Autres conseils

Yep.C'est un peu plus compliquée que la suppression de la "vieille" d'abord du texte, mais:

J'ai commencer avec..

line1
line2
line3
line4

old1
old2
old3
old4

J' maj+v sélectionnez la ligne 1, ligne 2, 3 et 4, et de les supprimer à l' d commande

Puis-je supprimer le vieux de 1 à 4 lignes de la même manière.

Ensuite, ne

"2p

Que vais coller l'avant-dernier arracha des lignes (lignes 1-4). "3p va faire le troisième-de-dernier et ainsi de suite..

Donc je me retrouve avec

line1
line2
line3
line4

Référence: La documentation de Vim sur des feuillets numérotés registre

VIM docs: Numéroté inscrire 0 contient le texte le plus récent à l'aide de la commande yank, à moins que la commande spécifié un autre registre avec [x].

E. g.nous yank "foo" et supprimer "barre" - le registre 0 contient encore "foo"!Par conséquent, les "foo" peut être collé à l'aide de "0p

Il est pratique d'en avoir un facile de cartographie qui vous permet de remplacer la sélection en cours avec tampon.

Par exemple, lorsque vous le mettez dans votre .vimrc

vmap r "_dP       // it's a capital 'p' on the end

puis, après la copie de quelque chose dans le registre (c'est à direavec "y"), il vous suffit de sélectionner le texte que vous voulez être remplacé, et il suffit d'appuyer sur " r " de votre clavier.La sélection sera remplacé par votre registre.

Explication:

vmap - mapping for visual mode
"_d - delete current selection into "black hole register"
P - paste

J'ai mis la suivante dans mon vimrc:

noremap  y "*y
noremap  Y "*Y
noremap  p "*p
noremap  P "*P
vnoremap y "*y
vnoremap Y "*Y
vnoremap p "*p
vnoremap P "*P

Maintenant je tirer et placer dans le presse-papiers vous inscrire, et n'ont pas de soins de ce qui se passe avec la valeur par défaut de vous inscrire.Un avantage supplémentaire est que je peux coller à partir d'autres applications avec un minimum de tracas.Je suis en perte de certaines fonctionnalités, je sais, mais je ne peux pas garder une trace de plus d'un registre/presse-papiers de toute façon.

Pour l'exemple que vous avez donné, si je comprends bien la question, alors que cela peut fonctionner:

*Highlight what you want to put somewhere else
*delete (d)
*Highlight the code that you want it to replace
*paste (p)

Tous les copier et supprimer des opérations écrire dans le registre sans nom par défaut.Toutefois, la plus récente yank et la plus récente supprimer sont toujours stockés (séparément) dans les registres numérotés.Le registre 0 détient le plus récent yank.Les registres 1-9 maintenez le 9 le plus récent supprime (avec 1 étant la plus récente).

En d'autres termes, un supprimer écrase le plus récent tirer dans le registre sans nom, mais il est toujours là dans le 0 vous inscrire. Le blackhole-registre astuce ("_dd mentionné dans les autres réponses des œuvres, car il évite d'écraser le registre sans nom, mais il n'est pas nécessaire.

Vous faites référence à un registre à l'aide de guillemets, afin de coller le plus récemment arrachés de texte qui peut être fait comme ceci:

"0p

C'est une excellente référence:

Pour souligner ce EBGreen dit:

Si vous collez lors de la sélection de texte, le texte sélectionné est remplacé avec le texte collé.

Si vous souhaitez copier du texte, puis le coller dans plusieurs endroits, l'utilisation "0p pour coller.Numéroté inscrire 0 contient le texte le plus récent à l'aide de la commande yank.


Aussi, vous pouvez lister le contenu de toutes vos registres:

:registers

Cette commande rend plus facile de comprendre ce registre que vous voulez quand vous faites quelque chose comme dbr réponse.Vous verrez également le /,%,# registres.(Voir aussi :help registers)


Et enfin, découvrez cW et cW pour modifier un mot y compris et non compris un espace de fin.(L'utilisation du capital W comprend la ponctuation.)

Si vous utilisez Vim, alors vous aurez le mode visuel, qui est comme la sélection, mais avec la séparation des modes chose qui est à la base de vi/vim.

Ce que vous voulez faire est d'utiliser le mode graphique pour sélectionner la source, puis tirer, puis utiliser le mode visuel de nouveau pour sélectionner le champ d'application de la destination, puis coller du texte à partir de la mémoire tampon par défaut.

Exemple:

Dans un fichier texte avec:

1| qwer
2| asdf
3| zxcv
4| poiu

avec la séquence suivante: ggVjyGVkp vous vous retrouverez avec:

1| qwer
2| asdf
3| qewr
4| asdf

A expliqué:

  • gg:aller à la première ligne
  • V:démarrez visual mode avec des lignes entières
  • j:aller une ligne vers le bas (avec la sélection a commencé sur les lignes précédentes ce qui pousse la sélection d'une ligne vers le bas)
  • y:yank de la mémoire tampon par défaut (les deux lignes sélectionnées, et il quitte automatiquement vous du mode visuel)
  • G:aller à la dernière ligne
  • V:démarrer le mode visuel (comme avant)
  • k:aller jusqu'à une ligne (comme avant, avec le mode visuel est activé, ce qui pousse la sélection d'une ligne vers le haut)
  • p:coller (avec la sélection sur les deux dernières lignes, il remplacera ces lignes avec ce qui reste dans la mémoire tampon -- les 2 premières lignes dans ce cas)

Cela a le petit inconvénient qui met le dernier bloc sur le tampon, de sorte qu'il est en quelque sorte n'est pas souhaité répété pastings de la même chose, de sorte que vous voulez enregistrer la source d'un nom de tampon avec quelque chose comme "ay (pour un tampon appelé "a") et de la coller avec quelque chose comme "ap (mais alors, si vous êtes à la programmation, vous ne voulez probablement pas à coller plusieurs fois, mais pour créer une fonction et de l'appeler, non? DROIT?).

Si vous êtes seulement en utilisant vi, alors youll ont à utiliser invisible marques plutôt que le mode visuel, :he mark pour plus de détails sur ce, je suis désolé mais je ne suis pas très bon avec cet invisible marques de chose, je suis assez contaminés par le mode visuel.

Pour "remplacer le mot", essayez de cw en mode normal.

Pour "remplacer le paragraphe", essayez cap en mode normal.

Un minimum invasive solution pour les paresseux:

Registre 0 contient toujours le dernier yank (comme Rafael, alex2k8 et idbrii l'avons déjà mentionné).Malheureusement, la sélection s'inscrire 0 tout le temps peut être assez ennuyeux, donc ce serait bien si p utilise "0 par défaut.Ceci peut être réalisé en mettant les lignes suivantes dans votre .vimrc:

noremap p "0p
noremap P "0P
for s:i in ['"','*','+','-','.',':','%','/','=','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
    execute 'noremap "'.s:i.'p "'.s:i.'p'
    execute 'noremap "'.s:i.'P "'.s:i.'P'
endfor

La première ligne de cartes de chaque p course à "0p.Cependant, ce qui empêche l' p l'accès à toute les autres registres.Par conséquent, tous les p avec les coups explicitement registre sélectionné sont mappés à l'équivalent de ligne de commande de l'expression à l'intérieur de la boucle for.De la même manière P.

De cette façon, le comportement normal est conservé, à l'exception de l'implicite p et P les traits, qui maintenant utilise le registre 0 par défaut.

Conseil 1: La commande cut est maintenant "0d au lieu de simplement d.Mais depuis que je suis paresseux, c'est beaucoup trop long pour moi ;) Donc je suis en utilisant le mappage suivant:

noremap <LEADER>d "0d
noremap <LEADER>D "0D

Le leader de la clé est \ par défaut, de sorte que vous pouvez facilement couper le texte en tapant \d ou \D.

Conseil 2: Le délai d'attente par défaut pour le multi-mappages de touches est assez court.Vous souhaiterez peut-être augmenter pour avoir plus de temps lors de la sélection d'un registre.Voir :help timeoutlen pour plus de détails, je suis en utilisant:

set timeout timeoutlen=3000 ttimeoutlen=100

Bien, d'abord faire cette commande:

:h d

Ensuite, vous vous rendrez compte que vous pouvez le supprimer dans un registre spécifique.De cette façon, vous n'aurez pas à modifier ce qui est dans votre défaut de vous inscrire.

Texte supprimé, tandis que dans le mode insertion, n'est pas en défaut de s'inscrire.

Les deux solutions que j'utilise dans le droit de contextes;

  • mettre en évidence ce que vous souhaitez remplacer à l'aide de Vims VISUAL mode, puis collez le registre.

J'utilise la plupart du temps hors de l'habitude que je n'ai trouvé que la deuxième solution, beaucoup plus tard, par exemple

yiw   " yank the whole word
viwp  " replace any word with the default register
  • YankRing.Avec ce plugin, vous pouvez utiliser le raccourci <ctrl>+<p> pour remplacer le précédent numérotés de registre avec celui que vous venez de coller.

Fondamentalement, vous allez sur le collage en tant que vous voulez, mais quand vous réalisez que vous avez fait depuis écrasé le défaut de registre de perdre ainsi ce que vous avez réellement voulu coller vous pouvez <C-P> pour rechercher et remplacer du YankRing histoire!

L'un de ceux-ci doivent avoir des plugins...

J'ai trouvé très utile pour la cartographie de votre objectif:

xnoremap p "_dP

Le texte supprimé est mis en trou noir "s'inscrire", et l'arracha le texte demeure.

Source: http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text

Dans la version windows (probablement sous Linux aussi), vous pouvez tirer dans le système de copier/coller le tampon à l'aide de "*y (c'est à direprécédant votre yank commande avec des guillemets et de l'astérisque).

Vous pouvez ensuite supprimer le remplaçable les lignes normalement et coller le texte copié à l'aide de "*p.

Je fais souvent une erreur lorsque l'on suit les commandes de "y'ank puis" "_d'elete dans un trou noir, alors" p aste.Je préfère 'y'ank, puis de les supprimer comme je veux, puis" "0p' 0 registre, qui est l'endroit où le dernier texte copié est poussé à l'.

Ma situation:dans Normal mode, quand j'ai supprimer les caractères à l'aide de la x keypress, ces suppressions d'écraser ma dernière registre -- compliquer les modifications lorsque je veux supprimer des caractères à l'aide de x et coller quelque chose que j'ai dans mon dernier registre (par exemplecoller le même texte à deux endroits ou plus).

J'ai essayé la suggestion dans l'acceptation de la réponse ("_d), mais cela n'a pas fonctionné.

Cependant, à partir de la accepté de répondre/commentaires https://vi.stackexchange.com/questions/122/performing-certain-operations-without-clearing-register, J'ai ajouté à mon ~/.vimrc, qui fonctionne (vous pouvez avoir à redémarrer Vim):

nnoremap x "_x

C'est, je peux maintenant faire de mon normal yank (y), supprimer (d) et coller (lep des commandes -- et les personnages que j'ai à supprimer à l'aide x ne plus remplir les plus récentes des registres.

Pour Dvorak utilisateurs, un très pratique la méthode est à juste supprimer inutiles de texte dans la "1 registre, au lieu de "_ trou noir s'inscrire, si seulement parce que vous pouvez appuyer sur "+ 1 avec le même changement de la presse et une rapide pinky mouvement depuis le 1er est la clé immédiatement au-dessus " de Dvorak (PLUS d est dans l'autre main, ce qui rend l'ensemble de la commande rapide comme l'enfer).

Alors bien sûr, le "1 registre pourrait être utilisé pour d'autres choses parce que c'est pratique, mais à moins que vous avez un objectif plus commun que le remplacement de texte, je dirais que c'est une très bonne utilisation du registre.

Pour ceux d'entre vous qui sont les principaux intéressés de ne pas écraser le registre sans nom lorsque vous remplacez le texte par le virtuel, la sélection et la coller.

Vous pouvez utiliser la solution suivante qui est simple et qui fonctionne le mieux pour moi:

xnoremap <expr> p 'pgv"'.v:register.'y'

C'est à partir des réponses (et les commentaires) ici:Comment faire pour coller sur sans écraser registre

On a passé la sélection tout d'abord, puis la sélection avec le nouveau texte est à nouveau sélectionnée (gv).Maintenant, le registre qui a été utilisé en dernier en mode visuel (normalement le registre sans nom, mais fonctionne également sans effets secondaires si vous utilisez un autre registre pour le collage).Et puis tirez-la nouvelle valeur de l'enregistrer de nouveau.

PS:Si vous avez besoin d'une variante plus simple qui fonctionne aussi avec intellj idée de plugin vim-simulation, vous pouvez prendre celui-ci (à la baisse:remplacer registre sans nom, même si un autre registre a été donné pour le coller):

vnoremap p pgvy

Pour emacs-le mal d'utilisateurs, la fonction (evil-paste-pop) peut être déclenché après le collage, et de parcourir les entrées précédentes dans le kill-ring.En supposant que vous avez lié à <C-p> (par défaut dans Spacemacs), vous toucheriez p suivi par le plus grand nombre <C-p> en tant que de besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top