Quali sono gli angoli bui di Vim di cui tua madre non ti ha mai parlato? [chiuso]


799

Ci sono molte domande in cui le persone parlano di trucchi comuni, in particolare " suggerimenti e trucchi per Vim + ctags ".

Tuttavia, non mi riferisco alle scorciatoie comunemente usate che qualcuno di nuovo su Vim troverebbe interessante. Sto parlando di un utente Unix esperto (che sia uno sviluppatore, un amministratore, entrambi, ecc.), Che pensa di sapere qualcosa che il 99% di noi non ha mai sentito o sognato. Qualcosa che non solo semplifica il loro lavoro, ma è anche COOL e hacker . Dopotutto, Vim risiede nel sistema operativo più ricco di angoli bui del mondo, quindi dovrebbe avere complessità che solo pochi privilegiati conoscono e vogliono condividere con noi.


10
: Finestra
Divisione

2
Questa domanda sembra essere piuttosto costruttiva - guardando il numero di voti ..., votato per riaprire - forse arriva una risposta ancora più interessante - che può essere votata se utile - dando quindi più valore a SOF. Ordinare le risposte per voto Ho imparato un sacco di cose interessanti in soli 5 minuti ... cose davvero preziose qui, perché chiudere qualcosa di così prezioso? In che modo questo non è costruttivo?
jhegedus,

7
Ridicolo che questa domanda sia chiusa. Parlare di legalismo.
Lepidopterist,

2
Penso che questa domanda sia molto costruttiva ma, più appropriata a Quora.
Diogo Melo,

2
Perché ci sono 2 (a partire da ora) voti per eliminare questa domanda? Che bene potrebbe fare?
Akavall

Risposte:


782

Potrebbe non essere uno che il 99% degli utenti di Vim non conosce, ma è qualcosa che uso quotidianamente e che qualsiasi poweruser Linux + Vim deve conoscere.

Comando di base, ma estremamente utile.

:w !sudo tee %

Mi dimentico spesso di sudo prima di modificare un file su cui non ho i permessi di scrittura. Quando vengo per salvare quel file e ottengo un errore di autorizzazione, emetto semplicemente quel comando vim per salvare il file senza la necessità di salvarlo in un file temporaneo e quindi copiarlo di nuovo.

Ovviamente devi essere su un sistema con sudo installato e avere i diritti sudo.


116
Probabilmente, è anche meglio che eseguire vim come root! Upvoted!
Arafangion,

27
Per un noob, cosa fa esattamente Tee? Qualcuno dispiacerebbe analizzare questo comando per me?
AndyL

41
cmap w !! w! sudo tee%
jm666

58
Non dovresti mai correre sudo vim. Invece dovresti esportare EDITORcome vim ed eseguire sudoedit.
Gerardo Marset,

8
@maximus: vim sostituisce% con il nome del buffer / file corrente.
migu,

617

Qualcosa che ho scoperto di recente che ho pensato fosse molto bello:

:earlier 15m

Riporta il documento a com'era 15 minuti fa. Può accettare vari argomenti per il tempo che si desidera ripristinare e dipende dai non-livelli. Può essere invertito con il comando opposto:later


6
@skinp: se annulli e apporti ulteriori modifiche dallo stato annullato, perdi la cronologia delle ripetizioni. Ciò consente di tornare a uno stato che non è più nello stack di annullamento.
effimero

39
Molto utile è anche g + e g- per andare avanti e indietro nel tempo. Questo è molto più potente di uno stack di annullamento / ripetizione poiché non perdi la cronologia quando fai qualcosa dopo un annullamento.
Etienne PIERRE,

9
Non si perde la cronologia delle ripetizioni se si effettua una modifica dopo un annullamento. Semplicemente non è facilmente accessibile. Ci sono plugin per aiutarti a visualizzarlo, come Gundo.vim
Ehtesh Choudhury,

559
Wow, quindi ora posso solo fare :later 8he ho finito per oggi? : P
Igor Popov,

7
Il tuo comando presuppone che uno trascorrerà almeno 15 minuti in vim !
e2-e4,

411

:! [command] esegue un comando esterno mentre sei in Vim.

Ma aggiungi un punto dopo i due punti :.! [command]e scaricherà l'output del comando nella finestra corrente. Quello è: . !

Per esempio:

:.! ls

Lo uso molto per cose come l'aggiunta della data corrente in un documento che sto scrivendo:

:.! date

74
Questo è abbastanza simile a: r! L'unica differenza per quanto posso dire è che: r! apre una nuova linea,:.! sovrascrive la riga corrente.
saffsd,

