vim - Stellen Sie den automatischen Einzug so ein, dass der führende Bereich mit Leerzeichen oder Tabulatoren gefüllt wird
-
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 :
- Autoindent zum Füllen des führenden Bereichs mit Raum;
- Wenn Sie auf der Tastatur 'TAB' drücken, halten Sie die Tabulatortaste gedrückt
Eingabe, kein Leerzeichen (also kein 'et')
Wie geht das?
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
- : setze sw= 4 (oder was auch immer du willst)
- : 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.