Come inserire il testo all'inizio di una selezione su più righe in vi / Vim


423

In Vim , come inserisco i caratteri all'inizio di ogni riga in una selezione?

Ad esempio, voglio commentare un blocco di codice anteponendo //all'inizio di ogni riga supponendo che il sistema di commenti della mia lingua non consenta commenti a blocchi come /* */. Come lo farei?

Risposte:


748
  • Premere Escper accedere alla "modalità di comando"
  • Utilizzare Ctrl+ Vper accedere alla modalità blocco visivo
  • Sposta Up/ Downper selezionare le colonne di testo nelle righe che vuoi commentare.
  • Quindi premi Shift+ ie digita il testo che desideri inserire.
  • Quindi premi Esc, aspetta 1 secondo e il testo inserito apparirà su ogni riga.

Per ulteriori informazioni e lettura, controlla " Inserimento di testo in più righe " nel Wiki di Vim Tips.


6
L'unico inconveniente è che sembra che Ctrl + V sia sovrascritto in GVIM.
— Jordan Parmer,

14
Non per me (su Linux) non lo è
— pixelbeat,

23
Puoi usare Ctrl-Q come sostituto in gVim (come: help Ctrl-V spiega) ma devi usare hjkl per navigare in questa modalità piuttosto che i tasti freccia
— Gareth,

9
Se il tuo ctrl-v viene sovrascritto in windows gvim, dovresti modificare il vimrc globale per smettere di includere mswin.vim.
— graywh

18
Qualche idea sul perché questo non farebbe nulla dopo aver premuto esc? Ho aspettato come 10 secondi che accadesse qualcosa in meno di un centinaio di linee - Non importa, stavo spingendo Shift + vnon CTRL + v. @ vkaul11 Probabilmente la stessa cosa che hai fatto lol
— Tek,

186

Questo sostituisce l'inizio di ogni riga con "//":

:%s!^!//!

Questo sostituisce l'inizio di ogni riga selezionata (usa la modalità visiva per selezionare) con "//":

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

Si noti che gv(in modalità normale) ripristina l'ultima selezione visiva, questo è utile di volta in volta.


3
Grazie! Ha un senso totale. E la rimozione del testo procede come segue: '<,'> s! ^ // !!
— Jordan Parmer,