6
Un'alternativa a :.!dateè scrivere "data" su una riga ed eseguirla !$sh(in alternativa avere il comando seguito da una riga vuota ed eseguire !jsh). Questo collegherà la linea alla shell "sh" e sostituirà l'output del comando.
hlovdal

43
:.!è in realtà un caso speciale di :{range}!, che filtra un intervallo di linee (la linea corrente quando l'intervallo è .) attraverso un comando e sostituisce quelle linee con l'output. Trovo :%!utile per filtrare interi buffer.
Nefrubyr,

2
@sundar: Perché passare una linea a sed, quando è possibile utilizzare i comandi ed/ incorporati simili ex? Prova a correre :.s/old/new/g;-)
jabirali,

4
E nota anche che '!' è come 'y', 'd', 'c' ecc. cioè puoi fare: !!, numero !!,! motion (es.! Gshell_command <cr> sostituisci dalla riga corrente alla fine del file ('G') con output di shell_command).
aqn

312

Non esattamente oscuro, ma ci sono diversi comandi "elimina in" che sono estremamente utili, come ..

  • diw per eliminare la parola corrente
  • di( per eliminare all'interno delle parentesi correnti
  • di" per eliminare il testo tra virgolette

Altri sono disponibili su :help text-objects


8
dab "elimina parentesi arounb", daB per parentesi graffe attorno, t per tag di tipo xml, combinazioni con comandi normali sono come previsto cib / yaB / dit / iva ecc
sjh

15
@Masi: yi (va (p cancella solo le parentesi quadre
Don Reba

42
Questo è forse il motivo principale per cui sono rimasto con Vim. Questo e i suoi equivalenti comandi di "modifica": ciw, ci (, ci ", così come dt <spazio> e ct <spazio>
thomasrutter,

4
@thomasrutter: perché non dW / cW invece di dt <spazio>?

9
@Masi: con il plugin surround: ds (.

237

de Elimina tutto fino alla fine della parola premendo. al desiderio del tuo cuore.

ci (xyz [Esc] - Questa è strana. Qui, 'i' non significa modalità di inserimento. Invece significa tra parentesi. Quindi questa sequenza taglia il testo tra parentesi in cui ti trovi e lo sostituisce con "xyz". Funziona anche all'interno di parentesi quadre e di figure - basta fare ci [o ci {corrispondentemente. Naturalmente, puoi fare di (se vuoi solo cancellare tutto il testo senza digitare nulla. Puoi anche fare ainvece che ise desidera eliminare anche le parentesi e non solo il testo al loro interno.

ci " - taglia il testo tra virgolette correnti

ciw : taglia la parola corrente. Funziona esattamente come il precedente, tranne per il fatto che (è sostituito da w.

C - tagliare il resto della linea e passare alla modalità di inserimento.

ZZ - salva e chiudi il file corrente (MODO più veloce di Ctrl-F4 per chiudere la scheda corrente!)

ddp - sposta la riga corrente di una riga verso il basso

xp - sposta il personaggio corrente di una posizione verso destra

U - maiuscolo, quindi in viwUmaiuscolo

~ - cambia maiuscole e minuscole, quindi viw~invertirà l'involucro dell'intera parola

Ctrl + u / Ctrl + d scorre la pagina a metà schermo verso l'alto o verso il basso. Questo sembra essere più utile del solito paging a schermo intero in quanto semplifica la visualizzazione delle relazioni tra le due schermate. Per coloro che vogliono ancora scorrere l'intero schermo alla volta c'è Ctrl + f per Avanti e Ctrl + b per Indietro. Ctrl + Y e Ctrl + E scorrere verso il basso o verso l'alto di una riga alla volta.

Il comando pazzo ma molto utile è zz : scorre lo schermo per far apparire questa linea nel mezzo. Questo è eccellente per mettere il pezzo di codice su cui stai lavorando al centro della tua attenzione. I comandi di pari livello - zt e zb - rendono questa riga quella superiore o inferiore della schermata che non è altrettanto utile.

% trova e salta alla parentesi corrispondente.

de - elimina dal cursore alla fine della parola (puoi anche fare dEper cancellare fino allo spazio successivo)

bde - cancella la parola corrente, dal delimitatore da sinistra a destra

df [spazio] - elimina fino allo spazio successivo incluso

dt. - elimina fino al punto successivo

dd - elimina l'intera riga

ye (o yE) - strappa il testo da qui alla fine della parola

ce - taglia la fine della parola

ciao - copia la parola corrente (mi chiedo cosa faccia "ciao"!)

yy - copia la riga corrente

cc - taglia la linea corrente, puoi anche fare Sinvece. C'è anche un cappuccio inferiore sche taglia il carattere attuale e passa alla modalità di inserimento.

viwy o viwc . Yank o cambia la parola corrente. Premi wpiù volte per continuare a selezionare ogni parola successiva, usa bper spostarti indietro

vi { - seleziona tutto il testo tra parentesi. va {- seleziona tutto il testo inclusi {} s

vi (p - evidenzia tutto all'interno di () se lo sostituisce con il testo incollato

be sposta il cursore parola per parola, in modo simile a come fanno normalmente Ctrl + Frecce . La definizione di parola è tuttavia leggermente diversa, poiché diversi delimitatori consecutivi vengono trattati come una parola. Se inizi nel mezzo di una parola, premendo b ti porterà sempre all'inizio della parola corrente e ogni b consecutiva salterà all'inizio della parola successiva. Allo stesso modo, e facile da ricordare, eporta il cursore alla fine della parola corrente e di ogni parola successiva.

simile a b/ e, maiuscolo Be Esposta il cursore parola per parola usando solo gli spazi bianchi come delimitatori.

maiuscola D (fai un respiro profondo) Elimina il resto della linea a destra del cursore, lo stesso di Maiusc + Fine / Canc negli editor normali (nota 2 tasti premuti - Maiusc + D - invece di 3)


15
zt è abbastanza utile se lo si utilizza all'inizio di una funzione o di una definizione di classe.
Nick Lewis,

9
vitye vitcpuò essere abbreviato in yite citrispettivamente.
Nathan Fellman,

33
Tutto ciò che chiami "taglia" è "cambia". es: C è cambio fino alla fine della linea. L'equivalente di "cut" di Vim è "delete", fatto con d / D. La principale differenza tra change ed delete è che delete ti lascia in modalità normale ma change ti mette in una sorta di modalità insert (anche se sei ancora nel comando change che è utile poiché l'intera modifica può essere ripetuta con .).
Laurence Gonsalves,

11
Ho pensato che fosse per un elenco di cose che non molte persone sanno. yy è molto comune, avrei pensato.
Almo,

19
byenon funziona quando sei nel primo carattere della parola. yiwlo fa sempre.
Andrea Francia,

204

Uno che raramente trovo nella maggior parte dei tutorial di Vim, ma è INCREDIBILMENTE utile (almeno per me), è il

g; and g,

per spostarsi (avanti, indietro) attraverso l'elenco delle modifiche.

Lascia che ti mostri come lo uso. A volte ho bisogno di copiare e incollare un pezzo di codice o stringa, dire un codice esadecimale in un file CSS, quindi cerco, salto (non importa dove si trova la corrispondenza), copialo e poi salto indietro (g;) dove Stavo modificando il codice per incollarlo finalmente. Non è necessario creare segni. Più semplice.

Solo i miei 2 centesimi.


29
allo stesso modo, '.andrà all'ultima riga modificata, e `.andrà all'ultima posizione modificata
aehlke,

8
Ctrl-O e Ctrl-I (scheda) funzioneranno in modo simile, ma non è lo stesso. Si spostano avanti e indietro nella "jump list", che è possibile visualizzare facendo: salti o: ju Per ulteriori informazioni fare un: aiuto jumplist
Kimball Robinson

17
Puoi elencare l'elenco delle modifiche facendo: modifiche
Kimball Robinson

Hot dang è utile. Uso sempre <C-o>/ <C-i>per questo - o segnando il mio posto.
Wayne Werner,

187
:%!xxd

Trasforma Vim in un editor esadecimale.

:%!xxd -r

Ripristina.

Avviso: se non si modifica con binario (-b), è possibile che il file venga danneggiato. - Josh Lee nei commenti.


9
E come ripristinarlo?
Christian,

40
:! xxd -r // Per tornare indietro da HEX
Naga Kiran

21
In realtà penso che :%!xxd -rdebba ripristinarlo
Andreas Grech,

@JoshLee: se si sta attenti a non attraversare le nuove linee, è sicuro non usare l'opzione -b? Lo chiedo perché a volte voglio fare una modifica esadecimale, ma non voglio chiudere e riaprire il file per farlo.
dotancohen,

4
@dotancohen: se non si desidera chiudere / riaprire il file, è possibile: impostare binario
Bambu,


119

A volte un'impostazione nel tuo .vimrc viene sovrascritta da un plugin o da un autocommand. Per eseguire il debug di un trucco utile è utilizzare il comando: verbose insieme a: set. Ad esempio, per capire dove è stato impostato / disinserito il cindent:

:verbose set cindent?

Questo produrrà qualcosa di simile:

cindent
    Last set from /usr/share/vim/vim71/indent/c.vim

Funziona anche con mappe e punti salienti. (Grazie joeytwiddle per averlo segnalato.) Ad esempio:

:verbose nmap U
n  U             <C-R>
        Last set from ~/.vimrc

:verbose highlight Normal
Normal         xxx guifg=#dddddd guibg=#111111 font=Inconsolata Medium 14
        Last set from ~/src/vim-holodark/colors/holodark.vim

8
Consiglio eccellente - esattamente quello che stavo cercando oggi.
Artem Russakovskii,

Ottimo consiglio amico! Come fai a conoscere queste cose geek?
Rafid,

1
:verbosepuò essere utilizzato anche prima nmap lo highlight Normalper scoprire dove sono stati definiti l'ultima volta la lkeymap o l' Normalevidenziazione. Molto utile per il debug!
joeytwiddle,

@joeytwiddle Grazie! Ho aggiunto queste informazioni alla risposta.
Laurence Gonsalves,

Quando inizi a creare mappature personalizzate, questo ti salverà il culo così tante volte, probabilmente uno dei più utili qui (IMO)!
SidOfc,


98

Non sono sicuro se questo conta come un angolo oscuro, ma l'ho appena imparato ...

:g/match/y A

yank (copia) tutte le righe contenenti "match" nel "a/ @aregistro. (La maiuscola in quanto Arende vim append yankings invece di sostituire il precedente contenuto del registro.) L'ho usato molto recentemente durante la creazione di fogli di stile di Internet Explorer.


conta, conta come non l'ho mai visto :)

Ben fatto. Non ne ho mai sentito parlare ... Potrebbe essere utile: P
skinp

5
Puoi usare: g! per trovare linee che non corrispondono a un modello es: g! / set / normal dd (elimina tutte le righe che non contengono set)
tsukimi,

3
A volte è meglio fare ciò che Tsukimi ha detto e filtrare solo le linee che non corrispondono al tuo modello. Una versione abbreviata di quel comando però: :v/PATTERN/dSpiegazione: :vè un'abbreviazione di :g!e il :gcomando applica qualsiasi comando ex alle linee. :y[ank]funziona e così fa :normal, ma qui la cosa più naturale da fare è solo :d[elete].
Pandubear,

Puoi anche farlo :g/match/normal "Ayy: la normalparola chiave ti consente di dirgli di eseguire i comandi in modalità normale (che probabilmente hai più familiarità).
Kimball Robinson,

93

Vuoi dare un'occhiata alla tua: cronologia dei comandi?

q:

Quindi sfoglia, modifica e infine per eseguire il comando.

Hai mai apportato modifiche simili a due file e passare avanti e indietro tra di loro? (Dire, file sorgente e intestazione?)

:set hidden
:map <TAB> :e#<CR>

Quindi scheda avanti e indietro tra quei file.


131
Ho colpito q:per caso tutto il tempo ...
Josh Lee,

11
In alternativa, dall'ex editor (:), puoi fare CTRL-f per far apparire la finestra della cronologia dei comandi.
Jason Down,

6
@jleedev anche a me. Quasi odio questo comando, solo perché lo uso accidentalmente troppo.
bradlis7,

9
q / e q? può essere usato per fare una cosa simile per i tuoi schemi di ricerca.
bpw1621,

5
Se si preme <Cf> dopo: o / (o ogni volta che si è in modalità comando) si aprirà lo stesso menu cronologico. Quindi puoi rimappare q: se lo colpisci accidentalmente molto e accedi ancora a questa fantastica modalità.
idbrii,

82

Vim aprirà un URL, ad esempio

vim http://stackoverflow.com/

Bello quando è necessario estrarre l'origine di una pagina come riferimento.


2
Per me non ha aperto la fonte; invece apparentemente ha usato gli elink per scaricare la pagina renderizzata in un buffer, quindi l'ha aperta.
Ivan Vučica,

c'è un errore quando si esegue questo comando
Dzung Nguyen il

5
Funziona meglio con una barra alla fine. Trucco pulito!
Thomas,

@Vdt: sarebbe utile se hai pubblicato il tuo errore. Se è questo: " errore (netrw) né il comando wget né il comando fetch sono disponibili" è ovviamente necessario rendere disponibile uno di quegli strumenti dalla variabile d'ambiente PATH.
Isaac Nequittepas,

Trovo questo particolarmente utile quando le persone inviano collegamenti a un servizio incolla e si sono dimenticati di selezionare un'evidenziazione della sintassi, in genere devo solo aprire il collegamento in vim dopo aver aggiunto "& raw".
Dettorer

68

Le macro possono chiamare altre macro e possono anche chiamare se stesse.

per esempio:

qq0dwj@qq@q

... eliminerà la prima parola da ogni riga fino alla fine del file.

Questo è un esempio abbastanza semplice ma dimostra una funzionalità molto potente di vim


2
Non sapevo che le macro potessero ripetersi. Freddo. Nota: qx avvia la registrazione nel registro x (usa qq per il registro q). 0 si sposta all'inizio della riga. dw cancella una parola. j si sposta lungo una linea. @q eseguirà nuovamente la macro (definendo un ciclo). Ma hai dimenticato di terminare la registrazione con un "q" finale, quindi esegui la macro digitando @q.
Kimball Robinson,

2
Penso che sia intenzionale, come una macro nidificata e ricorsiva.
Yktula,

7
qqqqqifuu<Esc>h@qq@q
Gerardo Marset,

6
Un altro modo per ottenere ciò è quello di registrare una macro nel registro a che esegue una trasformazione in una singola riga, quindi evidenziare in linea un gruppo di righe con V e digitare :normal! @aper applicare la macro a ogni riga della selezione.
Nathan Long,

Ho trovato questo post gocciolante macro VIM ricorsive. Non riuscivo a trovare alcun modo per fermare la macro se non uccidere il processo VIM.
dotancohen

55

Supponendo che tu abbia il supporto Perl e / o Ruby compilato :rubydoe :perldoeseguirai una linea di riferimento Ruby o Perl su ogni riga in un intervallo (per impostazione predefinita all'intero buffer), con $_vincolo al testo della riga corrente (meno la nuova riga). La manipolazione $_cambierà il testo di quella riga.

Puoi usarlo per fare alcune cose che sono facili da fare in un linguaggio di scripting ma non così ovvio usando i builtin di Vim. Ad esempio per invertire l'ordine delle parole in una riga:

:perldo $_ = join ' ', reverse split

Per inserire una stringa casuale di 8 caratteri (AZ) alla fine di ogni riga:

:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[rand 26]}.join

Sei limitato ad agire su una riga alla volta e non puoi aggiungere nuove righe.


cosa succede se voglio solo che perldo funzioni su una linea specificata? o alcune righe selezionate?
Sujoy,

5
Puoi assegnargli un intervallo come qualsiasi altro comando. Ad esempio: 1,5perldo funzionerà solo sulle linee 1-5.
Brian Carper,

Potresti fare $ _ + = '\ nNEWLINE !!!' ottenere una nuova riga dopo quella attuale?
Greg

Purtroppo no, aggiunge solo un carattere di controllo funky alla fine della linea. Tuttavia, è possibile utilizzare una ricerca / sostituzione di Vim per modificare tutti quei caratteri di controllo in vere e proprie righe.
Brian Carper,

3
Allo stesso modo, pydoe py3dolavora per Python se hai compilato il supporto richiesto.
Derecho

54

^ O e ^ I

Vai alla posizione più vecchia / più recente. Quando ci si sposta attraverso il file (tramite la ricerca, lo spostamento di comandi, ecc.) Vim ricordare questi "salti", in modo da poter ripetere questi salti all'indietro (^ O - O per vecchi) e avanti (^ I - proprio accanto a I sulla tastiera ). Lo trovo molto utile quando si scrive un codice e si eseguono molte ricerche.

gi

Vai alla posizione in cui la modalità Inserisci è stata interrotta per ultima. Mi trovo spesso a modificare e poi a cercare qualcosa. Per tornare al luogo di modifica premere gi.

gf

posiziona il cursore sul nome del file (es. includi il file header), premi gf e il file viene aperto

gF

simile a gf ma riconosce il formato "[nome file]: [numero riga]". Premere gF per aprire [nome file] e impostare il cursore su [numero riga].

^ P e ^ N

Completamento automatico del testo durante la modifica (^ P - corrispondenza precedente e ^ N corrispondenza successiva)

^ X ^ L

Durante la modifica si completa sulla stessa riga (utile per la programmazione). Scrivi il codice e poi ricordi che hai lo stesso codice da qualche parte nel file. Basta premere ^ X ^ L e la riga completa è stata completata

^ X ^ F

Nomi file completi. Scrivi "/ etc / pass" Hmm. Hai dimenticato il nome del file. Basta premere ^ X ^ F e il nome del file è completato

^ Z o: sh

Sposta temporaneamente nella shell. Se hai bisogno di un rapido bashing:

  • premi ^ Z (per mettere vi in ​​background) per tornare alla shell originale e premi fg per tornare a vim back
  • premere: sh per passare alla shell secondaria e premere ^ D / exit per tornare a vi indietro

Con il ^X^Fmio pet peeve è che i nomi dei file includono =segni, facendolo fare cose marce in molte occasioni (file ini, makefile ecc.). Uso se isfname-==per porre fine a quel fastidio
sehe

3
+1 il completamento automatico incorporato è semplicemente seduto lì in attesa di essere scoperto.
joeytwiddle,

48
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

:for i in range(1,255) | .put='10.0.0.'.i | endfor

2
Non vedo a cosa serva (oltre a sembrare una risposta scherzosa). Qualcun altro può illuminarmi?
Ryan Edwards,

2
apri vim e poi fai ": for i in range (1.255) | .put = '10 .0.0. '. i | endfor"
codygman

2
@RyanEdwards compilando / etc / hosts forse
Ruslan,

26
Questa è una risposta fantastica. Non il bit sulla creazione degli indirizzi IP, ma il bit che implica che VIM può usare per i loop nei comandi .
dotancohen,

4
Senza modalità ex:i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
BlackCap

47

Questo è un bel trucco per riaprire il file corrente con una codifica diversa:

:e ++enc=cp1250 %:p

Utile quando devi lavorare con codifiche legacy. Le codifiche supportate sono elencate in una tabella sotto encoding-values(vedi help encoding-values). Una cosa simile funziona anche per ++ff, in modo che tu possa riaprire il file con Windows / Unix se termina la riga per la prima volta (vedi help ff).


Non ho mai dovuto usare questo genere di cose, ma sicuramente aggiungeremo al mio arsenale di trucchi ...

ottimo consiglio, grazie. Per i punti bonus, aggiungi un elenco di codifiche valide comuni.
Adriano Varoli Piazza

2
L'ho usato oggi, ma penso di non aver bisogno di specificare "%: p"; basta aprire il file e: e ++ enc = cp1250 è stato sufficiente. I
Ivan Vučica,

avrebbe: set encoding = cp1250 avere lo stesso effetto?
Laz

1
`: e + b% 'è ugualmente utile per la riapertura in modalità binaria (nessun munging di newline)
intuito

47

Digitando == correggerai il rientro della riga corrente in base alla riga sopra.

In realtà, puoi fare uno = segno seguito da qualsiasi comando di movimento. = {movimento}

Ad esempio, è possibile utilizzare il movimento% che si sposta tra parentesi graffe corrispondenti. Posiziona il cursore su {nel seguente codice:

if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}

E premi =% per ottenere immediatamente questo:

if (thisA == that) {
    //not indented
    if (some == other) {
        x = y;
    }
}

In alternativa, potresti fare = a { all'interno del blocco di codice, anziché posizionarti direttamente sul carattere {.


Hm, non sapevo questo riguardo al rientro.
Ehtesh Choudhury,

Non c'è bisogno, di solito, di essere esattamente sulle parentesi graffe. Pensato frequentemente avrei solo =}o vaBaB=perché è meno dipendente. Inoltre, v}}:!astyle -bjabbina meglio il mio stile di codice, ma posso ripristinarlo nel tuo stile con un semplice%!astyle -aj
vedi

7
gg=Gè abbastanza pulito quando si incolla qualcosa.
kyrias,

Correlati: rientro del codice con rientro grave a Vim SE
Kenorb,

@kyrias Oh, l'ho fatto così ggVG=.
Braden Best

42
imap jj <esc>

7
come scriverai allora jj? : P
hasen,

6
Quanto spesso digiti jj? Almeno in inglese?
ojblass,

50
Invece ho rimappato capslock per esc, poiché è una chiave altrimenti inutile. La mia mappatura era estesa al sistema operativo, quindi ha l'ulteriore vantaggio di non doversi preoccupare di colpirlo accidentalmente. L'unico inconveniente è IL SUO PIÙ DURO DI UCCIDERE ALLE PERSONE. :)
Alex,

7
@Alex: sicuramente, capslock è la morte. "Aspetta, wtf? oh, quello era ZZ? .... merda."
intuito il

5
@ojblass: non sono sicuro di quante persone abbiano mai corretto il codice matlab in Vim, ma iie jjsono comunemente usati per le variabili contatore, perché ie jsono riservati per numeri complessi.
brianmearns,

37

Vediamo alcuni piccoli editor IDE che eseguono la trasposizione delle colonne.

:%s/\(.*\)^I\(.*\)/\2^I\1/

Spiegazione

\(ed \)è come ricordare le cose in regex-land. E \1, \2ecc. È come recuperare le cose ricordate.

>>> \(.*\)^I\(.*\)

Ricorda tutto seguito da ^I(scheda) seguito da tutto.

>>> \2^I\1

Sostituisci le cose sopra con "2a roba che hai ricordato" seguita da "1a roba che hai ricordato".


4
Cambia una coppia di colonne separate da tabulazione (separatore arbitrario, è tutto regex) tra loro.
caos,

39
Questo è solo un regex; molti IDE hanno regex ricerca e sostituzione.
rlbond

7
@rlbond - Dipende da quanto è buono il motore regex nell'IDE. Le regex di Vim sono piuttosto potenti; altri .. non tanto a volte.
Romandia,

3
Il * sarà avido, quindi questa regex presuppone che tu abbia solo due colonne. Se vuoi che non sia goloso usa {-} invece di * (vedi: help non avido per maggiori informazioni sul moltiplicatore {})
Kimball Robinson

4
Questo è in realtà una regex piuttosto semplice, sta solo sfuggendo alle parentesi di gruppo che lo rende complicato.
MK12,

30

Non esattamente un oscuro segreto, ma mi piace inserire la seguente mappatura nel mio file .vimrc, quindi posso premere "-" (meno) in qualsiasi momento per aprire Esplora file per mostrare i file adiacenti a quello che ho appena modificato . Nel file explorer, posso premere un altro "-" per spostarsi in alto di una directory, fornendo una navigazione senza soluzione di continuità di strutture di directory complesse (come quelle utilizzate dai framework MVC al giorno d'oggi):

map - :Explore<cr>

Questi possono anche essere utili per qualcuno. Mi piace scorrere lo schermo e far avanzare il cursore contemporaneamente:

map <c-j> j<c-e>
map <c-k> k<c-y>

Navigazione a schede - Adoro le schede e devo spostarmi facilmente tra di loro:

map <c-l> :tabnext<enter>
map <c-h> :tabprevious<enter>

Solo su Mac OS X: navigazione a schede simile a Safari:

map <S-D-Right> :tabnext<cr>
map <S-D-Left> :tabprevious<cr>

Puoi anche sfogliare i file all'interno di Vim stesso, usando: Explore
Roman Plášil,

Ciao romano, questo è esattamente ciò che fa questa mappatura, ma la assegna a un "tasto di scelta rapida". :)
KKovacs

27

Mi piace usare "sudo bash" e il mio amministratore di sistema odia questo. Ha bloccato 'sudo' in modo che potesse essere usato solo con una manciata di comandi (ls, chmod, chown, vi, ecc.), Ma sono stato in grado di usare vim per ottenere comunque una shell root:

bash$ sudo vi +'silent !bash' +q
Password: ******
root#

9
FWIW, sudoedit (o sudo -e) modifica i file con privilegi ma esegue l'editor come utente normale.
RJHunter,

12
sì ... anche io ti oderei;) dovresti solo avere una shell root MOLTO RARAMENTE, a meno che tu non abbia già l'abitudine di eseguire troppi comandi come root, il che significa che i tuoi permessi sono tutti sbagliati.
Siamo tutti Monica il

5
Perché il tuo amministratore di sistema ti dà persino il root? : D
d33tah,

26

Spesso mi piace cambiare le directory correnti durante la modifica, quindi devo specificare meno percorsi.

cd %:h

Cosa fa questo? E funziona con autchdir?
Leonard

2
Suppongo che sovrascriverà temporaneamente autochdir (fino a quando non cambi di nuovo i buffer). Fondamentalmente, cambia la directory nella directory principale del file corrente. Mi dà un po 'più di controllo manuale di Autochdir.
rampion

1
: set autochdir // serve anche la stessa funzionalità e cambia la directory corrente in quella del file nel buffer
Naga Kiran

25

Uso spesso molte finestre quando lavoro su un progetto e talvolta devo ridimensionarle. Ecco cosa uso:

map + <C-W>+
map - <C-W>-

Queste mappature consentono di aumentare e ridurre le dimensioni della finestra corrente. È abbastanza semplice ma è veloce.


16
C'è anche Ctrl-W =, che rende le finestre di uguale larghezza.
Bill Lynch,

2
Non dimenticare che puoi anteporre i numeri per eseguire un'azione più volte in Vim. Quindi per espandere l'attuale altezza della finestra di 8 righe: 8 <CW> +
joeytwiddle

23

Non è una funzione oscura, ma molto utile e fa risparmiare tempo.

Se si desidera salvare una sessione di buffer aperti, schede, marcatori e altre impostazioni, è possibile emettere quanto segue:

mksession session.vim

Puoi aprire la sessione usando:

vim -S session.vim

5
Puoi anche :so session.vimall'interno di VIM.
TankorSmash,

22
:r! <command>

incolla l'output di un comando esterno nel buffer.

Fai un po 'di matematica e ottieni il risultato direttamente nel testo:

:r! echo $((3 + 5 + 8))

Ottieni l'elenco dei file da compilare quando scrivi un Makefile:

:r! ls *.c

Non cercare quel fatto che hai letto su Wikipedia, fallo incollare direttamente nel documento che stai scrivendo:

:r! lynx -dump http://en.wikipedia.org/wiki/Whatever

14
^ R = 3 + 5 + 8 in modalità inserimento ti consente di inserire il valore dell'espressione (3 + 5 + 8) nel testo con un numero minore di tasti.
Sudhanshu,

Come posso ottenere il risultato / output su un buffer diverso da quello attuale?
DC


21

Mappa F5 per ROT13 rapidamente il tuo buffer:

map <F5> ggg?G``

Puoi usarlo come chiave boss :).


14
Non so cosa stai scrivendo ... Ma sicuramente, il mio capo sarebbe più curioso quando mi vedesse scrivere
jumble

o di falsificare i tuoi amici: nmap i ggg?G`` . O il diabolica: nmap i ggg?G``i!
romeovs,

1
@romeovs 2nd one è un loop infinito, usa nnoremap
Amit Gold

19

Ho appena trovato questo oggi tramite NSFAQ :

Commenta blocchi di codice.

Entra in modalità Blockwise Visual premendo CTRL-V.

Segna il blocco che desideri commentare.

Premi I (maiuscola I) e inserisci la stringa di commento all'inizio della riga. (// per C ++)

Premi ESC e tutte le linee selezionate avranno // anteposto alla parte anteriore della linea.


Ho aggiunto # per commentare un blocco di codice in ruby. Come lo annullo.
Neeraj Singh,

3
Puoi semplicemente premere di nuovo ctrl + v, contrassegnare gli // e premere x per "decommentare"
nn

6
Per questo uso NERDCommenter.
ZyX

1
Il codice commentato è probabilmente uno dei peggiori tipi di commento che potresti inserire nel tuo codice. Ci sono usi migliori per il fantastico inserto di blocchi.
Braden Best

1
@Pie perché il codice commentato è un codice morto . Il codice morto non ha uno scopo utile e crea disordine. Si pensa che stai conservando il codice si potrebbe desiderare di riportare più tardi, ma c'è sempre un modo migliore. Puoi usare la tua cronologia degli annullamenti, puoi duplicare il file o puoi usare git, che ha questa funzionalità incorporata ( git checkout). Per quanto riguarda gli usi migliori per l'inserimento di blocchi, non esiste alcun set-in-stone. Lo usi semplicemente ogni volta che hai più righe in cui vuoi inserire la stessa sequenza di caratteri nello stesso posto.
Braden Best,

17

Uso vim per qualsiasi modifica di testo che faccio, quindi spesso uso copia e incolla. Il problema è che vim per impostazione predefinita spesso distorce il testo importato tramite incolla. Il modo per fermarlo è usare

:set paste

prima di incollare i tuoi dati. Ciò impedirà di incasinare.

Tieni presente che dovrai :set nopasteripristinare il rientro automatico. Modi alternativi per incollare il testo preformattato sono i registri degli appunti ( *e+ ) e :r!cat(dovrai terminare il frammento incollato con ^ D).

A volte è anche utile attivare una combinazione di colori ad alto contrasto. Questo può essere fatto con

:color blue

Ho notato che non funziona su tutte le versioni di VIM che uso, ma funziona su quasi tutte.


10
La "distorsione" sta accadendo perché hai abilitato una qualche forma di rientro automatico. L'utilizzo set pasteo la specifica di una chiave per l' pastetoggleopzione è un modo comune per aggirare questo problema, ma lo stesso effetto può essere ottenuto con set mouse=acome allora Vim sa che il flusso di testo che vede è un incolla attivato dal mouse.
Jamessan,

1
Se hai installato gvim puoi spesso (anche se dipende da quali sono le tue opzioni compilate dalla tua distribuzione) usando gli Appunti X direttamente da VIM attraverso il registro *. Ad esempio "*pper incollare dalla X xboard. (Funziona anche da Terminal Vim, è solo che potresti aver bisogno del pacchetto gvim se sono separati)
kyrias,

2
@kyrias per la cronaca, *è il registro PRIMARY("middle-click"). Gli appunti sono+
Braden Best
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.