" vim: set ft=vim set nocompatible set encoding=utf-8 scriptencoding utf-8 " Plugins call plug#begin() Plug 'tpope/vim-commentary' Plug 'tpope/vim-fugitive' Plug 'tpope/vim-surround' Plug 'tpope/vim-repeat' Plug '/opt/homebrew/opt/fzf' Plug 'junegunn/fzf.vim' Plug 'SirVer/ultisnips' Plug 'dense-analysis/ale' Plug 'vim-pandoc/vim-pandoc-syntax' Plug 'quarto-dev/quarto-vim' Plug 'HerringtonDarkholme/yats.vim' Plug 'elixir-editors/vim-elixir' call plug#end() " Language config let g:pandoc#syntax#conceal#use = 0 let g:r_indent_align_args = 0 " Syntax and colors and things filetype plugin indent on syntax on " Disable Swapping set nobackup nowritebackup noswapfile " Statusline set laststatus=2 set statusline=—[%n\:\ %t]—%=—%y—[%l/%L,\ %c]—%m%r— set fillchars=stl:—,eob:\ set fillchars+=stlnc:— set fillchars+=vert:\| " Hide intro message set shortmess=I set nowrap " Relative numbering with absolute anchor set number relativenumber set signcolumn=number set cursorline cursorlineopt=both " Keep buffers open in memory when not visible set hidden " Keep buffers up to date with external changes set autoread set backspace=indent,eol,start " Show invisibles set list set listchars=tab:‣\ ,trail:·,extends:◣,precedes:◢,nbsp:○ " Disable folding set foldmethod=manual set nofoldenable " Search fixes set ignorecase smartcase incsearch hlsearch gdefault " Show incomplete command-based changes in realtime set showcmd " And breathe... set scrolloff=5 " I think left to write, top to bottom set splitright splitbelow " Basic whitespace set nojoinspaces set expandtab set shiftwidth=4 set softtabstop=4 set autoindent " Show me when my lines are too long " " I wish to limit my lines to 80 characters long. However, Vim creates " the n+1th character when you have n characters in a line. Hence, when " my line is 80 characters long, I see the red line. So, this is set to " 82, meaning that I only see the line when my lines actually are too long. call matchadd('ColorColumn', '\%82v', 100) " Mappings etc let mapleader = "\" let localmapleader = "\\" " Use jk to escape back to normal inoremap jk inoremap " Hide search highlights nnoremap :noh nnoremap / :noh " Switch between recent buffers nnoremap " Fix shift-semicolon to write noremap ; : " Make it easier to use registers nnoremap ' " " I should map these to something useful inoremap inoremap inoremap inoremap noremap noremap noremap noremap " Case control nnoremap u viwU nnoremap l viwu " Moving lines around nnoremap - ddp== nnoremap _ :-1dpk== " Quick access vimrc nnoremap ev :tabedit $MYVIMRC nnoremap es :so $MYVIMRC " Pane management nnoremap nnoremap nnoremap nnoremap inoremap inoremap inoremap inoremap " I'm getting back into visual mode " And I'm cycling the modes nnoremap v nnoremap V v nnoremap V " FZF nnoremap o :Files nnoremap b :Buffers nnoremap f :Rg nnoremap g :RG let g:fzf_vim = {} let g:fzf_vim.preview_window = [] function! s:build_quickfix_list(lines) call setqflist(map(copy(a:lines), '{ "filename": v:val, "lnum": 1 }')) copen cc endfunction let g:fzf_action = { \ 'ctrl-q': function('s:build_quickfix_list'), \ 'ctrl-t': 'tab split', \ 'ctrl-x': 'split', \ 'ctrl-v': 'vsplit' } augroup FZF autocmd! autocmd FileType fzf tmap jk augroup END " Focus mode nnoremap z :tabe % " Git blame nnoremap a :Git blame " Make directories in a filename if they don't exist. function! EnsureDirExists () let required_dir = expand("%:h") if !isdirectory(required_dir) try call mkdir( required_dir, 'p' ) catch echom "Could not create directory" exit endtry endif endfunction augroup AutoMkdir autocmd! autocmd BufNewFile * :call EnsureDirExists() augroup END " LSP and other completion let g:ale_completion_enabled = 1 let g:ale_elixir_elixir_ls_release = '/opt/homebrew/opt/elixir-ls/libexec' let g:ale_fix_on_save = 1 let g:ale_fixers = { \ 'css': ['prettier'], \ 'elixir': ['mix_format'], \ 'html': ['prettier'], \ 'javascript': ['prettier'], \ 'javascriptreact': ['prettier'], \ 'md': ['prettier'], \ 'typescript': ['prettier'], \ 'typescriptreact': ['prettier'], \ 'yaml': ['prettier'], \ } let g:ale_linters = { \ 'elixir': ['elixir-ls'], \ 'javascript': ['eslint'], \ } nnoremap za :ALEFirst nnoremap zn :ALENextWrap nnoremap zN :ALEPreviousWrap " File Running function! PreviewQuarto() call ClosePreview() echom 'Starting preview job' let b:file = expand('%') let b:preview_job = job_start( \ ['quarto', 'preview', b:file], \ ) endfunc function! ClosePreview() if exists("b:preview_job") echo 'Killing existing job...' call job_stop(b:preview_job) endif endfunc nnoremap r :echo 'No preview configured' nmap r augroup Previews autocmd! autocmd Filetype quarto nnoremap r :call PreviewQuarto() augroup END augroup TextFormatting autocmd! autocmd FileType make,go setl noet sw=8 sts=8 ts=8 autocmd FileType r,quarto,rmd,elixir setl et sw=2 sts=2 ts=2 augroup END " Show syntax highlighting groups for word under cursor " " This is useful for finding rogue elements I forgot in my colour " scheme. nnoremap \ :call SynStack() function! SynStack() if !exists("*synstack") return endif echo map(synstack(line('.'), col('.')), 'synIDattr(v:val,"name")') endfunc " Open syntax file for current " Syntax highlighting colorscheme mpwb