Auf dieser Seite
Abenteuer durch meine vimrc (nvimrc)
In diesem Beitrag werde ich Sie auf ein Abenteuer in meiner früheren vimrc und derzeitigen init.vim mitnehmen, die ich über die letzten Jahre durch die Nutzung von vim dann neovim gesammelt habe. Ich werde die Funktion oder den Feature erklären und dann die Konfigurationen oder den Code angeben, der in die Datei vimrc (init.vim) eingefügt werden sollte, um dieses Feature zu aktivieren.
Dies ist möglicherweise nicht immer aktuell, denn ich ändere diese Konfigurationen immer dann, wenn ich Lust dazu habe.
Allgemeine Konfigurationen (neovim)
Der allererste Abschnitt betrifft die allgemeinen Einstellungen, die meiner Meinung nach standardmäßig in vim eingestellt sein sollten, da einige davon bereits in neovim Standard sind, darunter:
- Inkrementelle Suche verwenden: Diese Funktion ermöglicht es vim, das Suchmuster während der Eingabe hervorzuheben.
set incsearch
- Schnelle Terminalverbindung verwenden, diese Funktion verbessert die Sanftheit der Neuzeichnung, wenn mehrere Fenster geöffnet sind.
set ttyfast
- Wenn eine Datei geändert wurde, die außerhalb von vim geändert wurde und innerhalb von vim nicht geändert wurde, automatisch erneut laden.
set autoread
- Das Wild-Menü für die Kommandozeilen-Vervollständigung mit der
TAB-Taste aktivieren.
set wildmenu
set wildmode=longest:list,full
- Alle Übereinstimmungen für das Suchmuster hervorheben.
set hlsearch
- Vim verwendet Verlauf, um Kommandozeilenbefehle zu merken, die ein Benutzer in einer dieser Kommandozeilen eingibt:
:-Befehle- Suchstrings
- Ausdrücke
- Eingabezeilen, die für die Funktion
input()eingegeben wurden. - Debug-Modus-Befehle Ich möchte, dass vim viel (1000) meiner Befehlsgeschichte merkt.
set history=1000
- Vim soll sich nützlicher verhalten (dies ist buchstäblich genau das, was in den vim-Dokumentationen steht). Es ist optional, dies in seiner vimrc aufzunehmen, denn wenn eine vimrc- oder gvimrc-Datei beim Starten von vim gefunden wird, wird diese Option aktiviert.
set nocompatible
- Backspace soll Zeichen löschen wie bei anderen Editoren.
set backspace=2
- Wenn ein Tab-Zeichen durch Drücken der
<TAB>-Taste eingefügt wird, wird mit Backspace das Eingefügte gelöscht, abhängig von anderen Konfigurationsparameternshiftwidth.tabstopundsofttabstop.
set smarttab
- Beim Beginnen einer neuen Zeile die gleiche Einrückung wie in der vorherigen Zeile verwenden. Dies ist eine sehr nützliche Funktion beim Programmieren, besonders in einer einrückungssensitiven Sprache wie Python oder YAML.
set autoindent
- Live-Ersetzung (nur neovim), beim Ersetzen eines Musters.
set inccommand=nosplit
Allgemeine Konfigurationen (vim)
Eine weitere Reihe allgemeiner Konfigurationen, die nicht standardmäßig in neovim enthalten sind. Ich finde sie immer noch sehr nützlich.
- Ich benutze gerne die Maus beim Editieren nicht, aktiviere sie aber trotzdem.
set mouse=a
- (Teilweisen) Befehl in der letzten Zeile des Bildschirms anzeigen. Die Dokumentation erklärt dies sehr gut, also habe ich es von dort kopiert:
Im Visuellen Modus wird die Größe des ausgewählten Bereichs angezeigt:
- Beim Auswählen von Zeichen innerhalb einer Zeile die Anzahl der Zeichen. Wenn die Anzahl der Bytes unterschiedlich ist, wird auch “2-6” angezeigt, was zwei Zeichen und sechs Bytes bedeutet.
- Beim Auswählen von mehr als einer Zeile die Anzahl der Zeilen.
- Beim Auswählen eines Blocks die Größe in Bildschirmzeichen:
{Zeilen}x{Spalten}.
set showcmd
- Die Übereinstimmung einer Klammer beim Einfügen anzeigen, dies sieht so aus, als ob der Cursor für einen kurzen Moment zur passenden Klammer springt, um sie hervorzuheben.
matchtimesteuert diesen Zeitraum.
set showmatch
set matchtime=2
- Groß-/Kleinschreibung bei der Suche ignorieren.
set ignorecase
- Wenn das Suchmuster Großbuchstaben enthält, die Option
ignorecaseüberschreiben und case-sensitive suchen.
set smartcase
- Vor der Ausführung von Befehlen wie
:nextund:makeautomatisch speichern. Ich nutze make sehr oft, also ist dies sehr effizient.
set autowrite
- Puffer verbergen, wenn sie aufgegeben werden, natürlich nur, wenn sie nicht in anderen Fenstern angezeigt werden. Dies ist nützlich, wenn ich gleichzeitig mit vielen Puffern arbeite und mir keine Sorgen über das Speichern beim Wechsel machen muss.
set hidden
- Ich finde Modeline sehr nützlich, wenn ich Code von anderen bekomme oder wenn ich anderen meinen Code geben möchte, setze ich bestimmte Einstellungen in der Modeline, die automatisch für jeden anderen Benutzer gesetzt werden, der vim verwendet, die wichtigsten sind
tabstopundexpandtab.
setglobal modeline
set modelines=3
- Ich möchte eine minimale Anzahl von Bildschirmzeilen über und unter dem Cursor behalten.
set scrolloff=3
- Den Modus, den ich verwende, als Nachricht in der letzten Zeile anzeigen, ob es nun
insert,visualoderreplaceModus ist.
set showmode
- Text umbrechen und lange Zeilen auf mehreren Zeilen anzeigen, ohne Zeilenumbrüche einzufügen.
set wrap
set linebreak
- Den Titel des Fensters auf den Wert von ‘titlestring’ setzen, und wenn leer auf: Dateiname [+==] Pfad - vim-Servername.
set title
- Zeilennummer auf der linken Seite des Dokuments auf der aktiven Zeile anzeigen und relative Nummern auf den restlichen Zeilen aktivieren.
set number
set relativenumber
- Den Pfad zur Shell auf ‘bash’ setzen
set shell=/bin/bash
- Temporäre und kompilierte Dateien für C++, Java und Python sowie die Konfigurationsordner der Versionskontrollsysteme, die ich möglicherweise verwende, ignorieren.
set wildignore=*.o,*~,*.pyc,*.class
set wildignore+=*/.git/*,*/.hg/*,*/.svn/*
- Beim Zusammenfügen von Zeilen nach Satzzeichen kein Leerzeichen einfügen.
set nojoinspaces
- Nicht neu zeichnen, während Makros ausgeführt werden, dies ist eine gute Leistungskonfiguration.
set lazyredraw
- Sicherungskopien deaktivieren. Da sich die meisten Dinge in der Versionskontrolle befinden, finde ich diese Backup- und Swap-Dateien nur störend, also deaktiviere ich sie alle.
set nobackup
set nowritebackup
set noswapfile
- Standardmäßig 1 Tab == 4 Leerzeichen setzen
set shiftwidth=4
set tabstop=4
set softtabstop=4
set smartindent
- Undo-Datei erstellen, um den Verlauf nach dem Schließen der Datei zu behalten.
set undofile
set undolevels=100
set undodir=~/.vim/undo//
- Informationen über offene Puffer beim Schließen merken.
set viminfo^=%
- Manchmal verliere ich den Überblick, in welcher Zeile ich mich befinde, also macht das Aktivieren von
cursorlinedie Sache viel, viel einfacher.
set cursorline
- Omni-Vervollständigung aktivieren.
set omnifunc=syntaxcomplete#Complete
- Visuelle Glocke deaktivieren.
set t_vb=
- Anzahl der Farben auf 256 setzen, da ich es so mag.
set t_Co=256
- Löschen verwendet die aktuelle Hintergrundfarbe.
set t_ut=
- Vertikalen Cursor im Einfügemodus setzen.
set guicursor=n-v-c:block,i-ci-ve:ver25,r-cr:hor20,o:hor50
\,a:blinkwait700-blinkoff400-blinkon250-Cursor/lCursor
\,sm:block-blinkwait175-blinkoff150-blinkon175
Plugin-Manager
Für Plugins habe ich viele Plugin-Manager ausprobiert, ich habe früher vundle verwendet, und die Einrichtung in meiner vimrc sollte so ausgesehen haben:
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
" add other plugins here
call vundle#end()
filetype plugin indent on
syntax on
Dann wechselte ich zu einem anderen Plugin-Manager namens vim-plug, der schneller ist und asynchrone Updates für die Plugins durchführt. Die Einrichtung ist auch einfacher und funktioniert gut mit vim/neovim:
call plug#begin(s:editor_root."/plugged/")
" add plugins here
" Plug 'dev-name/repo-name'
call plug#end()
Ich werde meine Lieblings-Plugins und deren Konfigurationen hier nicht besprechen, da sie sich von Zeit zu Zeit ändern und von der Nutzung von vim und der Arbeitsumgebung abhängen. Ich habe auch alle plugin-bezogenen Dinge in eine separate Datei plugs.vim verschoben, damit ich mich nicht zu sehr mit ihnen und ihren Einstellungen ablenke.
Tastenbelegungen
- Neovim Terminal-Modus Tastenbelegungen, um den Terminal-Puffer ähnlich wie einen normalen vim-Puffer zu behandeln.
tnoremap <Esc> <C-\><C-n>
tnoremap <C-h> <C-\><C-n><C-w>h
tnoremap <C-j> <C-\><C-n><C-w>j
tnoremap <C-k> <C-\><C-n><C-w>k
tnoremap <C-l> <C-\><C-n><C-w>l
noremap <leader>s :split term://bash<CR><C-w><S-j><S-a>
noremap <leader>t :tabedit term://bash<CR><S-a>
- Oft möchte ich im Visuellen Modus bleiben, wenn ich einen Block von Code verschiebe, also habe ich die Originaltasten neu belegt, um den Trick zu machen.
vnoremap < <gv
vnoremap > >gv
- Eine Zeile Text nach oben und unten bewegen mit
leader + [jk]sowohl im Normal- als auch im Visuellen Modus.
nmap <leader>j mz:m+<cr>'z
nmap <leader>k mz:m-2<cr>'z
vmap <leader>j :m'>+<cr>`<my`>mzgv`yo`z
vmap <leader>k :m'<-2<cr>`>my`<mzgv`yo`z
- Zwischen benachbarten Zeichen wechseln mit
leader + [hl], da ich es oft benutze, um schnell Tippfehler im Normalmodus zu korrigieren.
nmap <leader>l xp
nmap <leader>h xhhp
- Hervorgehobene Übereinstimmungen der vorherigen Suche deaktivieren, wenn
leader + ENTERgedrückt wird.
map <silent> <leader><CR> :noh<CR>
- Ich verwende Fenster ziemlich oft, also ist dies eine clevere Art, zwischen Fenstern zu wechseln, mit
ctrlin Kombination mit den ursprünglichen vim-Bewegungstasten[hjkl].
map <C-j> <C-W>j
map <C-k> <C-W>k
map <C-h> <C-W>h
map <C-l> <C-W>l
- Neuen Tab mit dem Pfad des aktuellen Puffers öffnen. Super nützlich beim Editieren von Dateien im selben Verzeichnis
map <leader>te :tabedit <c-r>=expand("%:p:h")<CR>/
cwdauf das Verzeichnis des offenen Puffers umschalten. In Kombination mit der vorherigen Tastenbelegung bekomme ich ein sehr angenehmes Verhalten.
map <leader>cd :cd %:p:h<CR>:pwd<CR>
- vimrc-Datei in einem neuen Tab öffnen.
nmap <leader>ev :tabe $MYVIMRC<CR>
- Rechtschreibprüfung ein- und ausschalten, wenn ich einen Artikel schreibe.
map <leader>ss :setlocal spell!<cr>
Statusleiste
Ich habe eine sehr schöne Statusleiste, auf die ich stolz bin und die ich gegenüber Statusleisten-Plugins bevorzuge. Sie enthält einige Hilfsfunktionen und Plugin-Status, also wenn Sie diese Plugins nicht verwenden, kommentieren Sie die Zeilen für diese aus, Fugitive und Syntastic.
set statusline=
set statusline=[%n]\ " buffer number
set statusline+=%<%.99f " File name, F for full path
set statusline+=%#warningmsg# " display a warning if
set statusline+=%{HasPaste()} " File name, F for full path
set statusline+=%* " tab chars
set statusline+=%m%r%h%w " status flags
set statusline+=%#question# " Display a warning if
set statusline+=%{(&fenc!='utf-8'&&&fenc!='')?'['.&fenc.']':''} " file encoding isnt
set statusline+=%* " utf-8
set statusline+=%#warningmsg# " display a warning if
set statusline+=%{StatuslineTabWarning()} " files contains
set statusline+=%* " tab chars
set statusline+=%#question# " Display a warning if
set statusline+=%{fugitive#statusline()} " Fugitive
set statusline+=%* " tab chars
set statusline+=%= " right align remainder
set statusline+=%{SyntasticStatuslineFlag()} " Syntastic
set statusline+=%y " buffer file type
set statusline+=%#directory# " display a warning if
set statusline+=%{&ff!='unix'?'['.&ff.']':''} " fileformat isnt
set statusline+=%* " unix
set statusline+=%c%V,%l/ " column and row Number
set statusline+=%L\ %P " total lines, position in file
set laststatus=2
Ich ändere gerne die Farbe der Statusleiste zu blau, wenn ich in den Einfügemodus gehe, und dies geschieht durch die folgenden Zeilen:
autocmd InsertEnter * highlight StatusLine term=reverse ctermbg=Blue gui=bold guifg=White guibg=Blue
autocmd InsertLeave * highlight StatusLine term=reverse ctermfg=254 ctermbg=238 gui=bold guifg=White guibg=Black
Nützliche Funktionen
- Abschließende Leerzeichen beim Speichern löschen, für alle Dateitypen außer Markdown, denn manchmal muss ich am Ende der Zeile zwei Leerzeichen lassen, um einen weichen Zeilenumbruch zu machen.
func! DeleteTrailingWS()
" Don't strip on these filetypes
if &ft =~ 'markdown'
return
endif
exe "normal mz"
%s/\s\+$//ge
exe "normal `z"
endfunc
autocmd BufWrite *.* :call DeleteTrailingWS()
- Praktischer Befehl, um den Unterschied zwischen dem aktuellen Puffer und der Datei, aus der er geladen wurde, anzuzeigen, also die Änderungen, die Sie vorgenommen haben.
if !exists(":Diff")
command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_ | diffthis
\ | wincmd p | diffthis
endif
- Zur letzten Bearbeitungsposition zurückkehren, wenn Dateien geöffnet werden (Das wollen Sie!)
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal! g`\"" |
\ endif
- Im Visuellen Modus
*oder#drücken, um die aktuelle Auswahl zu suchen.
vnoremap <silent> * :call VisualSelection('f')<CR>
vnoremap <silent> # :call VisualSelection('b')<CR>
function! CmdLine(str)
exe "menu Foo.Bar :" . a:str
emenu Foo.Bar
unmenu Foo
endfunction
function! VisualSelection(direction) range
let l:saved_reg = @"
execute "normal! vgvy"
let l:pattern = escape(@", '\\/.*$^~[]')
let l:pattern = substitute(l:pattern, "\n$", "", "")
if a:direction == 'b'
execute "normal ?" . l:pattern . "^M"
elseif a:direction == 'gv'
call CmdLine("vimgrep " . '/'. l:pattern . '/' . ' **/*.')
elseif a:direction == 'replace'
call CmdLine("%s" . '/'. l:pattern . '/')
elseif a:direction == 'f'
execute "normal /" . l:pattern . "^M"
endif
let @/ = l:pattern
let @" = l:saved_reg
endfunction
- Java mit javac kompilieren und mit java auf den aktuellen Puffer anwenden. Nützlich für kleine Java-Programme, die sofort ausgeführt werden sollen.
function! CompileAndRunJava()
:w!
setlocal makeprg=javac\ %
setlocal errorformat=%A%f:%l:\ %m,%-Z%p^,%-C%.%#
:make
" split source filename by . and pass the first part to java
:!i=%; echo ${i//.*/}|xargs java
endfunction
- In meiner Statusleiste verwende ich einige Funktionen. Eine davon ist, den Zustand des aktuellen Puffers zu ermitteln, ob er Tabs oder Leerzeichen verwendet.
function! StatuslineTabWarning()
if !exists("b:statusline_tab_warning")
let tabs = search('^\t', 'nw') != 0
if tabs
let b:statusline_tab_warning = '[tabs]'
else
let b:statusline_tab_warning = ''
endif
endif
return b:statusline_tab_warning
endfunction
autocmd cursorhold,bufwritepost * unlet! b:statusline_tab_warning
- Dies prüft, ob der Einfügemodus aktiviert ist, ich möchte das auch in meiner Statusleiste sehen.
function! HasPaste()
if &paste
return '[PASTE]'
else
return ''
endif
endfunction
- Fenster nicht schließen, wenn ein Puffer gelöscht wird.
command! Bclose call <SID>BufcloseCloseIt()
function! <SID>BufcloseCloseIt()
let l:currentBufNum = bufnr("%")
let l:alternateBufNum = bufnr("#")
if buflisted(l:alternateBufNum)
buffer #
else
bnext
endif
if bufnr("%") == l:currentBufNum
new
endif
if buflisted(l:currentBufNum)
execute("bdelete! ".l:currentBufNum)
endif
endfunction
- Da jeder seine eigenen Standards für die Verwendung von Tabs oder Leerzeichen hat, ermöglicht diese Funktion das Umschalten zwischen Tabs und Leerzeichen, um den Aufwand zu erleichtern.
function! TabToggle()
if &expandtab
set noexpandtab
retab!
else
set expandtab
retab
endif
endfunction
- Rote Hervorhebung auf Spaltenfarbe 80 anzeigen.
function! g:ToggleColorColumn()
if &colorcolumn != ''
setlocal colorcolumn&
else
setlocal colorcolumn=80
endif
endfunction
nnoremap <silent> <leader>cc :call g:ToggleColorColumn()<CR>
- Oft, wenn ich nach einem Regex suche, wollte ich alle vorhandenen Übereinstimmungen kopieren und irgendwo anders einfügen, deshalb verwende ich diese Funktion.
:CopyMatcheskopiert alle Übereinstimmungen in die Zwischenablage.:CopyMatches xwobeixein beliebiges Register ist, das das Ergebnis enthält.- Aus Register x einfügen mit
"xpoder"xP.
function! CopyMatches(reg)
let hits = []
%s//\=len(add(hits, submatch(0))) ? submatch(0) : ''/ge
let reg = empty(a:reg) ? '+' : a:reg
execute 'let @'.reg.' = join(hits, "\n") . "\n"'
endfunction
command! -register CopyMatches call CopyMatches(<q-reg>)
- Modeline nach der letzten Zeile im Puffer anhängen.
function! AppendModeline()
let l:modeline = printf(" vim: set ft=%s ts=%d sw=%d %set %sai : ",
\ &filetype, &tabstop, &shiftwidth, &expandtab ? '' : 'no', &autoindent ? '' : 'no')
let l:modeline = substitute(&commentstring, "%s", l:modeline, "")
call append(line("$"), l:modeline)
endfunction
nnoremap <silent> <Leader>ml :call AppendModeline()<CR>
- Puffer neu ausrichten, wenn iTerm in den Vollbildmodus geht
augroup FixProportionsOnResize
au!
au VimResized * exe "normal! \<c-w>="
augroup END
- Alle Vorkommen des Worts unter dem Cursor hervorheben, wenn inaktiv. Nützlich beim Studieren von fremdem Quellcode. Tippen Sie
z/, um die Hervorhebung ein-/auszuschalten.
nnoremap z/ :if AutoHighlightToggle()<Bar>set hls<Bar>endif<CR>
function! AutoHighlightToggle()
let @/ = ''
if exists('#auto_highlight')
au! auto_highlight
augroup! auto_highlight
setl updatetime=100
echo 'Highlight current word: off'
return 0
else
augroup auto_highlight
au!
au CursorHold * let @/ = '\V\<'.escape(expand('<cword>'), '\').'\>'
augroup end
setl updatetime=100
echo 'Highlight current word: ON'
return 1
endif
endfunction
Alle Informationen zu vim-Befehlen können Sie mit dem Hilfesystem in vim finden, indem Sie :help command tippen, oder schauen Sie in die Online-Dokumentation, denn sie sind sehr klar und verständlich.
Der vollständige Satz meiner vimrc befindet sich auf meinem GitHub. Dort verwende ich ein Repo für alle meine Dotfiles, Bash- und tmux-Konfigurationen.
Verbesserungsvorschläge sind willkommen.