4
Qual è il significato dei punti esclamativi nella risposta sopra? (:% s! ^! //!)
— Henrik K,

19
@HKK, normalmente si usa il carattere barra / come delimitatore per il comando di ricerca e sostituzione. In questo caso stiamo inserendo una barra in avanti come parte della ricerca e sostituiamo in modo da utilizzare un delimitatore alternativo, ovvero il carattere esclamativo!
— cyber-monk,

+1 Funziona in VsVim dove (Ctrl + V) (Shiift + I) Esc no.
— Seth Reno,

4
+1, non avevo idea che avresti potuto usare qualcos'altro come delimitatore regex (qui stavo usando /e dovendo sfuggire a //in :s/^/\/\/invece di scrivere :s!^!//)
— Hashbrown,

83

Lo schema generale per la ricerca e la sostituzione è:

:s/search/replace/

Sostituisce la prima occorrenza di "cerca" con "sostituisci" per la riga corrente

:s/search/replace/g

Sostituisce tutte le occorrenze di "cerca" con "sostituisci" per la riga corrente, "g" è l'abbreviazione di "globale"

Questo comando sostituirà ogni occorrenza di "cerca" con "sostituisci" solo per la riga corrente. % Viene utilizzato per cercare nell'intero file. Per confermare ciascuna sostituzione in modo interattivo, aggiungere una 'c' per confermare:

:%s/search/replace/c

Conferma interattiva sostituendo 'cerca' con 'sostituisci' per l'intero file

Invece del carattere% è possibile utilizzare un intervallo di numeri di riga (notare che il carattere '^' è un carattere di ricerca speciale per l'inizio della riga) :

:14,20s/^/#/

Inserisce un carattere '#' all'inizio delle righe 14-20

Se si desidera utilizzare un altro carattere di commento (come //), modificare il delimitatore di comando:

:14,20s!^!//!

Inserisce una sequenza di caratteri '//' all'inizio delle righe 14-20

Oppure puoi sempre sfuggire ai // personaggi come:

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

Inserisce una sequenza di caratteri '//' all'inizio delle righe 14-20

Se non vedi i numeri di riga nel tuo editor, digita semplicemente quanto segue

:set nu

per rimuovere l'inizio #: anziché: 14,20s / # / ^ /, dovresti usare: 14,20s / # //
— cn1h

1
@ cn1h Penso che questo sostituirà anche altri #nella linea. Dovresti usare ^#invece.
— ankush981,

Grazie per aver spiegato le basi. È bello sapere perché succede qualcosa.
— didierCH

38

Un altro modo che potrebbe essere più semplice per i nuovi arrivati:

 some█
 code
 here

Posiziona il cursore sulla prima riga, ad es. Di

gg

e digitare quanto segue per accedere alla modalità di inserimento e aggiungere il testo:

I / / Space

 // █some
 code
 here

Premere Escper tornare alla modalità di comando e utilizzare il digraph:

j . j .

 // some
 // code
 //█here

jè un comando di movimento per scendere di una riga e .ripete l'ultimo comando di modifica effettuato.


3
Questo è davvero semplice :). Se hai problemi con questo potrebbe essere perché stai digitando una barra (l'altro simbolo con il tuo \) |anziché una maiuscola I. All'inizio ho pensato che fosse un |.
— cokedude,

1
Se faccio "5." cancella 5 caratteri dalla stessa riga. Come faccio a eliminare 5 caratteri contemporaneamente da ogni riga?
— Rahul Prasad,

1
@RahulPrasad Supponiamo che tu abbia 25 righe, quindi a partire dalla prima riga appena registra 5xj in un registro e riproduci quel registro 24 volte, ad esempio: qa5xjq25 @ a Ma sarebbe meglio se lo avessi pubblicato come una vera domanda se non esiste già ...
— ninegrid

26

E ancora un altro modo:

  • Passa all'inizio di una riga
  • entra in modalità Visual Block ( CTRL- v)
  • seleziona le linee che desideri (spostandoti su / giù con j/ ko saltando su una linea con [linea] G)
  • stampa I (che è la capitale i)
  • digitare i caratteri del commento
  • stampa ESC

20

Questo aggiunge #all'inizio di ogni riga:

:%s/^/#/

E le persone smetteranno di lamentarsi della mancanza di script correttamente commentati.


2
Cosa succede se si desidera aggiungere # solo sulle linee selezionate (o poche)
— Rahul Prasad,

15

Se vuoi essere super fantasioso, inseriscilo nel tuo .vimrc:

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

Poi, ogni volta in modalità visiva, si può colpire \cal c omment il blocco e \uad u ncomment esso. Ovviamente, puoi cambiare quei tasti di scelta rapida in qualunque cosa.


È stato votato perché ha introdotto qualcosa di nuovo - vmap!
— ankush981,

11

Ancora un altro modo:

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

/^/è solo un modello fittizio per abbinare ogni riga. normconsente di eseguire i comandi in modalità normale che seguono. I//dice di entrare in modalità inserimento mentre si sposta il cursore all'inizio della riga, quindi inserire il seguente testo (due barre).

:g è spesso utile per fare qualcosa di complesso su più linee, dove potresti voler saltare tra più modalità, eliminare o aggiungere linee, spostare il cursore in giro, eseguire una serie di macro, ecc. E puoi dire che funziona solo su linee che abbinare un modello.


1
in realtà il comando: g non è necessario. Questo farà:: <, '> norma I //
— Cyber ​​Oliveira,

1
E: s è meglio usare anche in questo caso.
— graywh

Questa è la risposta più utile
— Tranquillo

3

Per commentare blocchi di codice, mi piace il Commenter NERD plug-in .

Seleziona del testo:

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

Commento:

,cc

Rimuovere il commento:

,cu

Oppure attiva o disattiva lo stato del commento di una riga o di un blocco:

,c<space>

2

Posso consigliare EnhCommentify plug-in .

per esempio. mettilo nel tuo 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'

puoi quindi commentare / decommentare le righe (selezionate) con ', c'


3
Puoi anche usare Nerd Commenter su vim.org/scripts/script.php?script_id=1218
— Nathan Fellman

1

Contrassegna l'area da commentare come blocco visivo (<C-V )

e fai c#<ESC>p

  1. cappendilo a "#"
  2. rimettilo a posto

Se lo fai spesso, definisci una scorciatoia (esempio \q) nel tuo .vimrc

:vmap \q c#<ESC>p

1

Nel caso in cui la selezione di più righe di qualcuno sia effettivamente un paragrafo, non è necessario selezionare manualmente le righe. vim può farlo per te:

  1. vip: seleziona e segna l'intero paragrafo
  2. shift-i: inserisci il testo all'inizio della riga
  3. escape: esce dalla modalità di inserimento / entra nella modalità normale [inizio riga ancora selezionato]
  4. escape: deseleziona gli inizi di linea

0

Per inserire "ABC" all'inizio di ogni riga:

1) Vai in modalità comando

2):% norma I ABC


Ciò aggiunge il testo a sinistra del primo carattere non spaziale nella riga.
— Kingsley,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.