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.