Created
October 5, 2018 11:56
-
-
Save darkwater/39406d6022dd840c86366cd80f1f66a9 to your computer and use it in GitHub Desktop.
Neovim config
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"" | |
"" Darkwater's Neovim configuration | |
"" | |
" Plugins {{{ | |
call plug#begin() | |
" UI plugins | |
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } | |
Plug 'majutsushi/tagbar', { 'on': 'Tagbar' } | |
" Plug 'albfan/nerdtree-git-plugin' | |
Plug 'junegunn/fzf' | |
Plug 'junegunn/fzf.vim' | |
Plug 'kshenoy/vim-signature' | |
" Git helpers | |
Plug 'tpope/vim-fugitive' | |
Plug 'airblade/vim-gitgutter' | |
" Format/syntax helpers | |
Plug 'tpope/vim-commentary' | |
Plug 'benekastah/neomake' | |
Plug 'godlygeek/tabular' | |
" Specific language enhancers | |
Plug 'lervag/vimtex', { 'for': 'tex' } | |
Plug 'ap/vim-css-color' | |
Plug 'Quramy/tsuquyomi' | |
Plug 'Shougo/vimproc.vim', { 'do': 'make' } | |
" Miscellaneous shit | |
Plug 'autozimu/LanguageClient-neovim', { 'branch': 'next', 'do': 'bash install.sh' } | |
" Plug 'roxma/nvim-completion-manager', { 'do': ':UpdateRemotePlugins' } | |
Plug 'moll/vim-bbye' | |
Plug 'Shougo/echodoc.vim' | |
" Extra syntax support | |
Plug 'cespare/vim-toml' | |
Plug 'darkwater/kotlin-vim' | |
Plug 'elixir-editors/vim-elixir' | |
Plug 'groenewege/vim-less' | |
" Plug 'hail2u/vim-css3-syntax' | |
Plug 'mboughaba/i3config.vim' | |
Plug 'octol/vim-cpp-enhanced-highlight' | |
Plug 'othree/html5.vim' | |
Plug 'peterhoeg/vim-qml' | |
Plug 'rust-lang/rust.vim' | |
Plug 'tfnico/vim-gradle' | |
Plug 'tikhomirov/vim-glsl' | |
Plug 'jdonaldson/vaxe' | |
" Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' } | |
Plug 'plasticboy/vim-markdown' | |
Plug 'pangloss/vim-javascript' | |
" Plug 'mxw/vim-jsx' | |
Plug 'leafgarland/typescript-vim' | |
Plug 'maxmellon/vim-jsx-pretty' | |
Plug 'peter-edge/vim-capnp' | |
" Plug '~/projects/agitated/' | |
call plug#end() | |
" }}} | |
" Settings {{{ | |
set cursorline | |
set hidden | |
set hlsearch | |
set ignorecase | |
set incsearch | |
set list | |
set noshowmode | |
set nowrap | |
set number | |
set ruler | |
set showcmd | |
set smartcase | |
set splitbelow | |
set splitright | |
set termguicolors | |
set title | |
set undofile | |
set wildmenu | |
set fillchars= | |
set listchars= | |
set background=dark | |
set backspace=start,eol,indent | |
set backup | |
set backupdir=~/.local/share/nvim/backup | |
set cmdheight=1 | |
set completeopt=menu,longest,noselect | |
set encoding=utf8 | |
set fillchars+=fold:═ | |
set fillchars+=vert:▌ | |
" set foldclose=all | |
set foldcolumn=0 | |
set foldenable | |
set foldlevel=0 | |
set foldmethod=marker | |
" set foldopen=all | |
set foldtext='═══'.substitute(substitute(getline(v:foldstart),'/\\*\\\|\\*/\\\|\"\ \\\|{{'.'{\\d\\=','','g'),'^\ *\\\|\ *$','\ ','g') | |
set guicursor=n-v-c-sm:block,i-ci-ve:ver25,r-cr-o:hor20 | |
set history=1000 | |
set inccommand=nosplit | |
set iskeyword=@,48-57,_,192-255 | |
set laststatus=2 | |
set listchars+=extends:+ | |
set listchars+=nbsp:% | |
set listchars+=precedes:+ | |
set listchars+=tab:┃· | |
set listchars+=trail:# | |
set mouse=a | |
set numberwidth=6 | |
set pastetoggle=<F11> | |
set scrolloff=5 | |
set showtabline=2 | |
set sidescroll=5 | |
set statusline= | |
set switchbuf+=useopen | |
set tabline=%!Bufman_Tabline() | |
set tags+=.tags | |
set textwidth=120 | |
set timeoutlen=800 | |
set undolevels=1000 | |
set updatetime=1500 | |
set viewoptions=cursor | |
set wildchar=<Tab> | |
set wildmode=longest,list | |
set winminwidth=20 | |
set winwidth=80 | |
" Indentation | |
set autoindent | |
set expandtab | |
set shiftwidth=4 | |
set tabstop=4 | |
colors tomorrow-night | |
nohlsearch | |
syntax on | |
filetype plugin indent on | |
let $VISUAL = 'nvr -l -c "au BufDelete <buffer> call ReturnToTerminal()" --remote-wait' | |
let $TERM_IN_NVIM = 'yes' | |
" }}} | |
" Plugin configuration {{{ | |
let g:LanguageClient_autoStart = 1 | |
let g:LanguageClient_serverCommands = { | |
\ 'c': [ 'cquery' ], | |
\ 'cpp': [ 'cquery' ], | |
\ 'go': [ 'go-langserver' ], | |
\ 'rust': [ 'rustup', 'run', 'nightly', 'rls' ], | |
\ 'scss': [ 'css-languageserver', '--stdio' ], | |
\ } | |
let g:LanguageClient_diagnosticsDisplay = { | |
\ 1: { | |
\ "name": "Error", | |
\ "texthl": "LSPError", | |
\ "signText": "E", | |
\ "signTexthl": "LSPErrorSign", | |
\ }, | |
\ 2: { | |
\ "name": "Warning", | |
\ "texthl": "LSPWarning", | |
\ "signText": "w", | |
\ "signTexthl": "LSPWarningSign", | |
\ }, | |
\ 3: { | |
\ "name": "Information", | |
\ "texthl": "LSPInfo", | |
\ "signText": "i", | |
\ "signTexthl": "LSPInfoSign", | |
\ }, | |
\ 4: { | |
\ "name": "Hint", | |
\ "texthl": "LSPHint", | |
\ "signText": "h", | |
\ "signTexthl": "LSPHintSign", | |
\ }, | |
\ } | |
" let g:deoplete#enable_at_startup = 1 | |
" let g:deoplete#sources = {} | |
" let g:deoplete#sources._ = ['LanguageClient-neovim'] | |
let g:tsuquyomi_completion_case_sensitive = 1 | |
let g:tsuquyomi_completion_detail = 1 | |
let g:tsuquyomi_completion_preview = 1 | |
let g:racer_experimental_completer = 1 | |
let g:vim_markdown_folding_disabled = 1 | |
let g:go_info_mode = 'guru' | |
" let g:go_auto_sameids = 1 | |
let g:go_fmt_experimental = 1 | |
let g:go_metalinter_autosave = 1 | |
let g:go_list_type = "quickfix" | |
let g:netrw_liststyle = 3 | |
let g:netrw_browse_split = 4 | |
let g:netrw_altv = 1 | |
let g:netrw_winsize = 20 | |
let g:netrw_keepdir = 0 | |
let g:NERDTreeChDirMode = 2 | |
let g:NERDTreeDirArrowExpandable = '+' | |
let g:NERDTreeDirArrowCollapsible = '-' | |
let g:NERDTreeIgnore = [ '\~$', '^_build$', '^deps$' ] | |
let g:NERDTreeShowIgnoredStatus = 1 | |
let g:NERDTreeIndicatorMapCustom = { | |
\ 'Deleted' : 'X', | |
\ 'Modified' : '~', | |
\ 'Renamed' : '>', | |
\ 'Staged' : '=', | |
\ 'Untracked' : '?', | |
\ 'Unmerged' : 'u', | |
\ 'Dirty' : '✗', | |
\ 'Clean' : '✓', | |
\ 'Ignored' : 'i', | |
\ } | |
let g:gitgutter_sign_added = '--' | |
let g:gitgutter_sign_modified = '--' | |
let g:gitgutter_sign_modified_removed = '▁▁' | |
let g:gitgutter_sign_removed = '▁▁' | |
let g:SignatureMarkTextHLDynamic = 1 | |
let g:neomake_error_sign = { 'text': '!!', 'texthl': 'ErrorMsg' } | |
let g:neomake_open_list = 2 " Preserve cursor position when window is opened | |
let g:neomake_list_height = 8 | |
let g:ctrlp_cmd = 'CtrlPCurWD' | |
let g:tex_flavor = 'latex' | |
let g:vimtex_enabled = 1 | |
" }}} | |
" Autocmds {{{ | |
augroup Vimrc | |
autocmd! | |
" Cursor line highlighting in ruby is slow as hell :< | |
autocmd BufNewFile,BufRead,BufEnter *.rb set nocursorline | |
" Don't wrap code in shell files | |
autocmd BufRead *.sh setlocal formatoptions-=t | |
" Only show cursorline in active buffers | |
autocmd WinEnter * setlocal cursorline | |
autocmd WinLeave * setlocal nocursorline | |
" Linting | |
" autocmd BufReadPost,BufEnter,BufWritePost * Neomake | |
" Save and load view data (cursor position, folds, see viewoptions) | |
" autocmd BufWinLeave * silent! mkview | |
" autocmd BufWinEnter * silent! loadview | |
" Go to last cursor position when opening a file | |
autocmd BufReadPost * | |
\ if line("'\"") > 1 && line("'\"") <= line("$") && &ft !~# 'commit' | |
\ | exe "normal! g`\"" | |
\ | endif | |
" Use language server completion for supported filetypes | |
autocmd BufNewFile,BufRead,BufEnter * call TryLSOmni() | |
autocmd BufWritePre *.go GoImports | |
" Terminal things | |
autocmd WinEnter,BufEnter * if &buftype ==# 'terminal' | startinsert | endif | |
autocmd TermOpen * setlocal nonumber | startinsert | |
" autocmd TermOpen * if !exists("g:main_terminal_bufnr") | |
" autocmd TermOpen * let g:main_terminal_bufnr = bufnr("") | |
" autocmd TermOpen * let g:main_terminal_jobid = b:terminal_job_id | |
" autocmd TermOpen * endif | |
" Follow terminal's cwd | |
" autocmd DirChanged * NERDTreeCWD | |
autocmd VimResized * call EnforceTerminalSize() | |
autocmd TermOpen *#FZF set laststatus=0 | |
autocmd TermClose *#FZF set laststatus=2 | |
autocmd FileType qf call OnQuickFixOpen() | |
autocmd BufEnter * call CustomStatusLine_Update() | |
autocmd WinNew * call CustomStatusLine_Update() | |
autocmd WinEnter * call CustomStatusLine_Update() | |
autocmd WinLeave * call CustomStatusLine_Update() | |
autocmd QuickFixCmdPost * call CustomStatusLine_Update() | |
autocmd CursorHold * call CustomStatusLine_Update() | |
autocmd FileType qf call CustomStatusLine_Update() | |
autocmd BufAdd * call Bufman_AddBuffer(expand('<afile>')) | |
autocmd BufRead * call Bufman_AddBuffer(expand('<afile>')) | |
autocmd BufDelete * call Bufman_CheckListed() | |
autocmd BufUnload * call Bufman_CheckListed() | |
autocmd OptionSet buflisted call Bufman_CheckListed() | |
augroup end | |
function! Bufman_Init() | |
if !exists("g:bufman_list") | |
let g:bufman_list = [] | |
endif | |
if bufname('') != '' | |
call Bufman_AddBuffer(bufname('')) | |
endif | |
let l:shifted = [ '', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')' ] | |
for n in range(1, 9) | |
execute 'nnoremap <silent> <A-'.n.'> :<C-u>call Bufman_SwitchTo('.n.')<CR>' | |
execute 'nnoremap <silent> <A-'.l:shifted[n].'> :<C-u>call Bufman_MoveTo('.n.')<CR>' | |
endfor | |
endfunction | |
function! Bufman_NormalizeName(bufname) | |
let l:bufname = substitute(a:bufname, $HOME, '~', '') | |
return l:bufname | |
endfunction | |
function! Bufman_CheckListed(...) | |
let l:index = 0 | |
for [ bnr, _ ] in g:bufman_list | |
if !getbufvar(l:bnr, '&buflisted') | |
call remove(g:bufman_list, l:index) | |
continue " dont increment l:index | |
endif | |
let l:index += 1 | |
endfor | |
endfunction | |
function! Bufman_AddBuffer(bufname) | |
let l:bufname = a:bufname | |
let l:bufnr = bufnr(l:bufname) | |
if !&buflisted | |
return | |
endif | |
if l:bufname == '' | |
return | |
endif | |
if !buflisted(l:bufnr) | |
return | |
endif | |
for [ bnr, _ ] in g:bufman_list | |
if l:bufnr == l:bnr | |
return | |
endif | |
endfor | |
let l:bufname = substitute(l:bufname, $HOME, '~', '') | |
call add(g:bufman_list, [ l:bufnr, l:bufname ]) | |
endfunction | |
function! Bufman_SwitchTo(index) | |
if len(g:bufman_list) < a:index | |
return | |
endif | |
let [ bufnr, _ ] = g:bufman_list[a:index - 1] | |
execute l:bufnr . 'buffer' | |
endfunction | |
function! Bufman_MoveTo(index) | |
if len(g:bufman_list) < a:index | |
return | |
endif | |
let l:index = 0 | |
for [ bnr, bname ] in g:bufman_list[0:8] | |
if bufnr('%') == l:bnr | |
break | |
endif | |
let l:index += 1 | |
endfor | |
if len(g:bufman_list) == l:index " buffer not in list | |
return | |
endif | |
let buf = remove(g:bufman_list, l:index) | |
call insert(g:bufman_list, buf, a:index - 1) | |
let &tabline = &tabline " redraw | |
endfunction | |
function! Bufman_DelBuffer() | |
let l:bufnr = bufnr('<afile>') | |
" if &modified | |
" echomsg 'buffer modified' | |
" return | |
" endif | |
let l:index = 0 | |
for [ bn, _ ] in g:bufman_list | |
if l:bufnr == l:bn | |
call remove(g:bufman_list, l:index) | |
" Bdelete! | |
break | |
endif | |
let l:index += 1 | |
endfor | |
endfunction | |
function! Bufman_Tabline() | |
call Bufman_CheckListed() | |
let l:out = '%#TabLine#' | |
let l:index = 0 | |
let l:nrlabel = [ '⒈', '⒉', '⒊', '⒋', '⒌', '⒍', '⒎', '⒏', '⒐' ] | |
for [ bnr, bname ] in g:bufman_list[0:8] | |
if bufnr('%') == l:bnr | |
let l:hl = '%#TabLineCurrent#' | |
else | |
let l:hl = '%#TabLine#' | |
endif | |
if getbufvar(l:bnr, '&modified') | |
let l:out .= ' %#TabLineModified#' . l:nrlabel[l:index] . ' ' . l:hl . ' ' | |
else | |
let l:out .= ' ' . l:hl . l:nrlabel[l:index] . ' ' . l:hl . ' ' | |
endif | |
let l:out .= l:bname | |
let l:out .= ' ' | |
let l:index += 1 | |
endfor | |
let l:out .= " %= %#TabLineMuted#" | |
let l:terms = systemlist('tmux -uS "'.Tmuxdir().'" list-windows') | |
if l:terms[0] !~ '^no server\|^error connecting' | |
let l:out .= "{".len(l:terms)."} " | |
endif | |
if exists("$SSH_CONNECTION") | |
let l:out .= "dark-desktop:" | |
endif | |
let l:out .= substitute(getcwd(), $HOME, "~", "") | |
return l:out | |
endfunction | |
call Bufman_Init() | |
" }}} | |
" Mappings {{{ | |
let mapleader = "\<Space>" | |
let maplocalleader = mapleader | |
" Fix delete in st | |
map <F1> <Del> | |
cmap <F1> <Del> | |
nnoremap \ : | |
vnoremap \ : | |
inoremap <expr> <Enter> InsertEnterWrapper() | |
inoremap <expr> <Tab> InsertTabWrapper() | |
inoremap <silent> <S-Tab> <C-p> | |
inoremap <silent> <Home> <C-o>^ | |
nnoremap <silent> <Home> ^ | |
vnoremap <silent> <Home> ^ | |
inoremap <silent> <C-c> <Esc> | |
vnoremap <silent> <C-c> <Esc> | |
nnoremap <silent> <C-s> :<C-u>w<bar>set cmdheight=1<CR> | |
inoremap <silent> <C-s> <Esc>:w<bar>set cmdheight=1<CR> | |
nnoremap <silent> <A-Tab> :call AltTab()<CR> | |
inoremap <silent> <A-Tab> <C-c>:call AltTab()<CR> | |
tnoremap <silent> <A-Tab> <C-\><C-n>:call AltTab()<CR> | |
nnoremap <silent> <A-h> <C-w>h | |
nnoremap <silent> <A-j> <C-w>j | |
nnoremap <silent> <A-k> <C-w>k | |
nnoremap <silent> <A-l> <C-w>l | |
nnoremap <silent> <BS> :<C-u>nohlsearch<CR><C-W>z | |
nnoremap <silent> <C-j> :<C-u>bp<CR> | |
nnoremap <silent> <C-k> :<C-u>bn<CR> | |
nnoremap <silent> [q :<C-u>cp<CR> | |
nnoremap <silent> ]q :<C-u>cn<CR> | |
nnoremap <silent> <PageDown> <C-d> | |
nnoremap <silent> <PageUp> <C-u> | |
nnoremap <silent> Y y$ | |
nnoremap <silent> Q q: | |
nnoremap <silent> <A-`> <C-^> | |
inoremap <silent> <A-`> <C-c><C-^> | |
nnoremap <silent> <A-o> o<Esc> | |
nnoremap <silent> <A-O> O<Esc> | |
nnoremap <silent> <A-c> cc<Esc> | |
" TEMP: replace arguments | |
nnoremap <expr> s ((getline('.')[col('.')-1:] =~ '^${\d\+:\h\+}') ? 'cf}' : 's') | |
nnoremap <expr> ; ((getline('.') =~ '${\d\+:\h\+}') ? 'f$' : ';') | |
nnoremap <expr> , ((getline('.') =~ '${\d\+:\h\+}') ? 'F$' : ',') | |
au FileType * syntax match CompletionArgument /${\d\+:\h\+}/ contains=CompletionArgumentName | |
" au FileType * syntax match CompletionArgumentName /\h\+/ containedin=CompletionArgument contained | |
inoremap <silent> {<CR> {<CR>}<C-o>O | |
inoremap <silent> [<CR> [<CR>]<C-o>O | |
inoremap <silent> (<CR> (<CR>);<C-o>O | |
inoremap <silent> ({<CR> ({<CR>});<C-o>O | |
nnoremap <silent> <C-Space> :<C-u>call ToggleTerminal()<CR> | |
inoremap <silent> <C-Space> <C-c>:call ToggleTerminal()<CR> | |
tnoremap <silent> <C-Space> <C-\><C-n>:call ToggleTerminal()<CR> | |
nnoremap <silent> <A-Space> :<C-u>call RepeatTerminal()<CR> | |
inoremap <silent> <A-Space> <C-c>:call RepeatTerminal()<CR> | |
" LSP features | |
nnoremap <silent> ga :<C-u>call LanguageClient_textDocument_codeAction()<CR> | |
nnoremap <silent> gd :<C-u>call LanguageClient_textDocument_definition()<CR> | |
nnoremap <silent> gh :<C-u>call Dark_LanguageClient_textDocument_hover()<CR> | |
nnoremap <silent> gr :<C-u>call LanguageClient_textDocument_rename()<CR> | |
nnoremap <silent> gt :<C-u>call LanguageClient_textDocument_documentSymbol()<CR> | |
nnoremap <silent> <leader>ga ga | |
nnoremap <silent> <leader>gd gd | |
nnoremap <silent> <leader>gh gh | |
nnoremap <silent> <leader>gr gr | |
nnoremap <silent> <leader>gt gt | |
augroup tsserver | |
autocmd! | |
autocmd FileType typescript | |
\ nnoremap <buffer> <silent> ga :<C-u>TsuQuickFix<CR> | |
\ | nnoremap <buffer> <silent> gd :<C-u>TsuDefinition<CR> | |
\ | nnoremap <buffer> <silent> gr :<C-u>TsuRenameSymbol<CR> | |
augroup end | |
nnoremap <silent> <leader>sip !ipsort<CR> | |
" Cargo | |
nnoremap <silent> <leader>cb :<C-u>Cargo build<CR> | |
nnoremap <silent> <leader>cd :<C-u>Cargo open-doc<CR><CR> | |
nnoremap <silent> <leader>ce :<C-u>e Cargo.toml<CR> | |
nnoremap <silent> <leader>cr :<C-u>Cargo run<CR> | |
nnoremap <silent> <leader>cv 0"cyt f=C= <Esc>:r! cargo-latest-version <C-R>c<CR>kA"<Esc>gJA"<Esc> | |
" Errors | |
nnoremap <silent> <leader>ee :<C-u>call JumpToError()<CR> | |
nnoremap <silent> <leader>eo :<C-u>copen<CR> | |
nnoremap <silent> <leader>ec :<C-u>cclose<CR> | |
nnoremap <silent> <leader>e[ :<C-u>cNext<CR> | |
nnoremap <silent> <leader>e] :<C-u>cnext<CR> | |
" File | |
nnoremap <silent> <leader>fd :!rm %<CR> | |
nnoremap <silent> <leader>fr :call RenameFile()<CR> | |
" ix | |
nnoremap <leader>ix :w !ix<CR> | |
" NERDTree | |
nnoremap <silent> <leader>nt :<C-u>NERDTreeToggle<CR> | |
" Buffer | |
nnoremap <silent> <leader>q :<C-u>Bdelete<CR> | |
nnoremap <silent> <leader>Q :<C-u>Bdelete!<CR> | |
nnoremap <silent> <A-q> :<C-u>Bdelete<CR> | |
nnoremap <silent> <A-Q> :<C-u>Bdelete!<CR> | |
" nnoremap <silent> <leader>q :<C-u>call Bufman_DelBuffer(0)<CR> | |
" nnoremap <silent> <leader>Q :<C-u>call Bufman_DelBuffer(1)<CR> | |
" FZF | |
nnoremap <expr> <leader>sg (':<C-u>Rg ' . input("Search: ") . '<CR>') | |
nnoremap <silent> <leader>sF :<C-u>Files<CR> | |
nnoremap <silent> <leader>sb :<C-u>call fzf#run(fzf#wrap('bookmarks', {'source': 'cat ~/.config/nvim/bookmarks.txt'}, 0))<CR> | |
nnoremap <silent> <leader>sf :<C-u>GFiles<CR> | |
nnoremap <silent> <leader>sh :<C-u>History<CR> | |
nnoremap <silent> <leader>sl :<C-u>Lines<CR> | |
nnoremap <silent> <leader>sp :<C-u>call fzf#run(fzf#wrap('projects', {'source': 'cat ~/.config/nvim/projects.txt', 'sink': 'cd'}, 0))<CR> | |
" Tabularize | |
noremap <silent> <leader>t, :Tabularize /,\zs /l0<CR> | |
noremap <silent> <leader>t. :Tabularize /=>\\|-><CR> | |
noremap <silent> <leader>t: :Tabularize /^[^:]*:\zs /l0<CR> | |
noremap <silent> <leader>t; :Tabularize /^[^:]*:\zs /l0<CR> | |
noremap <silent> <leader>t= :Tabularize /^[^=]* \zs=\ze <CR> | |
noremap <silent> <leader>t\ :Tabularize /<bar><CR> | |
" Vim debugging | |
nnoremap <silent> <leader>vh :<C-u>echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") | |
\ . '> trans<' . synIDattr(synID(line("."),col("."),0),"name") | |
\ . "> lo<" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">"<CR> | |
" }}} | |
" Abbreviations {{{ | |
iab _rpl println!("{:?}", | |
iab _rple println!("{:#?}", | |
" }}} | |
" File transforms {{{ | |
augroup Binary | |
autocmd! | |
autocmd BufReadPre *.bin let &bin=1 | |
autocmd BufReadPost *.bin if &bin | %!xxd | set ft=xxd | endif | |
autocmd BufWritePre *.bin if &bin | %!xxd -r | endif | |
autocmd BufWritePost *.bin if &bin | %!xxd | set nomod | endif | |
augroup end | |
" }}} | |
" Functions {{{ | |
" Custom tab line function | |
function! CustomTabLine() " {{{ | |
let s = '%#TabLine# ' | |
let numtabs = tabpagenr('$') | |
if numtabs > 1 | |
let s .= numtabs . ' tabs! (Only one supported) ' | |
endif | |
let listedbufs = {} | |
let listedbufi = 1 | |
for n in filter(range(1, bufnr('$')), 'buflisted(v:val)') | |
let listedbufs[n] = listedbufi | |
let listedbufi += 1 | |
" TODO: Handle cases > 9 | |
let leftbound = '' | |
let rightbound = ' ' | |
let bufname = substitute(bufname(n), $HOME, '~', '') | |
if bufname =~ '^term://' | |
let hilight = (n == bufnr('')) ? '%#TabLineActiveShell#' : '%#TabLineInactiveShell#' | |
let s .= hilight . leftbound . split(bufname, ":")[2] . rightbound . '%#TabLine#' | |
else | |
let dirpath = substitute(bufname, '[^/]\+/\?$', '', '') | |
let filename = strpart(bufname, strlen(dirpath)) | |
let hilight = (n == bufnr('')) ? '%#TabLineActive#' : '%#TabLineInactive#' | |
let hilightbold = (n == bufnr('')) ? '%#TabLineActiveBold#' : '%#TabLineInactiveBold#' | |
let indicator = (getbufvar(n, '&modified')) ? '%#TabLineModified#! ' : '' | |
let s .= hilightbold . leftbound . indicator . hilight . dirpath . hilightbold . filename . rightbound . '%#TabLine# ' | |
endif | |
endfor | |
" Set up maps to jump to buffer with Alt + number | |
" TODO: This should probably go somewhere else | |
if len(listedbufs) > 0 | |
if has_key(listedbufs, bufnr('')) | |
let curbufnr = listedbufs[bufnr('')] | |
else | |
let curbufnr = 0 | |
endif | |
" Previous buffers | |
for n in filter(range(1, bufnr('') - 1), 'buflisted(v:val)') | |
if has_key(listedbufs, n) | |
let d = curbufnr - listedbufs[n] | |
execute 'nnoremap <buffer> <A-' . listedbufs[n] . '> :' . d . 'bp<CR>' | |
execute 'inoremap <buffer> <A-' . listedbufs[n] . '> <C-c>:' . d . 'bp<CR>' | |
endif | |
endfor | |
" Unmap current | |
execute 'nnoremap <buffer> <A-' . curbufnr . '> <Nop>' | |
execute 'inoremap <buffer> <A-' . curbufnr . '> <Nop>' | |
" Next buffers | |
for n in filter(range(bufnr('') + 1, bufnr('$')), 'buflisted(v:val)') | |
if has_key(listedbufs, n) | |
let d = listedbufs[n] - curbufnr | |
execute 'nnoremap <buffer> <A-' . listedbufs[n] . '> :' . d . 'bn<CR>' | |
execute 'inoremap <buffer> <A-' . listedbufs[n] . '> <C-c>:' . d . 'bn<CR>' | |
endif | |
endfor | |
endif | |
return s | |
endfunction " }}} | |
" Tab completion when appropiate | |
function! InsertTabWrapper() " {{{ | |
if pumvisible() | |
return "\<C-n>" | |
endif | |
if &filetype == 'go' | |
let l:col = col('.') | |
if l:col && getline('.')[l:col-4 : l:col-2] == '// ' | |
let l:nextline = getline(line('.') + 1) | |
let l:match = matchstr(l:nextline, 'func *\((.*)\)\? *\zs\w\+') | |
if !empty(l:match) | |
return l:match | |
endif | |
endif | |
endif | |
let l:col = col('.') - 1 | |
if !l:col || getline('.')[l:col - 1] !~ '\S' | |
return "\<Tab>" | |
else | |
return "\<C-x>\<C-o>" | |
endif | |
endfunction " }}} | |
" Select current pum item, or insert newline when no pum visible | |
function! InsertEnterWrapper() " {{{ | |
if pumvisible() | |
return "\<C-y>" | |
endif | |
return "\<Enter>" | |
endfunction " }}} | |
" Rename current file | |
function! RenameFile() " {{{ | |
let old_name = expand('%') | |
let new_name = input('New file name: ', expand('%'), 'file') | |
if new_name != '' && new_name != old_name | |
exec ':saveas ' . new_name | |
edit # | |
Bdelete | |
exec ':silent !rm ' . old_name | |
redraw! | |
endif | |
endfunction " }}} | |
" Use language server completion for supported filetypes | |
function! TryLSOmni() " {{{ | |
if has_key(g:LanguageClient_serverCommands, &filetype) && &filetype != 'go' | |
setlocal omnifunc=LanguageClient#complete | |
end | |
endfunction " }}} | |
" Change working directory in a terminal buffer | |
function! TerminalCD(cwd) " {{{ | |
call jobsend(g:last_terminal_jobid, ' cd-silent ' . a:cwd . ' | |
') | |
endfunction " }}} | |
" Alt-tab to switch windows | |
function! AltTab() " {{{ | |
if winnr('$') == 2 | |
wincmd w | |
else | |
wincmd p | |
endif | |
if exists('b:terminal_job_id') | |
startinsert | |
endif | |
endfunction " }}} | |
" Switch to main shell and back | |
function! ToggleTerminal() " {{{ | |
if exists('g:toggle_terminal_bufid') | |
let winnr = bufwinnr(g:toggle_terminal_bufid) | |
if winnr > -1 | |
execute winnr . 'quit' | |
else | |
if winwidth('') > winheight('') * 3 | |
100vsplit | |
else | |
20split | |
endif | |
silent execute g:toggle_terminal_bufid . 'buffer' | |
let g:toggle_terminal_bufid = bufnr('') | |
wincmd < | |
wincmd > | |
startinsert | |
endif | |
else | |
let term = { 'name': 'termpopup' } | |
function! term.on_exit(id, code, event) | |
keepalt bdelete! | |
unlet g:toggle_terminal_bufid | |
unlet g:toggle_terminal_jobid | |
endfunction | |
if winwidth('') > winheight('') * 3 | |
100vnew | |
else | |
20new | |
endif | |
setlocal nobuflisted | |
call termopen('tmux -uS "'.Tmuxdir().'" attach', term) | |
let g:toggle_terminal_bufid = bufnr('') | |
let g:toggle_terminal_jobid = b:terminal_job_id | |
endif | |
endfunction " }}} | |
" Repeat the last command executed in the terminal | |
function! RepeatTerminal() " {{{ | |
if exists('g:toggle_terminal_jobid') | |
call jobsend(g:toggle_terminal_jobid, "\e[A\n") | |
endif | |
endfunction " }}} | |
" Custom LanguageClient_textDocument_hover and helpers | |
function! Dark_LanguageClient_textDocument_hover() " {{{ | |
call LanguageClient_textDocument_hover({}, 'Dark_LanguageClient_textDocument_hover_cb') | |
endfunction | |
function! Dark_LanguageClient_textDocument_hover_cb(r) | |
if has_key(a:r, 'error') | |
echo a:r['error']['message'] | |
return | |
endif | |
if type(a:r['result']) == type(v:null) || type(a:r['result']['contents']) == type(v:null) | |
echo "empty result" | |
return | |
end | |
let l:contents = [] | |
for item in a:r['result']['contents'] | |
if type(item) == v:t_string | |
let l:contents += split(item, "\n") | |
else | |
call add(l:contents, '``` ' . item['language']) | |
let l:contents += split(item['value'], "\n") | |
call add(l:contents, '```') | |
endif | |
endfor | |
call writefile(l:contents, '/tmp/nvim-preview.md') | |
silent pedit! +e\|call\ Dark_LanguageClient_textDocument_hover_init() /tmp/nvim-preview.md | |
endfunction | |
function! Dark_LanguageClient_textDocument_hover_init() | |
setlocal scrolloff=0 buftype=nofile nobuflisted noswapfile nonumber nocursorline | |
let b:preview_window = 1 | |
map <buffer> <silent> <2-LeftMouse> :call jobstart([ 'xdg-open', expand('<cWORD>') ])<CR> | |
let l:top_code = getline(1)[0:2] == '```' | |
let l:bot_code = getline('$')[0:2] == '```' | |
let l:height_offset = l:top_code + l:bot_code | |
execute min([ &previewheight, line('$') - l:height_offset ]) . "wincmd _" | |
1 | |
if l:top_code | |
execute "normal \<C-e>" | |
endif | |
endfunction " }}} | |
function! CustomStatusLine_Update() | |
for n in range(1, winnr('$')) | |
call setwinvar(n, "&statusline", "%!CustomStatusLine(".n.")") | |
endfor | |
endfunction | |
" Custom status line function | |
function! CustomStatusLine(winnr) abort | |
let s = "" | |
let bufnr = winbufnr(a:winnr) | |
if getbufvar(bufnr, "&buftype") == "terminal" | |
let lswin = system('tmux -uS "'.Tmuxdir().'" list-windows') | |
for win in split(lswin, "\n") | |
let [ nr, name; _ ] = split(win, " ") | |
let flags = '' | |
while name =~ '\*$\|-$\|\#$\|!$\|\~$' | |
let flags .= name[len(name)-1] | |
let name = name[0:len(name)-2] | |
endwhile | |
if flags =~ '!' | |
let s .= '%#StatusLineAttention#' | |
elseif flags =~ '*' | |
let s .= '%#StatusLineTermHigh#' | |
else | |
let s .= '%#StatusLineFadeout#' | |
endif | |
let s .= ' ['.name.']' | |
endfor | |
let s .= " %= %<" | |
let s .= " %#StatusLineTerm#" . getbufvar(bufnr, "term_title") | |
let s .= " " | |
elseif getbufvar(bufnr, "preview_window") | |
let s .= '%#StatusLineNone#' | |
elseif getbufvar(bufnr, "&filetype") == "gitprojects" | |
let s .= '%#StatusLineNone#' | |
elseif getbufvar(bufnr, "&buftype") == "nofile" | |
let s .= ' %#StatusLineFadeout#%y ' | |
elseif getbufvar(bufnr, "&buftype") == "quickfix" | |
let s .= '%#StatusLineNone#' | |
else | |
let errors = getqflist() | |
call filter(errors, { _, e -> e["bufnr"] == bufnr && e["type"] == "E" }) | |
let numerrors = len(errors) | |
if numerrors > 0 | |
let s .= " %#StatusLineError#[" . numerrors . "]" | |
else | |
let warnings = getqflist() | |
call filter(warnings, { _, e -> e["bufnr"] == bufnr && e["type"] == "W" }) | |
let numwarnings = len(warnings) | |
if numwarnings > 0 | |
let s .= " %#StatusLineWarning#[" . numwarnings . "]" | |
endif | |
endif | |
let s .= " %#StatusLineEditor#%t" | |
let s .= " %#StatusLineFadeout#%y%( %m%)" | |
let s .= "%=" | |
let s .= " %#StatusLineEditor#%4l%#StatusLineFadeout#l" | |
let s .= " %#StatusLineEditor#%3c%#StatusLineFadeout#c" | |
let s .= " %#StatusLineEditor#%3p%#StatusLineFadeout#%%" | |
let s .= " " | |
endif | |
return s | |
endfunction | |
function! Tmuxdir() | |
return '/tmp/nvim-tmux-' . substitute(getcwd(), '/', '%', 'g') . '.sock' | |
endfunction | |
function! OnQuickFixOpen() | |
setlocal nonumber wrap | |
wincmd J | |
let l:lines = line("$") | |
for n in range(1, l:lines) | |
if len(getline(n)) > winwidth('') | |
let l:lines += 1 | |
endif | |
endfor | |
execute max([min([l:lines, 10]), 1]) . "wincmd _" | |
stopinsert | |
endfunction | |
function! ReturnToTerminal() | |
if exists('g:toggle_terminal_bufid') | |
let winnr = bufwinnr(g:toggle_terminal_bufid) | |
if winnr > -1 | |
execute winnr . 'wincmd w' | |
startinsert | |
endif | |
endif | |
endfunction | |
function! EnforceTerminalSize() | |
if exists('g:toggle_terminal_bufid') | |
let winnr = bufwinnr(g:toggle_terminal_bufid) | |
if winnr > -1 | |
let currentWindow = winnr() | |
execute winnr . 'windo 100wincmd |' | |
execute currentWindow . "wincmd w" | |
if winwidth(winnr) < 100 | |
execute winnr . 'quit' | |
endif | |
endif | |
endif | |
if exists('g:NERDTree') | |
let winnr = g:NERDTree['GetWinNum']() | |
if winnr > -1 | |
let currentWindow = winnr() | |
execute winnr . 'windo ' . g:NERDTreeWinSize . 'wincmd |' | |
execute currentWindow . "wincmd w" | |
if winwidth(winnr) < g:NERDTreeWinSize | |
execute winnr . 'quit' | |
endif | |
endif | |
endif | |
endfunction | |
function! JumpToError() | |
let bufnr = bufnr('%') | |
let errors = getqflist() | |
call filter(errors, { _, e -> e["bufnr"] == bufnr && e["type"] == "E" }) | |
let numerrors = len(errors) | |
if numerrors > 0 | |
let error = errors[0] | |
let &cmdheight = len(split(error["text"], "\n")) | |
echo error["text"] | |
call cursor(error["lnum"], error["col"]) | |
else | |
let warnings = getqflist() | |
call filter(warnings, { _, e -> e["bufnr"] == bufnr && e["type"] == "W" }) | |
let numwarnings = len(warnings) | |
if numwarnings > 0 | |
let warning = warnings[0] | |
let &cmdheight = len(split(warning["text"], "\n")) | |
echo warning["text"] | |
call cursor(warning["lnum"], warning["col"]) | |
endif | |
endif | |
endfunction | |
" }}} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment