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.