Skip to content

Instantly share code, notes, and snippets.

@darkwater
Created October 5, 2018 11:56
Show Gist options
  • Save darkwater/39406d6022dd840c86366cd80f1f66a9 to your computer and use it in GitHub Desktop.
Save darkwater/39406d6022dd840c86366cd80f1f66a9 to your computer and use it in GitHub Desktop.
Neovim config
""
"" 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