Wie ersetze ich nur innerhalb der visuellen Auswahl?

27

Wie erhält man vim, einen Buchstaben innerhalb der Sichtauswahl nur und nicht anderswo auf der Linie zu ersetzen ? Beispiel:

  • Linie: int arr[] = { 00 01 02 03 04 05 05 /* ... lots more like this*/};
  • Visuelle Auswahl: { 00 01 02 03 04 05 05 /*... lots more like this*/}
  • Befehl: :'<,'>s/\ /\,0x/g
  • Erwartet: int arr[] = {0x00,0x01,0x02,0x03 /* and so on*/};

Nach diesen Aktionen ist das tatsächliche Ergebnis jedoch:

int,0xarr[],0x=,0x{0x00,0x01,0x02,0x03 /* and so on*/};

Gibt es eine Möglichkeit, den obigen Befehl zu ändern, um das erwartete Ergebnis zu erzielen? Definiert '<und nicht '>den Bereich, in dem die Befehle Suchen (und Ersetzen) funktionieren?

Bhargav Bhat
quelle
2
Ich kenne die Antwort nicht, aber ich weiß, dass :substituteOperatoren zeilenweise arbeiten, was erklärt, was Sie in Ihrem Beispiel sehen.
Karl Yngve Lervåg

Antworten:

32
:'<,'>s/\%V\ /\,0x/g

%VStimmt mit dem visuellen Bereich überein. Sehen :help %V.

VenkatH
quelle
1
Es sollte erwähnt werden, dass diese Lösung nur überprüft, dass der Beginn des Spiels innerhalb der visuellen Auswahl liegt .
Christian Brabandt
7

Es gibt \%Vfür das, siehe :h %V:

\% V

Übereinstimmung im visuellen Bereich. Wenn der visuelle Modus bereits gestoppt wurde, stimmen Sie mit dem Bereich überein, den gv erneut auswählen würde. Dies ist eine / Null-Breitenübereinstimmung. Um sicherzustellen, dass sich das gesamte Muster im visuellen Bereich befindet, setzen Sie es an den Anfang und das Ende des Musters , z. B .:> /\%Vfoo.*bar\%V

Um nur in der Auswahl foodurch zu ersetzen bar, verwenden Sie:

:'<,'>s/\%Vfoo\%V/bar/
:'<,'>s/\%Vfoo\%V/bar/g
:'<,'>s/\%Vfoo\%V/bar/cg

In diesem speziellen Fall:

:'<,'>s/\%V\ \%V/\,0x/g
Dessert
quelle
4

Wenn Sie innerhalb eines visuellen Blocks ersetzen möchten , können Sie das vis.vimPlugin verwenden .

http://vim.wikia.com/wiki/Applying_substitutes_to_a_visual_block

Installieren:

Laden Sie vis.vba.gz von http://www.drchip.org/astronaut/vim/index.html#VIS herunter

# Open vis.vba.gz in Vim 7.1 or later.
vim vis.vba.gz

# Source the open file.
:so %

# Quit Vim
:q

Einmal installiert:

ctrl-v to enter visual-block mode
Move to select the block you want
:B s/pattern/newtext/

Wenn Sie tippen :B, sehen Sie dies

:'<,'>B 

Das ist in Ordnung, es ist nur vim zu sagen, dass der Befehl auf den aktuell ausgewählten visuellen Block angewendet wird.

Noch besser ist, dass Sie jeden Ex-Befehl für den visuellen Block ausführen können, nicht nur Ersetzungen. Zum Beispiel :B !sort.

Christian Long
quelle