Come faccio a spostare il rientro di riga su un valore specifico?


11

Molte volte mi imbatto in una situazione in cui una linea non è rientrata correttamente. Ether attraverso un plug-in incolla, bad / non preferito indent, o il più delle volte spazi extra che compensano il valore del rientro. Di solito risolvo questo problema <<o >>la linea alcune volte per risolverlo. Nel caso di spazi extra, farò 100<<quindi un a >>per ogni livello di rientro che voglio effettivamente.

La domanda è, come il |movimento che ti consente di impostare la colonna per numero 10|invia il cursore alla decima colonna. Come posso specificare il livello di rientro?

Un esempio (questo non funziona) con shiftwidth=4 expandtab:

The quick (indent level 0)
••••Brown Fox (indent level 1)
••••••••••Jumped over the lazy dog (indent level 2 with two extra spaces)

In questo caso attualmente devo contare il livello di rientro dell'ultima riga (2) e aggiungerne uno per gli spazi extra, quindi digitare e 3<<quindi contare il livello di rientro di ciò che poi 1>>(o uso autoindente ==comando).

Sto chiedendo qualcosa di simile 1==per forzare il rientro al rientro di livello 1. O in alcuni casi 0==per rimuovere un rientro tutti insieme.

Mi rendo conto che l'esempio sopra fa il rientro automatico su 1 o 0 righe (rispettivamente) e quindi non fa quello che mi piacerebbe, ma spero che possa aiutare a illustrare meglio la domanda.

Risposte:


18

Puoi usare il :leftcomando:

:[range]le[ft] [indent]
Allineare a sinistra le linee in [range]. Imposta il rientro nelle righe su [indent](valore predefinito 0). {non in Vi}

Si noti che :leftimposta il rientro su n spazi e non è a conoscenza di shiftwidtho tabstop, quindi l'utilizzo :left 8utilizzerà 8 spazi.

Se si desidera impostare il livello di rientro, è possibile definire facilmente un comando:

command! -nargs=1 Left execute 'left ' . &sw * <args>

L'uso :Left 2imposterà il rientro su 8 spazi.

Per mappare questo <Leader>=, è possibile utilizzare:

noremap <expr> <Leader>= ':left ' . str2nr(nr2char(getchar())) * &sw . '<CR>'

Non sono sicuro che questo sia il modo migliore, ma è l'unico modo che posso gestire ... \=2indenterà la riga corrente su 8 spazi e 5\=3indenterà le 5 righe successive su 12 spazi.


Un suggerimento correlato che risolve anche il problema è l'impostazione shiftrounddell'opzione. A partire dal:help 'shiftround'

Rientro arrotondato al multiplo di 'shiftwidth'. Si applica a >e < comandi. CTRL-T e CTRL-D in modalità Inserisci sempre arrotondano il rientro a un multiplo di 'shiftwidth'(questo è compatibile con Vi).

Nel tuo esempio, il primo <<si "arrotonderà" a 8 spazi. Quindi il tuo problema (usando 3<<e poi >>) è risolto. E come dice la pagina di aiuto, puoi anche usare <C-d>dalla modalità di inserimento.


Eccezionale! Queste soluzioni funzionano perfettamente.
Sukima,
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.