Jak wstawić tekst na początku zaznaczenia wieloliniowego w vi / Vim


423

Jak w Vimie wstawiać znaki na początku każdej linii w zaznaczeniu?

Na przykład chcę skomentować blok kodu, przygotowując //na początku każdej linii, zakładając, że system komentarzy w moim języku nie pozwala na komentowanie bloków w podobny sposób /* */. Jak mam to zrobić?

Odpowiedzi:


748
  • Naciśnij, Escaby przejść do „trybu poleceń”
  • Użyj Ctrl+, Vaby przejść do trybu blokowania wizualnego
  • Przesuń Up/, Downaby zaznaczyć kolumny tekstu w wierszach, które chcesz skomentować.
  • Następnie naciśnij Shift+ ii wpisz tekst, który chcesz wstawić.
  • Następnie naciśnij Esc, odczekaj 1 sekundę, a wstawiony tekst pojawi się w każdej linii.

Aby uzyskać więcej informacji i przeczytać, sprawdź „ Wstawianie tekstu w wielu liniach ” na Wiki Vim Tips.


6
Jedynym błędem jest to, że Ctrl + V jest zastąpione w GVIM.
Jordan Parmer

14
Nie dla mnie (na Linuksie) to nie jest
pixelbeat

23
Możesz używać Ctrl-Q jako zamiennika w gVim (jako: pomoc Ctrl-V wyjaśnia), ale musisz używać hjkl do nawigacji w tym trybie zamiast klawiszy strzałek
Gareth

9
Jeśli twoje ctrl-v jest przesłonięte w Windows gvim, powinieneś edytować globalny vimrc, aby zatrzymać dołączanie mswin.vim.
graywh

18
Wiesz, dlaczego to nie zrobiłoby po popchnięciu Esc? Czekałem jak 10 sekund coś się wydarzy za mniej niż sto linii - Nieważne, ja pchał Shift + vnie CTRL + v. @ vkaul11 Prawdopodobnie to samo, co zrobiłeś lol
Tek

186

Zastępuje początek każdego wiersza „//”:

:%s!^!//!

To zastępuje początek każdej wybranej linii (użyj trybu wizualnego, aby wybrać) z „//”:

:'<,'>s!^!//!

Pamiętaj, że gv(w trybie normalnym) przywraca ostatni wybór wizualny, co jest przydatne od czasu do czasu.


3
Dzięki! Ma pełny sens. A usunięcie tekstu przebiega następująco: „<,”> s! ^ // !!
Jordan Parmer

