Files
dotfiles/nvim/init.vim
2025-08-26 11:16:44 +02:00

357 lines
9.0 KiB
VimL

set nocompatible
filetype off
" Find python
if has("macunix")
" Required for virtualenvs
let arch=substitute(system('uname -m'), '\n', '', '')
if arch == 'arm64'
let g:python_interpreter=expand("~/python-envs/neovim/bin/python3")
else
let g:python_interpreter="/usr/local/bin/python3"
endif
let g:tagbar_ctags="/opt/homebrew/bin/ctags"
else
let g:python_interpreter = 'python3'
endif
let g:python3_host_prog=g:python_interpreter
" Plugins
" Note: on most systems, this will make the plugins reside in \
" ~/.local/share/nvim/plugged/
let data_dir = has('nvim') ? stdpath('data') . '/site' : expand('~/.vim')
if empty(glob(data_dir . '/autoload/plug.vim'))
silent execute '!curl -fLo '.data_dir.'/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
let &runtimepath = &runtimepath
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif
" Disable Perl
let g:loaded_perl_provider = 0
call plug#begin()
if !exists('g:vscode')
" Warn about plugin updates
Plug 'semanser/vim-outdated-plugins'
" Powerline replacement
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
" Tags
Plug 'xolox/vim-misc'
"Plugin 'ludovicchabant/vim-gutentags'
Plug 'majutsushi/tagbar'
" Templates
Plug 'aperezdc/vim-template'
" Selection expand
Plug 'terryma/vim-expand-region'
Plug 'kana/vim-textobj-user'
Plug 'kana/vim-textobj-line'
Plug 'kana/vim-submode'
" Better Pasting
Plug 'ConradIrwin/vim-bracketed-paste'
" Tmux navigation
Plug 'christoomey/vim-tmux-navigator'
" YouCompleteMe
function! BuildYCM(info)
" info is a dictionary with 3 fields
" - name: name of the plugin
" - status: 'installed', 'updated', or 'unchanged'
" - force: set on PlugInstall! or PlugUpdate!
if a:info.status == 'installed' || a:info.status == 'updated' || a:info.force
execute '!' . g:python_interpreter . ' ./install.py --all'
endif
endfunction
Plug 'ycm-core/YouCompleteMe', { 'do': function('BuildYCM') }
Plug 'rdnetto/YCM-Generator'
" Git
Plug 'tpope/vim-fugitive'
" Snippets
" Track the engine.
Plug 'SirVer/ultisnips'
" Snippets are separated from the engine. Add this if you want them:
Plug 'honza/vim-snippets'
Plug 'ervandew/supertab'
"Buftabeline
"Plug 'ap/vim-buftabline'
" Highlight matching xml tags
Plug 'Valloric/MatchTagAlways'
"Javascript
Plug 'pangloss/vim-javascript'
" Tex
Plug 'lervag/vimtex'
"Go
Plug 'fatih/vim-go'
"Macdown (only on macOS)
"if has("macunix")
"Plug 'hashrocket/vim-macdown'
"endif
" Comments
Plug 'scrooloose/nerdcommenter'
" Surround
Plug 'tpope/vim-surround'
endif
call plug#end()
" Run PlugInstall if there are missing plugins
autocmd VimEnter * if len(filter(values(g:plugs), '!isdirectory(v:val.dir)'))
\| PlugInstall --sync | source $MYVIMRC
\| endif
filetype plugin indent on
set cinkeys-=0#
" Terminal emulator settings
set termguicolors
" Color configuration
try
source ~/.config/nvim/scheme.vim
catch
" Ignore non existing file
endtry
highlight Comment cterm=italic gui=italic
syntax enable " enable syntax processing
" Disable annoying bell
set noerrorbells
" Allow modelines at the beginning and end of a file
set modeline
" Key configuration
let mapleader = "\<Space>" " Make space the leader key
nnoremap <Leader>w :w<CR>| " Write file
nnoremap <Leader>q :q<CR>| " Close file
nnoremap <Leader>s :w !sudo -A tee %<CR>L<CR>
cmap w!! w !sudo -A tee > /dev/null %
nmap <Leader><Leader> V| " Change to visual line mode
map q: :q| " No command history
nmap <Leader><CR> O<ESC> | " Add line above
nmap <CR> o<ESC>| " Add line below
nmap <Leader>f gq}| " Format paragraph
" Window management
nmap <Leader>mt :tab sp<CR> | " maximize window to new tab
nmap <Leader>. <C-w>= | " Split windows equally
map gb :bnext<CR>
map gB :bNext<CR>
if !exists('g:vscode')
call submode#enter_with('grow/shrink', 'n', '', '<Leader>r', '<Nop>')
call submode#map('grow/shrink', 'n', '', '+', '<C-w>+')
call submode#map('grow/shrink', 'n', '', '-', '<C-w>-')
call submode#map('grow/shrink', 'n', '', '<', '<C-w><')
call submode#map('grow/shrink', 'n', '', '>', '<C-w>>')
endif
set splitbelow
set splitright
" Delete without copying
nnoremap <leader>d "_d
xnoremap <leader>d "_d
nnoremap <leader>x "_x
xnoremap <leader>x "_x
xnoremap <leader>p "_dP
"disable submode timeouts:
let g:submode_timeout = 0
" don't consume submode-leaving key
let g:submode_keep_leaving_key = 1
" Configuration of spaces and tabs
set tabstop=4 " show 4 spaces per TAB
set softtabstop=4 " insert 4 spaces per TAB
set smarttab
set expandtab " tabs are spaces
set shiftwidth=4
" UI
set number " show line numbers
set relativenumber "relative line numbers
set showcmd " show last command in bottom bar
set cursorline " highlight current line
" Statusline
set statusline+=%f\ " show Filepath
set statusline+=[%{strlen(&fenc)?&fenc:'none'}] "file encoding
set statusline+=%m%r " Modified and read only flag
set statusline+=%= " align left
set statusline+=%y " show Filetype
set statusline+=[%{&fo}] " Show format options
set laststatus=2 " always show statusline
" Filetypes
filetype on " filetype detection on
filetype indent on " filetype-specific indent .vim/indent/
filetype plugin on " filteype plugins in .vim/ftplugins
set smartindent
set wildmenu " visual autocomplete for command menu
set lazyredraw " redraw only when necessary
set showmatch " highlight matching brackets
set mouse=a " Mouse control
" Searching
set incsearch " search while entering
set hlsearch " highlight matches
nnoremap <Leader>h :set hlsearch!<CR>
set ignorecase
set smartcase
" Line wrapping
set tw=100 " set textwidth of 100 characters
set formatoptions-=t " Don't wrap code
set formatoptions+=c " Wrap comments
set formatoptions+=mB " Don't break multibyte characters
set formatoptions+=j " Remove multiple comment markers
function TextWrapToggle()
if &fo =~'t'
setlocal fo-=t
else
setlocal fo+=t
endif
let formatoptions = &formatoptions
echom formatoptions
endfunction
nmap <Leader>t :call TextWrapToggle()<CR>
" Highlight characters past 80
"augroup vimrc_autocmds
"autocmd BufEnter * highlight OverLength ctermbg=88 guibg=#592929
"autocmd BufEnter * match OverLength /\%81v.*/
"augroup END
"Copying
if !exists('g:vscode')
lua << EOF
vim.g.clipboard = {
name = 'OSC 52',
copy = {
['+'] = require('vim.ui.clipboard.osc52').copy('+'),
['*'] = require('vim.ui.clipboard.osc52').copy('*'),
},
paste = {
['+'] = require('vim.ui.clipboard.osc52').paste('+'),
['*'] = require('vim.ui.clipboard.osc52').paste('*'),
},
}
if vim.env.TMUX ~= nil then
local copy = {'tmux', 'load-buffer', '-w', '-'}
local paste = {'bash', '-c', 'tmux refresh-client -l && sleep 0.05 && tmux save-buffer -'}
vim.g.clipboard = {
name = 'tmux',
copy = {
['+'] = copy,
['*'] = copy,
},
paste = {
['+'] = paste,
['*'] = paste,
},
cache_enabled = 0,
}
end
EOF
endif
set clipboard=unnamedplus,unnamed " Copy/Paste
" Airline
let g:airline_powerline_fonts = 1
" TagBar
nmap <F8> :TagbarToggle<CR>
imap <F8> <ESC>:TagbarToggle<CR>gi
nmap <C-]> <C-w><C-]><C-w>T
" YouCompleteMe
let g:ycm_collect_identifiers_from_tags_files = 1 " Read from tag files
let g:ycm_global_ycm_extra_conf = expand('~/.config/nvim/.ycm_extra_conf.py') " Standard conf
let g:ycm_enable_diagnostic_signs = 0 " Do not show semantic error bar
let g:ycm_server_python_interpreter=g:python_interpreter
let g:ycm_python_interpreter_path=g:python_interpreter
" Enable virtualenv autocompletion
let g:ycm_python_binary_path = 'python3'
let g:ycm_key_list_select_completion = ['<C-j>', '<C-n>', '<Down>']
let g:ycm_key_list_previous_completion = ['<C-k>', '<C-p>', '<Up>']
"Tags
let g:easytags_async = 1
" make
set switchbuf=split
"autocmd QuickFixCmdPre make set cmdheight=2
"autocmd QuickFixCmdPost make nested cwindow "Open the quickfix window
"autocmd QuickFixCmdPost make nested lwindow "Change to the quickfix window
"nmap <F9> :silent! make<CR>:redraw!<CR>
"nmap <Leader>m :silent! make<CR>:redraw!<CR>
"nmap <Leader>x :silent! make ex<CR>:redraw!<CR>
"imap <F9> <ESC>:make<CR>:redraw!<CR>i
" vim-templates config-file
try
source ~/.config/nvim/.vimrc_config_template
catch
" Ignore non existing file
endtry
" Expand region
vmap v <Plug>(expand_region_expand)
vmap <C-v> <Plug>(expand_region_shrink)
" Snippets
let g:SuperTabDefaultCompletionType = '<C-n>'
let g:SuperTabCrMapping = 0
let g:UltiSnipsExpandTrigger="<tab>"
let g:UltiSnipsJumpForwardTrigger="<tab>"
let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
let g:UltiSnipsEditSplit="vertical"
set rtp+=~/.config/nvim/my-snippets
" Folding
set foldmethod=syntax
set foldlevel=100
" Use F9 to toggle folding
inoremap <F9> <C-O>za
nnoremap <F9> za
onoremap <F9> <C-C>za
vnoremap <F9> zf
nnoremap <Leader>a za
onoremap <Leader>a <C-C>za
vnoremap <Leader>a zf
try
source ~/.config/nvim/.vimrc_config_expand_region
catch
" Ignore non existing file
endtry
" Extra stuff
try
source ~/.config/nvim/.vimrc_config_extra_stuff
catch
" Ignore non existing file
endtry
let g:tex_flavor = "latex"
autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab