Zum Inhalt springen
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 Konfigurationsparametern shiftwidth. tabstop und softtabstop.
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

Nach oben

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. matchtime steuert 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 :next und :make automatisch 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 tabstop und expandtab.
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, visual oder replace Modus 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 cursorline die 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

Nach oben

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.

Nach oben

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 + ENTER gedrückt wird.
map <silent> <leader><CR> :noh<CR>
  • Ich verwende Fenster ziemlich oft, also ist dies eine clevere Art, zwischen Fenstern zu wechseln, mit ctrl in 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>/
  • cwd auf 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>

Nach oben

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

Nach oben

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.
    • :CopyMatches kopiert alle Übereinstimmungen in die Zwischenablage.
    • :CopyMatches x wobei x ein beliebiges Register ist, das das Ergebnis enthält.
    • Aus Register x einfügen mit "xp oder "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.

Nach oben