log-e-dotvim/.vimrc
2025-06-18 20:13:25 +02:00

339 lines
8.5 KiB
VimL

set nocompatible " be iMproved, required
filetype off " required
call plug#begin('~/.vim/plugged')
" reload config files automatically
Plug 'xolox/vim-reload'
" Ctrlp for fuzzy file search
Plug 'ctrlpvim/ctrlp.vim'
" File browser
Plug 'scrooloose/nerdtree'
" More clever matching for % key
Plug 'tmhedberg/matchit'
" fugitive.vim git integration
Plug 'tpope/vim-fugitive'
" Surround
Plug 'tpope/vim-surround'
" Repeat of plugin commands
Plug 'tpope/vim-repeat'
" LSP support
Plug 'yegappan/lsp'
" more commplete
Plug 'girishji/vimcomplete'
" snippet support
Plug 'hrsh7th/vim-vsnip'
Plug 'hrsh7th/vim-vsnip-integ'
Plug 'rafamadriz/friendly-snippets'
" Haskell syntax
Plug 'neovimhaskell/haskell-vim'
" Typescript syntax
Plug 'leafgarland/typescript-vim'
call plug#end()
" All of your Plugins must be added before the following line
language en_US.UTF-8
filetype plugin indent on " required
syntax on
"Set the status line options.Make it show more information.
set laststatus=2
set statusline=%{FugitiveStatusline()}\ %F%m%r%h%w\ [BUF=%n]\ [FORMAT=%{&ff}]\ [FO=%{&fo}]\ [TYPE=%Y]\ [POS=%l,%v]\[%p%%]\ %{strftime(\"%d/%m/%y\ -\%H:%M\")}
"set line no, buffer, search, highlight, autoindent and more.
set nu
set hidden
set ignorecase
set incsearch
set smartcase
set showmatch
" set autoindent
set ruler
set vb
set noerrorbells
set showcmd
set mouse=a
set history=1000
set undolevels=1000
" highlight search results
set hlsearch
" show tabs and spaces
set list
set listchars=space,tab:..>,trail
autocmd VimEnter * wincmd p
" JSON macros
" TODO move to ftplugin
augroup json_macros " {
autocmd!
autocmd FileType json :nnoremap <localleader>fm :%!python -m json.tool<CR>
augroup END " }
" Haskell
augroup haskell_stuff " {
autocmd!
autocmd BufNewFile,BufRead *.hsc set ft=haskell
augroup END " }
" C
augroup c_stuff " {
autocmd!
autocmd BufNewFile,BufRead *.h set ft=c
augroup END " }
" Ctrl-p settings
let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files -co --exclude-standard']
digraphs \- 8866
digraphs -\ 8867
digraphs !( 8840
digraphs !) 8841
digraphs /< 10216
digraphs /> 10217
digraphs mt 8614
digraphs /( 8713
digraphs /) 8716
" Markdown
let g:markdown_fenced_languages = ['python', 'typescript', 'javascript', 'haskell']
" ############## AUTOCOMPLETE STUFF ##############
" ############## autocomplete
let autocomplete_opts = #{
\ vsnip : #{ enable: v:true }
\ }
" Expand
imap <expr> <C-j> vsnip#expandable() ? '<Plug>(vsnip-expand)' : '<C-j>'
smap <expr> <C-j> vsnip#expandable() ? '<Plug>(vsnip-expand)' : '<C-j>'
" Expand or jump
imap <expr> <C-l> vsnip#available(1) ? '<Plug>(vsnip-expand-or-jump)' : '<C-l>'
smap <expr> <C-l> vsnip#available(1) ? '<Plug>(vsnip-expand-or-jump)' : '<C-l>'
" Jump forward or backward
imap <expr> <Tab> vsnip#jumpable(1) ? '<Plug>(vsnip-jump-next)' : '<Tab>'
smap <expr> <Tab> vsnip#jumpable(1) ? '<Plug>(vsnip-jump-next)' : '<Tab>'
imap <expr> <S-Tab> vsnip#jumpable(-1) ? '<Plug>(vsnip-jump-prev)' : '<S-Tab>'
smap <expr> <S-Tab> vsnip#jumpable(-1) ? '<Plug>(vsnip-jump-prev)' : '<S-Tab>'
" Select or cut text to use as $TM_SELECTED_TEXT in the next snippet.
" See https://github.com/hrsh7th/vim-vsnip/pull/50
" nmap s <Plug>(vsnip-select-text)
" xmap s <Plug>(vsnip-select-text)
" nmap S <Plug>(vsnip-cut-text)
" xmap S <Plug>(vsnip-cut-text)
" If you want to use snippet for multiple filetypes, you can `g:vsnip_filetypes` for it.
"let g:vsnip_filetypes = {}
" lsp support stuff
let g:lspOpts = #{
\ aleSupport: v:false,
\ autoComplete: v:true,
\ autoHighlight: v:false,
\ autoHighlightDiags: v:true,
\ autoPopulateDiags: v:false,
\ completionMatcher: 'case',
\ completionMatcherValue: 1,
\ diagSignErrorText: 'E>',
\ diagSignHintText: 'H>',
\ diagSignInfoText: 'I>',
\ diagSignWarningText: 'W>',
\ echoSignature: v:false,
\ hideDisabledCodeActions: v:false,
\ highlightDiagInline: v:false,
\ hoverInPreview: v:false,
\ ignoreMissingServer: v:false,
\ keepFocusInDiags: v:true,
\ keepFocusInReferences: v:true,
\ completionTextEdit: v:true,
\ diagVirtualTextAlign: 'above',
\ diagVirtualTextWrap: 'default',
\ noNewlineInCompletion: v:false,
\ omniComplete: v:null,
\ outlineOnRight: v:false,
\ outlineWinSize: 20,
\ semanticHighlight: v:false,
\ showDiagInBalloon: v:true,
\ showDiagInPopup: v:true,
\ showDiagOnStatusLine: v:false,
\ showDiagWithSign: v:true,
\ showDiagWithVirtualText: v:false,
\ showInlayHints: v:false,
\ showSignature: v:true,
\ snippetSupport: v:false,
\ ultisnipsSupport: v:false,
\ useBufferCompletion: v:false,
\ usePopupInCodeAction: v:false,
\ useQuickfixForLocations: v:false,
\ vsnipSupport: v:false,
\ bufferCompletionTimeout: 100,
\ customCompletionKinds: v:false,
\ completionKinds: {},
\ filterCompletionDuplicates: v:false,
\ }
autocmd User LspSetup call LspOptionsSet(lspOpts)
let lspServers = [#{
\ name: 'clang',
\ filetype: ['c', 'cpp'],
\ path: '/usr/bin/clangd',
\ args: ['--background-index', '--header-insertion=never']
\ }]
autocmd User LspSetup call LspAddServer(lspServers)
" ============ LogE_* =================
" Toggle relative line numbers
function LogE_ToggleRelative()
if &relativenumber==1
set norelativenumber
else
set relativenumber
endif
endfunction
" grep for arg in current or specified dir
function LogE_GrepAskForDir(what)
call inputsave()
let dir = input('grep -r "' . a:what . '" in directory (default is ./): ')
call inputrestore()
if !dir
dir = './'
endif
execute 'grep -r ' . a:what . ' ' . dir
endfunction
" ask for input of number, and set indentation width accordingly
" if input is '', setting defaults to
" set tabstop=8 shiftwidth=8 noexpandtab
" if input is 'n', settings are set as
" set softtabstop=n shiftwidth=n expandtab
function LogE_SetIndentWidth()
call inputsave()
let l:width = input('Set ident: ')
call inputrestore()
if l:width==''
set tabstop=8 shiftwidth=8 noexpandtab
else
let l:numw = str2nr(l:width, 10)
execute 'set softtabstop=' . l:numw . ' shiftwidth=' . l:numw . ' expandtab'
endif
endfunction
" terminal theme color adjustments
function LogE_ColorAdjust_TomorrowDark()
hi SpecialKey ctermfg=darkgrey
hi ColorColumn ctermbg=darkgrey
endfunction
function LogE_ColorAdjust_TomorrowLight()
hi SpecialKey ctermfg=225
hi ColorColumn ctermbg=225 " light pinkish
endfunction
call LogE_ColorAdjust_TomorrowDark()
let g:ColorAdjustments = [
\ ['tomorrowDark', function("LogE_ColorAdjust_TomorrowDark")],
\ ['tomorrowLight', function("LogE_ColorAdjust_TomorrowLight")],
\ ]
let g:CurrColorAdjust=g:ColorAdjustments[0][0]
function LogE_ColorAdjust_Rotate()
let found=v:false
for kv in g:ColorAdjustments
if found
let g:CurrColorAdjust=kv[0]
call kv[1]()
return
endif
if kv[0] == g:CurrColorAdjust
let found=v:true
endif
endfor
" NOTE: will only end up here if we need to wrap around the list of
" color adjustments
let wrap=g:ColorAdjustments[0]
let g:CurrColorAdjust=wrap[0]
call wrap[1]()
return
endfunction
" this is called from ftplugin scripts
function LogE_LspDiagShowSignToggle()
if g:lspOpts.showDiagWithSign
let g:lspOpts.showDiagWithSign = v:false
else
let g:lspOpts.showDiagWithSign = v:true
endif
call LspOptionsSet(g:lspOpts)
endfunction
" ================= key mappings ================
" <leader> is , (comma)
" <localleader> is \ (backslash)
let mapleader=","
let maplocalleader="\\"
" ----------- NORMAL MODE ------------------
" NERDTree*
noremap <leader>tn :NERDTreeToggle<CR>
noremap <leader>fn :NERDTreeFocus<CR>
noremap <leader>n :NERDTreeFocus<CR>
" rotate through color adjustments
noremap <leader>ta :call LogE_ColorAdjust_Rotate()<CR>
" line numbers toggle
noremap <F3> :call LogE_ToggleRelative()<CR>
" grep current word
noremap <leader>gcw :call LogE_GrepAskForDir(expand("<cword>"))<CR>
" set indentation width
noremap <leader>si :call LogE_SetIndentWidth()<CR>
" ------------- VISUAL MODE ---------------
" Searching for visually selected text
vnoremap // y/<C-R>"<CR>"
" ------------- INSERT MODE ---------------
inoremap <F3> <F3>:call LogE_ToggleRelative()<CR>