vim - imposta il rientro automatico per riempire lo spazio iniziale con spazio o tabstop

StackOverflow https://stackoverflow.com/questions/5878009

  •  28-10-2019
  •  | 
  •  

Domanda

Sembra che se abilitiamo 'ai', vim riempirà lo spazio iniziale con tabstop. Posso riempirlo con solo spazio con "et".Non mi piace un file C mischiato con spazio e tabstop.

Il mio vimrc:

set ts=4 et
set ai
set hlsearch
syntax on
filetype plugin indent on
autocmd FileType make setlocal noexpandtab

Tuttavia, in alcune condizioni ho bisogno di inserire tabstop quando premo il "TAB" sulla tastiera, ad esempio, nel makefile e in alcuni altri. Il comando "autocmd FileType" non va bene: non posso aggiungere tutti i tipi di file in vimrc.

Quello che voglio è semplice :

  1. rientro automatico per riempire l'area iniziale spazio;
  2. quando premi "TAB" sulla tastiera, tabstop input, non spazio (quindi niente "et")

Come si fa?

È stato utile?

Soluzione

inoremap <expr> <tab> ((getline('.')[:col('.')-2]=~'\S')?("\<C-v>\t"):(repeat(' ', &ts-((virtcol('.')-1)%&ts))))

Fa lo stesso della risposta di @Lynch se la leggo correttamente.

Puoi anche usare <C-v><Tab>: questo inserirà <Tab> senza invocare alcuna mappatura e ignora expandtab a meno che tu non abbia rimappato <C-v> o <C-v><Tab> per qualche motivo.

Se vuoi semplicemente inserire una tabulazione, fai

inoremap <Tab> <C-v><Tab>

Ignorerà l'impostazione expandtab.

Altri suggerimenti

L'ho fatto utilizzando una funzione. L'ho provato, ma forse in qualche caso particolare dovrai correggere alcuni bug. Prova ad aggiungerlo al tuo vimrc:

set et

function! Inserttab()
    let insert = ""
    let line = getline('.')
    let pos = getpos('.')[2]
    let before = ""
    let after = line
    if pos != 1
        let before = line[ 0: pos - 1]  
        let after = line[pos : strlen(line) ]
    endif
    if pos != 1 && substitute(before, "[ \t]", "", "g") != "" 
         let insert = "\t"
    else
         let insert = "    "
    endif
    let line = before . insert . after 
    call setline('.', line)
    call cursor(line('.'), strlen(before . insert))
endfunction

inoremap <tab> <esc>:call Inserttab()<CR>a

Fondamentalmente rimappa la tua chiave in modalità visuale alla funzione Inserttab (). Nota anche che se cambi ts con qualcosa di diverso da 4, produrrà comunque 4 spazi invece di due perché il valore è hardcoded.

Inoltre non ho molta familiarità con gli script vim, ma penso che tutte le variabili utilizzate saranno globali, il che è una cosa negativa.

Ho dimenticato di dire che per "vedere" gli spazi bianchi puoi usare set list. Lo disabiliti con set nolist. Anche in modalità normale puoi usare ga per vedere le informazioni sul carattere su cui si trova il tuo cursore.

Modifica Mi rendo conto che potresti voler inserire una tabulazione all'inizio della riga. Il mio script inserisce lo spazio all'inizio e la scheda in qualsiasi altro punto.

Se vuoi davvero una scheda ogni volta che premi il tasto Tab, puoi semplicemente usare questo:

set et

function! Inserttab()
    let insert = ""
    let line = getline('.')
    let pos = getpos('.')[2]
    let before = ""
    let after = line
    if pos != 1
        let before = line[ 0: pos - 1]  
        let after = line[pos : strlen(line) ]
    endif
    let insert = "\t"
    let line = before . insert . after 
    call setline('.', line)
    call cursor(line('.'), strlen(before . insert))
endfunction

inoremap <tab> <esc>:call Inserttab()<CR>a

Ma non vedo il punto, con questa versione non sarai mai in grado di indentare manualmente dalla modalità di inserimento.

Un modo per farlo è

  1. : imposta sw= 4 (o quello che vuoi)
  2. : imposta ts= 46 (o un numero elevato)

Quindi il rientro automatico non inserirà tabulazioni a meno che tu non raggiunga 46 spazi, nel qual caso puoi inserire un numero più alto.

Trascina solo su questo se qualcun altro sta usando le schede, quindi devi reimpostare ts per accettare il file che stai modificando.D'altra parte, renderà le schede immediatamente ovvie, il che può anche essere desiderabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top