vim - Stellen Sie den automatischen Einzug so ein, dass der führende Bereich mit Leerzeichen oder Tabulatoren gefüllt wird

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

  •  28-10-2019
  •  | 
  •  

Frage

Wenn wir 'ai' aktivieren, füllt vim anscheinend den führenden Bereich mit Tabstop. Ich kann es mit 'et' nur mit Leerzeichen füllen.Ich mag keine C-Datei, die mit Leerzeichen und Tabstop gemischt ist.

Mein vimrc:

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

In einigen Fällen muss ich jedoch Tabstop eingeben, wenn ich die 'TAB' auf der Tastatur drücke, z. B. in Makefile und einigen anderen. Der Befehl 'autocmd FileType' ist nicht gut: Ich kann nicht jeden Dateityp in vimrc hinzufügen.

Was ich möchte, ist einfach :

  1. Autoindent zum Füllen des führenden Bereichs mit Raum;
  2. Wenn Sie auf der Tastatur 'TAB' drücken, halten Sie die Tabulatortaste gedrückt Eingabe, kein Leerzeichen (also kein 'et')

    Wie geht das?

War es hilfreich?

Lösung

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

Es funktioniert genauso wie die Antwort von @Lynch, wenn ich es richtig gelesen habe.

Sie können auch <C-v><Tab> verwenden: Hiermit wird <Tab> eingefügt, ohne dass Zuordnungen aufgerufen werden, und expandtab wird ignoriert, es sei denn, Sie haben <C-v> oder <C-v><Tab> aus irgendeinem Grund neu zugeordnet.

Wenn Sie nur eine Registerkarte einfügen möchten, tun Sie

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

Die Einstellung "expandtab" wird ignoriert.

Andere Tipps

Ich habe es mit einer Funktion gemacht. Ich habe es getestet, aber vielleicht müssen Sie in einem bestimmten Fall einige Fehler beheben. Versuchen Sie, dies Ihrem vimrc hinzuzufügen:

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

Grundsätzlich ordnet es Ihren Schlüssel im visuellen Modus der Funktion Inserttab () neu zu. Beachten Sie auch, dass beim Ändern von ts für etwas anderes als 4 immer noch 4 statt zwei Leerzeichen ausgegeben werden, da der Wert fest codiert ist.

Ich bin auch nicht sehr vertraut mit Vim-Skripten, aber ich denke, dass alle verwendeten Variablen global sind, was eine schlechte Sache ist.

Ich habe vergessen zu erwähnen, dass Sie set list verwenden können, um Leerzeichen zu "sehen". Sie deaktivieren dies mit set nolist. Auch im normalen Modus können Sie ga verwenden, um Informationen zu dem Zeichen anzuzeigen, auf dem sich Ihr Cursor befindet.

Bearbeiten Mir ist klar, dass Sie möglicherweise am Anfang der Zeile eine Registerkarte einfügen möchten. Mein Skript fügt am Anfang und an anderer Stelle Platz ein.

Wenn Sie wirklich jedes Mal einen Tab möchten, wenn Sie die Tabulatortaste drücken, können Sie einfach Folgendes verwenden:

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

Aber ich verstehe den Punkt nicht, mit dieser Version können Sie niemals manuell aus dem Einfügemodus einrücken.

Eine Möglichkeit ist

  1. : setze sw= 4 (oder was auch immer du willst)
  2. : setze ts= 46 (oder eine große Zahl)

    Dann fügt autoindent keine Tabulatoren ein, es sei denn, Sie erreichen 46 Leerzeichen. In diesem Fall können Sie eine höhere Zahl eingeben.

    Ziehen Sie nur, wenn jemand anderes Registerkarten verwendet, und ziehen Sie ts zurück, um mit der zu bearbeitenden Datei übereinzustimmen.Auf der anderen Seite werden die Registerkarten sofort sichtbar, was ebenfalls wünschenswert sein kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top