Skip to content

Instantly share code, notes, and snippets.

@keevie
Last active June 11, 2026 12:06
Show Gist options
  • Select an option

  • Save keevie/e95786c0c794f3e2c11f10c995ade754 to your computer and use it in GitHub Desktop.

Select an option

Save keevie/e95786c0c794f3e2c11f10c995ade754 to your computer and use it in GitHub Desktop.
" Neovim Configuration
" Install vim-plug if not present:
" curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
" Then open nvim and run :PlugInstall
" =============================================================================
" General Settings
" =============================================================================
set clipboard=unnamed
set updatetime=300
set shortmess+=c
set linebreak
set incsearch
set scrolloff=5
set tabstop=2 softtabstop=2 shiftwidth=2 expandtab
set ignorecase
set smartcase
set termguicolors
set omnifunc=syntaxcomplete#Complete
set lazyredraw
set iskeyword+=-
set foldcolumn=1
set cinoptions=l1
set noswapfile
set undofile
set undodir=$HOME/.local/share/nvim/undodir
set backupdir=$HOME/.local/share/nvim/backup,.
set directory=$HOME/.local/share/nvim/swap,.
set laststatus=2
set modeline
set mouse=a
set wildmode=longest,list,full
set wildmenu
set number
set numberwidth=3
let mapleader = "\<Space>"
" Prevent tar plugin from loading
let g:loaded_tarPlugin = 1
let g:loaded_tar = 1
" =============================================================================
" Plugins
" =============================================================================
call plug#begin('~/.local/share/nvim/plugged')
" Colorschemes
Plug 'sonph/onehalf', {'rtp': 'vim/'}
" Navigation & Search
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
Plug 'mileszs/ack.vim'
Plug 'nvim-neo-tree/neo-tree.nvim', { 'branch': 'v3.x' }
Plug 'nvim-lua/plenary.nvim'
Plug 'nvim-tree/nvim-web-devicons'
Plug 'MunifTanjim/nui.nvim'
Plug 'yssl/QFEnter'
" Git
Plug 'tpope/vim-fugitive'
Plug 'tpope/vim-rhubarb'
Plug 'mattn/gist-vim'
Plug 'mattn/webapi-vim'
" Language Support
Plug 'fatih/vim-go'
Plug 'sheerun/vim-polyglot'
Plug 'leafgarland/typescript-vim'
Plug 'posva/vim-vue'
Plug 'sebdah/vim-delve'
" Completion & LSP
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'ervandew/supertab'
Plug 'w0rp/ale'
" Editing
Plug 'tpope/vim-surround'
Plug 'tpope/vim-repeat'
Plug 'tpope/vim-commentary'
Plug 'tpope/vim-unimpaired'
Plug 'tpope/vim-endwise'
Plug 'jiangmiao/auto-pairs'
Plug 'AndrewRadev/splitjoin.vim'
Plug 'godlygeek/tabular'
Plug 'editorconfig/editorconfig-vim'
" UI
Plug 'bling/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'bling/vim-bufferline'
Plug 'junegunn/rainbow_parentheses.vim'
Plug 'Yggdroot/indentLine'
" Utilities
Plug 'tpope/vim-obsession'
Plug 'tpope/vim-eunuch'
Plug 'simnalamburt/vim-mundo'
Plug 'metakirby5/codi.vim'
Plug 'krisajenkins/vim-pipe'
" Ruby/Rails
Plug 'tpope/vim-rails'
Plug 'tpope/vim-bundler'
Plug 'thoughtbot/vim-rspec'
" Snippets
Plug 'honza/vim-snippets'
Plug 'justinj/vim-react-snippets'
Plug 'MarcWeber/vim-addon-mw-utils'
Plug 'tomtom/tlib_vim'
" Tags
Plug 'grassdog/tagman.vim'
call plug#end()
" =============================================================================
" Colorscheme
" =============================================================================
syntax enable
filetype plugin indent on
colorscheme onehalfdark
highlight Pmenu guibg=#282c34
highlight Pmenu guifg=#dcdfe4
" =============================================================================
" Airline
" =============================================================================
let g:airline_theme = 'onehalfdark'
let g:airline_powerline_fonts = 1
let g:airline#extensions#whitespace#checks = []
let g:airline#extensions#ale#enabled = 1
let g:airline_section_c = '%f'
let g:airline_section_y = '%{bufnr("%")}'
let g:airline_section_z = '%l/%L'
" =============================================================================
" Key Mappings
" =============================================================================
" Escape insert mode
inoremap jk <Esc>
" Clear search highlight
nnoremap <leader>n :noh<CR>
" Neo-tree
nnoremap <leader>o :Neotree toggle<CR>
" Splitjoin
nmap sj :SplitjoinSplit<CR>
nmap sk :SplitjoinJoin<CR>
" FZF
nnoremap <Leader><Space> :GFiles<CR>
nnoremap <Leader>b :Buffers<CR>
nnoremap <Leader>a :Ack<Space>
" Buffer navigation
nmap <Leader><Tab> :bn<CR>
" Window navigation
nnoremap J <C-w>j
nnoremap K <C-w>k
nnoremap H <C-w>h
nnoremap L <C-w>l
nnoremap I J
" Command mode shortcut
noremap ; :
" Disable Ex mode
nnoremap Q <Nop>
" Mundo (undo tree)
nnoremap <Leader>u :MundoToggle<CR>
" Reload config
nnoremap <leader>sop :source $MYVIMRC<cr>
" Tabularize
nnoremap <Leader>a= :Tabularize /=<CR>
vnoremap <Leader>a= :Tabularize /=<CR>
nnoremap <Leader>a: :Tabularize /:\zs<CR>
vnoremap <Leader>a: :Tabularize /:\zs<CR>
" Visual search
vnoremap <silent>* <ESC>:call VisualSearch('/')<CR>/<CR>
function! VisualSearch(direction)
let l:register=@@
normal! gvy
let l:search=escape(@@, '$.*/\[]')
if a:direction=='/'
execute 'normal! /'.l:search
else
execute 'normal! ?'.l:search
endif
let @/=l:search
normal! gV
let @@=l:register
endfunction
" =============================================================================
" Plugin Settings
" =============================================================================
" Ack / Ag
let g:ackprg = 'ag --vimgrep --smart-case'
" ALE
let g:ale_sign_error = '✖'
let g:ale_sign_warning = '⚠'
let g:ale_completion_enabled = 1
let g:ale_linters = {
\ 'javascript': ['eslint'],
\ 'sh': ['shellcheck'],
\ 'riot': ['eslint'],
\ 'scss': [],
\}
" Gist
let g:gist_post_anonymous = 1
let g:gist_open_browser_after_post = 1
let g:gist_detect_filetype = 1
" Vue
let g:vue_pre_processors = 'detect_on_enter'
" Markdown
let g:vim_markdown_folding_disabled = 1
let g:vim_markdown_math = 1
let g:vim_markdown_conceal = 0
" vim-move
let g:move_key_modifier = 'C'
" =============================================================================
" COC Configuration
" =============================================================================
" Use system node (will use whatever node is in PATH)
" If you need a specific version, update this path after installing node
" let g:coc_node_path = '/opt/homebrew/bin/node'
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)
nmap <leader>rn <Plug>(coc-rename)
nnoremap <silent> <leader>k :call <SID>show_documentation()<CR>
function! s:show_documentation()
if (index(['vim','help'], &filetype) >= 0)
execute 'h '.expand('<cword>')
elseif (coc#rpc#ready())
call CocActionAsync('doHover')
else
execute '!' . &keywordprg . " " . expand('<cword>')
endif
endfunction
autocmd CursorHold * silent call CocActionAsync('highlight')
" =============================================================================
" Autocommands
" =============================================================================
" Auto-resize splits
autocmd VimResized * wincmd =
" Open quickfix after grep
autocmd QuickFixCmdPost *grep* cwindow
" -----------------------------------------------------------------------------
" Filetype: LaTeX
" -----------------------------------------------------------------------------
augroup ft_tex
autocmd!
autocmd BufEnter *.tex nmap j gj
autocmd BufEnter *.tex nmap k gk
autocmd BufEnter *.tex setlocal shiftwidth=2
autocmd BufEnter *.tex setlocal spell spelllang=en_us
augroup END
" -----------------------------------------------------------------------------
" Filetype: Python
" -----------------------------------------------------------------------------
augroup ft_python
autocmd!
autocmd BufEnter *.py highlight OverLength ctermbg=DarkMagenta ctermfg=white guibg=#592929
autocmd BufEnter *.py match OverLength /\%81v./
autocmd BufEnter *.py setlocal cursorline
autocmd BufEnter *.py setlocal ts=4 sts=4 sw=4
autocmd BufEnter *.py let g:airline#extensions#tabline#enabled = 1
autocmd BufEnter *.py map <buffer> <silent> <F5> :!clear;python3 %<CR>
augroup END
" -----------------------------------------------------------------------------
" Filetype: Ruby
" -----------------------------------------------------------------------------
augroup ft_ruby
autocmd!
autocmd BufEnter *.rb map <buffer> <silent> <F5> :!clear;ruby %<CR>
autocmd BufEnter *.rb highlight OverLength ctermbg=DarkMagenta ctermfg=white guibg=#592929
autocmd BufEnter *.rb match OverLength /\%81v./
autocmd BufEnter *.rb map <buffer> <Leader>s :call RunNearestSpec()<CR>
autocmd BufEnter *.rb map <buffer> <Leader>t :call RunCurrentSpecFile()<CR>
autocmd BufEnter *.rb map <buffer> <Leader>A :call RunAllSpecs()<CR>
augroup END
" -----------------------------------------------------------------------------
" Filetype: JavaScript/TypeScript/Vue
" -----------------------------------------------------------------------------
augroup ft_js
autocmd!
autocmd BufEnter *.js setlocal ts=2 sts=2 sw=2
autocmd BufEnter *.ts setlocal ts=2 sts=2 sw=2
autocmd BufEnter *.vue setlocal ts=2 sts=2 sw=2
autocmd BufEnter *.js map <buffer> <silent> <F5> :!clear;node %<CR>
augroup END
" -----------------------------------------------------------------------------
" Filetype: Markdown
" -----------------------------------------------------------------------------
augroup ft_markdown
autocmd!
autocmd BufEnter *.md setlocal filetype=markdown
autocmd BufEnter *.md setlocal wrap linebreak nolist
autocmd BufEnter *.md nmap <buffer> j gj
autocmd BufEnter *.md nmap <buffer> k gk
augroup END
" -----------------------------------------------------------------------------
" Filetype: HTML
" -----------------------------------------------------------------------------
augroup ft_html
autocmd!
autocmd BufEnter *.html map <buffer> <silent> <F5> :!open %<CR>
augroup END
" =============================================================================
" Neo-tree Setup (Lua)
" =============================================================================
lua << EOF
local ok, neotree = pcall(require, "neo-tree")
if ok then
neotree.setup({
close_if_last_window = true,
filesystem = {
follow_current_file = { enabled = true },
use_libuv_file_watcher = true,
},
window = {
width = 30,
mappings = {
["s"] = "open_vsplit",
["S"] = "open_split",
},
},
})
end
EOF
" =============================================================================
" Highlights
" =============================================================================
highlight Search ctermfg=black ctermbg=lightgreen
highlight ALEErrorSign ctermfg=Red ctermbg=235
highlight ALEWarningSign ctermfg=Yellow ctermbg=235
highlight SpecialKey ctermfg=66 guifg=#649A9A
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment