Add config for vim

This commit is contained in:
Alexander Hess 2022-07-12 14:55:49 +02:00
parent c1393d0756
commit 5c3a914658
Signed by: alexander
GPG key ID: 344EA5AB10D868E0
6 changed files with 369 additions and 0 deletions

View file

@ -21,6 +21,7 @@ git clone --bare git@git.webartifex.biz:alexander/dotfiles.git "$HOME/.dotfiles"
# Backup old dotfiles # Backup old dotfiles
rm -rf "$HOME/.dotfiles.bak" >/dev/null rm -rf "$HOME/.dotfiles.bak" >/dev/null
mkdir -p $HOME/.dotfiles.bak/.config/{bat,flameshot,git,Nextcloud,pop-system-updater,psql,shell} && \ mkdir -p $HOME/.dotfiles.bak/.config/{bat,flameshot,git,Nextcloud,pop-system-updater,psql,shell} && \
mkdir -p $HOME/.dotfiles.bak/.vim/{after/ftplugin,backup,swap,undo} && \
/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \ /usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \
xargs -I{} mv {} "$HOME/.dotfiles.bak"/{} xargs -I{} mv {} "$HOME/.dotfiles.bak"/{}

View file

@ -0,0 +1,65 @@
" Set the search path to the folder of the current file and its sub-folders
setlocal path=.,**
" Exclude Python's compiled files from searches
setlocal wildignore=*/__pycache__/*,*.pyc
" TODO: This does not work, maybe because we spell out imports
" as project-local imports (e.g. from lalib.fields import base)?
" Include *.py files imported as modules when searching.
" Source: https://www.youtube.com/watch?v=Gs1VDYnS-Ac
set include=^\\s*\\(from\\\|import\\)\\s*\\zs\\(\\S\\+\\s\\{-}\\)*\\ze\\($\\\|\ as\\)
" 1) import foo.bar -> foo/bar.py
" 2) from foo import bar as var -> foo/bar.py or foo.py
function! PyInclude(fname)
let parts = split(a:fname, ' import ') " 1) [foo.bar] or 2) [foo, bar]
let left = parts[0] " 1) foo.bar or 2) foo
if len(parts) > 1
let right = parts[1] " only 2) bar
let joined = join([left, right], '.')
let fpath = substitute(joined, '\.', '/', 'g') . '.py'
let found = glob(fpath, 1)
if len(found)
return found
endif
endif
return substitute(left, '\.', '/', 'g') . '.py'
endfunction
setlocal includeexpr=PyInclude(v:fname)
setlocal define=^\\s*\\<\\(def\\|class\\)\\>
" Number of spaces used for each step of auto-indent
set shiftwidth=4
" Number of spaces a <Tab> counts for in the file
set tabstop=4
" Number of spaces a <Tab> counts for in editing mode
set softtabstop=4
" Change <Tab>s into spaces
set expandtab
" Copy indent from previous line when starting a new line
set autoindent
" Use indent according to the syntax of the open file
set smartindent
" Auto-wrap lines after 88 characters, which is PEP8's limit plus 10%,
" a more relaxed boundary which occasionally may be used
set textwidth=88
" Make column 80 red to indicate PEP8's maximum allowed line length
set colorcolumn=80
" Additionally, give every character beyond 80 columns a red background
highlight ColorColumn ctermbg=DarkRed
call matchadd('ColorColumn', '\%80v', 100)
match ErrorMsg '\%>80v.\+'
" Show line numbers by default for .py files
let g:show_numbers=1

0
.vim/backup/.gitkeep Normal file
View file

0
.vim/swap/.gitkeep Normal file
View file

0
.vim/undo/.gitkeep Normal file
View file

303
.vim/vimrc Normal file
View file

@ -0,0 +1,303 @@
" Good sources on vimrc files:
" - https://www.youtube.com/watch?v=Gs1VDYnS-Ac
" Use VIM improved mode
set nocompatible
" Set environment variables for convenient usage
let $RC="$HOME/.vim/vimrc"
let $RTP=split(&runtimepath, ',')[0]
" Disable VIM's startup message
set shortmess+=I
" Number of remembered undo steps
set undolevels=1000
" Detect the file's type and load the corresponding plugin and indent files
filetype plugin indent on
" Enable syntax highlighting
syntax on
" Allow backspace to delete characters in insert mode
" beyond the start of the insertion and end of lines
set backspace=start,eol,indent
" Hide buffers instead of closing them, wich means we can have
" unwritten changes to a file and open a new one with :e,
" without having to write the changes first
set hidden
" Set to the folder of the current file and its sub-folders
" (this may need to be adapted for large project folders)
set path=.,**
" Store all vim-related working files in ~/.vim
set viminfo+=n~/.vim/viminfo
" Use dedicated folders to store temporary backup, swap, and undo files
" (the // means that VIM adapts names automatically to avoid duplicates)
set backupdir=~/.vim/backup//
set directory=~/.vim/swap//
set undodir=~/.vim/undo//
" To disable any of the temporary files, uncomment one of the following
" set nobackup
" set nowritebackup
" set noswapfile
" set noundofile
" Show the filename in the terminal window's title bar
set title
" Do not wrap lines when showing text
set nowrap
" This avoids a problem of loosing data upon insertion in old VIMs
set wrapmargin=0
" Show spelling mistakes (in English) in italics
set spelllang=en_us,de_de
set spell
hi clear SpellBad
hi clear SpellCap
hi clear SpellRare
hi clear SpellLocal
hi SpellBad cterm=italic
" Show whitespace characters
set listchars=tab:»»,extends:,precedes:,nbsp,trail
set list
" Highlight matching brackets
set showmatch
set matchpairs+=<:>
" Always show the status bar at the bottom
set laststatus=2
" Show current position in status bar
set ruler
set rulerformat=%=%l/%L\ %c\ (%P)
" Show commands in status bar
set showcmd
" If in non-normal mode, show the mode in the status bar
set showmode
" Show a dialog to save changes instead of an error message
set confirm
" Auto-clear messages from the status bar
autocmd CursorHold * :echo
" Better copy and paste behavior
set pastetoggle=<F2>
set clipboard=unnamed
" Make : and ; synonyms
nnoremap ; :
" Use \ and <space> as the <leader> keys and lower time to enter key sequences
let mapleader='\'
set timeoutlen=750
" Make <space> the <leader> in visual mode as well
nmap <space> \
vmap <space> \
" Q normally goes into Ex mode
nmap Q <Nop>
" Get sudo rights when writing a buffer with w!!
cnoremap w!! w !sudo tee % >/dev/null
" Enable the mouse for selections, including a toggle for this mode
set mouse=a
let g:mouse_enabled=1
function ToggleMouse()
if g:mouse_enabled == 1
echo "Mouse OFF"
set mouse=
let g:mouse_enabled=0
else
echo "Mouse ON"
set mouse=a
let g:mouse_enabled=1
endif
endfunction
noremap <silent><leader>m :call ToggleMouse()<cr>
" Enable toggling between
" - showing and hiding line numbers (<leader>l)
" - absolute and relative numbers (<leader>a) in normal mode
" (default: relative line numbering)
let g:show_numbers=0
let g:show_absolute_numbers=0
function! ShowLineNumbers()
if g:show_numbers == 1
set number
if g:show_absolute_numbers
set norelativenumber
else
set relativenumber
endif
else
set nonumber
set norelativenumber
endif
endfunction
function! ToggleLineNumbers()
if g:show_numbers == 1
let g:show_numbers=0
else
let g:show_numbers=1
endif
call ShowLineNumbers()
endfunction
function! ToggleAbsoluteAndRelativeLineNumbers()
if g:show_absolute_numbers == 1
let g:show_absolute_numbers=0
else
let g:show_absolute_numbers=1
endif
call ShowLineNumbers()
endfunction
" Auto-switch between absolute and relative numbering when switching modes
" (insert mode always shows absolute numbers when numbers are shown)
augroup numbertoggle
autocmd!
autocmd BufEnter,FocusGained,InsertLeave * call ShowLineNumbers()
autocmd BufLeave,FocusLost,InsertEnter * if g:show_numbers == 1 | set number | set norelativenumber | endif
augroup END
" Key bindings
nnoremap <silent><leader>l :call ToggleLineNumbers()<cr>
nnoremap <silent><leader>a :call ToggleAbsoluteAndRelativeLineNumbers()<cr>
" Show all possible matches above command-line when tab completing
set wildmenu
set wildmode=longest:full,full
" Highlight search results
set hlsearch
" Shortcut to remove current highlighting
nnoremap <silent><leader>h :nohlsearch<cr>
" Move cursor to result while typing immediately
set incsearch
" Ignore case when searching
set ignorecase
" Upper case search term => case sensitive search
set smartcase
" Highlight the next match in red for 0.25 seconds
function! HighlightNext()
let [bufnum, lnum, col, off] = getpos('.')
let matchlen = strlen(matchstr(strpart(getline('.'),col-1),@/))
let target_pat = '\c\%#\%('.@/.'\)'
let ring = matchadd('ErrorMsg', target_pat, 101)
redraw
exec 'sleep ' . float2nr(250) . 'm'
call matchdelete(ring)
redraw
endfunction
nnoremap <silent>n n:call HighlightNext()<cr>
nnoremap <silent>N N:call HighlightNext()<cr>
" Make <leader>w safe the buffer in normal mode
" and <c-z> save the buffer in all modes
" (the latter disables making VIM a background job;
" <c-z> is useful to have as <leader>w does not work in INSERT mode)
nnoremap <leader>w :update<cr>
nnoremap <c-z> :update<cr>
vnoremap <c-z> <c-c>:update<cr>
inoremap <c-z> <c-o>:update<cr>
" <leader>q quits VIM
nnoremap <leader>q :quit<cr>
" Easier switching between tabs
noremap <leader>, <esc>:tabprevious<cr>
noremap <leader>. <esc>:tabnext<cr>
" Arrow keys and <c-h/j/k/l> either (un)indent lines or move them up or down
" (same for blocks of lines in visual mode)
nnoremap <left> <<
nnoremap <right> >>
nnoremap <silent><up> :m-2<cr>
nnoremap <silent><down> :m+<cr>
nmap <c-h> <left>
nmap <c-j> <down>
nmap <c-k> <up>
nmap <c-l> <right>
vnoremap <left> <gv
vnoremap <right> >gv
vnoremap <up> :m'<-2<cr>gv=gv
vnoremap <down> :m'>+1<cr>gv=gv
vmap <c-h> <left>
vmap <c-j> <down>
vmap <c-k> <up>
vmap <c-l> <right>
" Make <tab> (un)indent lines
nnoremap <tab> >>
nnoremap <s-tab> <<
inoremap <tab> <esc>>>
inoremap <s-tab> <esc><<
vnoremap <tab> >gv
vnoremap <s-tab> <gv
" Make Y yank the rest of a line, just like C or D work
noremap Y y$
" Alphabetically sort a selection of lines
vnoremap <leader>s :sort<cr>
" Switch two words, just like xp switches two characters
noremap <leader>xp dwElp
" Auto-reload a file that was changed by some other process
" if the buffer has not yet been changed in the meantime
set autoread
augroup checktime
autocmd!
autocmd BufEnter * silent! checktime
autocmd CursorHold * silent! checktime
autocmd CursorHoldI * silent! checktime
autocmd CursorMoved * silent! checktime
autocmd CursorMovedI * silent! checktime
augroup END
" Auto-reload ~/.vim/vimrc
augroup vimrc
autocmd! BufWritePost $RC source % | redraw
augroup END
" Key binding to reload ~/.vim/vimrc manually
nnoremap <silent><leader>rc :so $RC<cr>