4
Jakie jest znaczenie wykrzykników w powyższej odpowiedzi? (:% s! ^! //!)
Henrik K

19
@HKK, zwykle używa się znaku ukośnika do przodu / jako ogranicznika dla polecenia wyszukiwania i zamiany. W tym przypadku wstawiamy ukośnik w ramach wyszukiwania i zastępujemy, dlatego używamy alternatywnego ogranicznika, a mianowicie wykrzyknika!
cyber-mnich

+1 Działa to w VsVim, gdzie (Ctrl + V) (Shiift + I) Esc nie działa.
Seth Reno

4
+1, nie miał pojęcia, można użyć czegoś innego jak regex ogranicznika (tutaj używałem /i konieczności uciec //w :s/^/\/\/zamiast pisania :s!^!//)
hashbrown

83

Ogólny wzorzec wyszukiwania i zamiany to:

:s/search/replace/

Zamienia pierwsze wystąpienie „wyszukiwania” na „zamień” dla bieżącej linii

:s/search/replace/g

Zamienia wszystkie wystąpienia „wyszukiwania” na „zamień” dla bieżącej linii, „g” jest skrótem od „globalny”

To polecenie zamienia każde wystąpienie „wyszukiwania” na „zamień” tylko dla bieżącej linii. % Służy do przeszukiwania całego pliku. Aby interaktywnie potwierdzić każdą zamianę, dodaj „c”, aby potwierdzić:

:%s/search/replace/c

Interaktywne potwierdzenie zamiany „wyszukiwania” na „zamień” dla całego pliku

Zamiast znaku% możesz użyć zakresu numerów linii (zwróć uwagę, że znak „^” jest specjalnym znakiem wyszukiwania na początku linii) :

:14,20s/^/#/

Wstawia znak „#” na początku linii 14-20

Jeśli chcesz użyć innego znaku komentarza (takiego jak //), zmień ogranicznik polecenia:

:14,20s!^!//!

Wstawia sekwencję znaków „//” na początku linii 14-20

Lub zawsze możesz po prostu uciec od // znaków takich jak:

:14,20s/^/\/\//

Wstawia sekwencję znaków „//” na początku linii 14-20

Jeśli nie widzisz numerów wierszy w edytorze, po prostu wpisz następujące polecenie

:set nu

aby usunąć początek #: zamiast: 14,20s / # / ^ /, powinieneś użyć: 14,20s / # //
cn1h

1
@ cn1h Myślę, że to zastąpi również inne #w linii. Zamiast tego powinieneś użyć ^#.
ankush981,

Dziękujemy za wyjaśnienie podstaw. Dobrze wiedzieć, dlaczego coś się dzieje.
didierCH

38

Innym sposobem, który może być łatwiejszy dla początkujących:

 some█
 code
 here

Umieść kursor w pierwszym wierszu, np. Przez

gg

i wpisz następujące polecenie, aby przejść do trybu wstawiania i dodać tekst:

I / / Space

 // █some
 code
 here

Naciśnij, Escaby wrócić do trybu poleceń i użyj znaku:

j . j .

 // some
 // code
 //█here

jto polecenie ruchu, które prowadzi w dół o jeden wiersz i .powtarza ostatnie wykonane polecenie edycji.


3
To naprawdę proste :). Jeśli masz z tym problem, przyczyną może być pisanie paska (drugi symbol z \) |zamiast dużej litery I. Myślałem, że to |na początku.
Cokedude

1
Jeśli zrobię „5.” usuwa 5 znaków z tej samej linii. Jak sprawić, aby usunęło 5 znaków na raz z każdej linii?
Rahul Prasad

1
@RahulPrasad Załóżmy, że masz 25 linii, a następnie zaczynając od pierwszej linii, po prostu zapisz 5xj w rejestrze i zagraj w tym rejestrze 24 razy, na przykład: qa5xjq25 @ a Ale byłoby lepiej, gdybyś opublikował to jako rzeczywiste pytanie jeśli jeszcze nie istnieje ...
ninegrid

26

I jeszcze inny sposób:

  • Przejdź na początek linii
  • wejdź w tryb Visual Block ( CTRL- v)
  • wybierz żądane linie (przesuwanie w górę / w dół za pomocą j/ klub przeskakiwanie do linii za pomocą [line] G)
  • naciśnij I(to kapitał i)
  • wpisz znak (i) komentarza
  • naciśnij ESC

20

Dodaje to #na początku każdej linii:

:%s/^/#/

I ludzie przestaną narzekać na twój brak poprawnie komentujących skryptów.


2
Co jeśli chcesz dodać # tylko do wybranych (lub kilku) linii
Rahul Prasad

15

Jeśli chcesz się o tym przekonać, umieść to w swoim .vimrc:

vmap \c :s!^!//!<CR>
vmap \u :s!^//!!<CR>

Wtedy, gdy w trybie wizualnym, można trafić \cdo C omment bloku i \uaby u jej ncomment. Oczywiście możesz zmienić te skróty klawiszowe na cokolwiek.


Pozytywnie oceniany, ponieważ wprowadził coś nowego - vmap!
ankush981,

11

Jeszcze inny sposób:

:'<,'>g/^/norm I//

/^/to tylko fikcyjny wzór pasujący do każdej linii. normpozwala uruchamiać następujące polecenia trybu normalnego. I//mówi, aby przejść do trybu wstawiania, przesuwając kursor na początek wiersza, a następnie wstawić następujący tekst (dwa ukośniki).

:g jest często przydatny do robienia czegoś złożonego na wielu liniach, gdzie możesz chcieć przeskakiwać między wieloma trybami, usuwać lub dodawać linie, przesuwać kursor, uruchamiać wiązkę makr itp. I możesz nakazać mu działanie tylko na liniach, które dopasuj wzór.


1
właściwie polecenie: g nie jest konieczne. Spowoduje to:: „<,”> norma I //
Cyber ​​Oliveira,

1
I: s także lepiej użyć w tym przypadku.
graywh

To najbardziej przydatna odpowiedź.
Pokojowy

3

Do komentowania bloków kodu podoba mi się wtyczka NERD Commenter .

Wybierz tekst:

Shift-V
...select the lines of text you want to comment....

Komentarz:

,cc

Odkomentowanie:

,cu

Lub po prostu przełącz stan komentarza linii lub bloku:

,c<space>

2

Mogę polecić wtyczkę EnhCommentify .

na przykład. umieść to w swoim vimrc:

let maplocalleader=','
vmap <silent> <LocalLeader>c <Plug>VisualTraditional
nmap <silent> <LocalLeader>c <Plug>Traditional
let g:EnhCommentifyBindInInsert = 'No'
let g:EnhCommentifyMultiPartBlocks = 'Yes'
let g:EnhCommentifyPretty = 'Yes'
let g:EnhCommentifyRespectIndent = 'Yes'
let g:EnhCommentifyUseBlockIndent = 'Yes'

możesz następnie komentować / odkomentować (wybrane) linie za pomocą „, c”


3
Możesz także użyć Nerd Commenter na vim.org/scripts/script.php?script_id=1218
Nathan Fellman

1

Zaznacz obszar do komentarza jako blok wizualny ( <C-V)

i robić c#<ESC>p

  1. czmień to na „#”
  2. odłóż to z powrotem

Jeśli robisz to często, zdefiniuj skrót (przykład \q) w swoim .vimrc

:vmap \q c#<ESC>p

1

W przypadku, gdy czyjeś zaznaczenie wielu wierszy jest tak naprawdę akapitem, nie ma potrzeby ręcznego wybierania wierszy. vim może to dla ciebie zrobić:

  1. vip: wybierz i zaznacz cały akapit
  2. shift-i: wstaw tekst na początku linii
  3. escape: wyjdź z trybu wstawiania / wejdź w tryb normalny [początki linii wciąż wybrane]
  4. escape: odznacz początkowe linie

0

Aby wstawić „ABC” na początku każdej linii:

1) Przejdź do trybu poleceń

2):% normy I ABC


Spowoduje to dodanie tekstu po lewej stronie pierwszego spacji w wierszu.
Kingsley,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.