Created
October 20, 2022 07:46
-
-
Save abdivasiyev/f8b247bbb61da2772863d62ff7ec949a to your computer and use it in GitHub Desktop.
Neovim configuration
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
call plug#begin() | |
Plug 'jiangmiao/auto-pairs' | |
Plug 'preservim/nerdcommenter' | |
Plug 'preservim/tagbar' | |
Plug 'preservim/nerdtree' | |
Plug 'tpope/vim-fugitive' | |
Plug 'fatih/vim-go' | |
Plug 'scrooloose/syntastic' | |
Plug 'fatih/molokai' | |
Plug 'ctrlpvim/ctrlp.vim' | |
Plug 'neoclide/coc.nvim', {'branch': 'release'} | |
Plug 'airblade/vim-gitgutter' | |
Plug 'nvim-lua/plenary.nvim' | |
Plug 'nvim-telescope/telescope.nvim', { 'tag': '0.1.0' } | |
Plug 'ryanoasis/vim-devicons' | |
Plug 'NLKNguyen/papercolor-theme' | |
Plug 'vim-scripts/gruvbox' | |
Plug 'sickill/vim-monokai' | |
Plug 'vim-airline/vim-airline' | |
Plug 'jlanzarotta/bufexplorer' | |
Plug 'MunifTanjim/nui.nvim' | |
Plug 'guysherman/pg.nvim' | |
call plug#end() | |
" let's make sure we are in noncompatble mode | |
set nocp | |
" Sets how many lines of history VIM has to remember | |
set history=700 | |
" Enable filetype plugins | |
filetype plugin on | |
filetype indent on | |
" With a map leader it's possible to do extra key combinations | |
" like <leader>w saves the current file | |
let mapleader = "," | |
let g:mapleader = "," | |
" Fast saving | |
map <Leader>w :w<CR> | |
imap <Leader>w <ESC>:w<CR> | |
vmap <Leader>w <ESC><ESC>:w<CR> | |
" This is totally awesome - remap kj to escape in insert mode. You'll never type jj anyway, so it's great! | |
inoremap kj <esc> | |
vnoremap kj <esc> | |
cnoremap kj <esc> | |
nnoremap JJJJ <nop> | |
"------------------------------------------------------------------------------ | |
" VIM user interface | |
"------------------------------------------------------------------------------ | |
" Make sure that coursor is always vertically centered on j/k moves | |
set so=999 | |
" add vertical lines on columns | |
set colorcolumn=80,120 | |
" Avoid garbled characters in Chinese language windows OS | |
let $LANG='en' | |
set langmenu=en | |
source $VIMRUNTIME/delmenu.vim | |
source $VIMRUNTIME/menu.vim | |
" Turn on the WiLd menu | |
set wildmenu | |
" Set command-line completion mode | |
set wildmode=list:longest,full | |
" Highlight current line - allows you to track cursor position more easily | |
set cursorline | |
" Completion options (select longest + show menu even if a single match is found) | |
set completeopt=longest,menuone | |
" Ignore compiled files | |
set wildignore=*.o,*~,*.pyc | |
if has("win16") || has("win32") | |
set wildignore+=*/.git/*,*/.hg/*,*/.svn/*,*/.DS_Store | |
else | |
set wildignore+=.git\*,.hg\*,.svn\* | |
endif | |
" Show line, column number, and relative position within a file in the status line | |
set ruler | |
" Show line numbers - could be toggled on/off on-fly by pressing F6 | |
set relativenumber | |
" Show (partial) commands (or size of selection in Visual mode) in the status line | |
set showcmd | |
" A buffer becomes hidden when it is abandoned | |
set hid | |
" In many terminal emulators the mouse works just fine, thus enable it. | |
if has('mouse') | |
set mouse=a | |
endif | |
" Allow smarter completion by infering the case | |
set infercase | |
" Ignore case when searching | |
set ignorecase | |
" When searching try to be smart about cases | |
set smartcase | |
" Highlight search results | |
set hlsearch | |
" Makes search act like search in modern browsers | |
set incsearch | |
" Don't redraw while executing macros (good performance config) | |
set lazyredraw | |
" For regular expressions turn magic on | |
set magic | |
" Show matching brackets when text indicator is over them | |
set showmatch | |
" How many tenths of a second to blink when matching brackets | |
set mat=2 | |
" No annoying sound on errors | |
set noerrorbells | |
set novisualbell | |
set t_vb= | |
set tm=500 | |
" Make sure that extra margin on left is removed | |
set foldcolumn=0 | |
" Enable Ctrl-A/Ctrl-X to work on octal and hex numbers, as well as characters | |
set nrformats=octal,hex,alpha | |
" Configure backspace so it acts as it should act | |
set backspace=eol,start,indent | |
set whichwrap+=<,>,h,l | |
"------------------------------------------------------------------------------ | |
" Colors and Fonts | |
"------------------------------------------------------------------------------ | |
" Enable syntax highlighting | |
syntax enable | |
set background=dark | |
" Set extra options when running in GUI mode | |
if has("gui_running") | |
set guioptions-=T | |
set guioptions-=e | |
set t_Co=256 | |
set guitablabel=%M\ %t | |
endif | |
" Set utf8 as standard encoding and en_US as the standard language | |
set encoding=utf8 | |
" Use Unix as the standard file type | |
set ffs=unix,dos,mac | |
" highlight trailing space | |
highlight ExtraWhitespace ctermbg=red guibg=red | |
match ExtraWhitespace /\s\+$/ | |
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/ | |
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/ | |
autocmd InsertLeave * match ExtraWhitespace /\s\+$/ | |
autocmd BufWinLeave * call clearmatches() | |
"------------------------------------------------------------------------------ | |
" Files, backups and undo | |
"------------------------------------------------------------------------------ | |
" Turn backup off, since most stuff is in SVN, git et.c anyway... | |
set nobackup | |
set nowb | |
set noswapfile | |
" Remember things between sessions | |
" | |
" '20 - remember marks for 20 previous files | |
" \"50 - save 50 lines for each register | |
" :20 - remember 20 items in command-line history | |
" /20 - remember 20 items in search history | |
" % - remember the buffer list (if vim started without a file arg) | |
" n - set name of viminfo file | |
set viminfo='20,\"50,:20,/20,%,n~/.viminfo.go | |
" Define what to save with :mksession | |
" blank - empty windows | |
" buffers - all buffers not only ones in a window | |
" curdir - the current directory | |
" folds - including manually created ones | |
" help - the help window | |
" options - all options and mapping | |
" winsize - window sizes | |
" tabpages - all tab pages | |
set sessionoptions=blank,buffers,curdir,folds,help,options,winsize,tabpages | |
"------------------------------------------------------------------------------ | |
" Text, tab and indent related | |
"------------------------------------------------------------------------------ | |
" Use spaces instead of tabs | |
set expandtab | |
" Be smart when using tabs ;) | |
set smarttab | |
" 1 tab == 4 spaces | |
set shiftwidth=4 | |
set tabstop=4 | |
" Round indent to multiple of 'shiftwidth' for > and < commands | |
set shiftround | |
" Linebreak on 500 characters | |
set lbr | |
set tw=500 | |
set ai "Auto indent | |
set si "Smart indent | |
set nowrap "Don't Wrap lines (it is stupid) | |
"------------------------------------------------------------------------------ | |
" Visual mode related | |
"------------------------------------------------------------------------------ | |
" Visual mode pressing * or # searches for the current selection | |
" Super useful! From an idea by Michael Naumann | |
vnoremap <silent> * :call VisualSelection('f', '')<CR> | |
vnoremap <silent> # :call VisualSelection('b', '')<CR> | |
"------------------------------------------------------------------------------ | |
" Moving around, tabs, windows and buffers | |
"------------------------------------------------------------------------------ | |
" Treat long lines as break lines (useful when moving around in them) | |
map j gj | |
map k gk | |
" Map <Space> to / (search) and Ctrl-<Space> to ? (backwards search) | |
map <space> / | |
map <c-space> ? | |
" Disable highlight when <leader><cr> is pressed | |
map <silent> <leader><cr> :noh<cr> | |
" Smart way to move between windows | |
map <C-j> <C-W>j | |
map <C-k> <C-W>k | |
map <C-h> <C-W>h | |
map <C-l> <C-W>l | |
" Close the current buffer (w/o closing the current window) | |
map <leader>bd :bdelete<cr> | |
" Close all the buffers | |
map <leader>bda :1,1000 bd!<cr> | |
" Useful mappings for managing tabs | |
map <leader>tn :tabnew<cr> | |
map <leader>to :tabonly<cr> | |
map <leader>tc :tabclose<cr> | |
map <leader>tm :tabmove | |
map <leader>tj :tabnext<cr> | |
map <leader>tk :tabprevious<cr> | |
" Let 'tl' toggle between this and the last accessed tab | |
let g:lasttab = 1 | |
nmap <Leader>tl :exe "tabn ".g:lasttab<CR> | |
au TabLeave * let g:lasttab = tabpagenr() | |
" Opens a new tab with the current buffer's path | |
" Super useful when editing files in the same directory | |
map <leader>te :tabedit <c-r>=expand("%:p:h")<cr>/ | |
" Switch CWD to the directory of the open buffer | |
map <leader>cd :cd %:p:h<cr>:pwd<cr> | |
" Specify the behavior when switching between buffers | |
try | |
set switchbuf=useopen,usetab,newtab | |
set stal=2 | |
catch | |
endtry | |
" Return to last edit position when opening files (You want this!) | |
autocmd BufReadPost * | |
\ if line("'\"") > 0 && line("'\"") <= line("$") | | |
\ exe "normal! g`\"" | | |
\ endif | |
" Remember info about open buffers on close | |
set viminfo^=% | |
"------------------------------------------------------------------------------ | |
" Status line | |
"------------------------------------------------------------------------------ | |
" Always show the status line | |
set laststatus=2 | |
" Format the status line | |
" set statusline=\ %{HasPaste()}%F%m%r%h\ %w\ \ CWD:\ %r%{getcwd()}%h\ \ \ Line:\ %l | |
"------------------------------------------------------------------------------ | |
" Editing mappings | |
"------------------------------------------------------------------------------ | |
" Remap VIM 0 to first non-blank character | |
map 0 ^ | |
" Delete trailing white space on save, useful for Python and CoffeeScript ;) | |
func! DeleteTrailingWS() | |
exe "normal mz" | |
%s/\s\+$//ge | |
exe "normal `z" | |
endfunc | |
autocmd BufWrite *.go :call DeleteTrailingWS() | |
autocmd BufWrite *.py :call DeleteTrailingWS() | |
autocmd BufWrite *.coffee :call DeleteTrailingWS() | |
" visual shifting (does not exit Visual mode) | |
vnoremap < <gv | |
vnoremap > >gv | |
"------------------------------------------------------------------------------ | |
" Ack searching and cope displaying | |
" (requires ack.vim - it's much better than vimgrep/grep) | |
"------------------------------------------------------------------------------ | |
" When you press gv you Ack after the selected text | |
vnoremap <silent> gv :call VisualSelection('gv', '')<CR> | |
" Open Ack and put the cursor in the right position | |
map <leader>a :Ack<space> | |
" When you press <leader>r you can search and replace the selected text | |
vnoremap <silent> <leader>r :call VisualSelection('replace', '')<CR> | |
" Do :help cope if you are unsure what cope is. It's super useful! | |
" | |
" When you search with Ack, display your results in cope by doing: | |
" <leader>cc | |
" | |
" To go to the next search result do: | |
" <leader>n | |
" | |
" To go to the previous search results do: | |
" <leader>p | |
" | |
map <leader>cc :botright cope<cr> | |
map <leader>co ggVGy:tabnew<cr>:set syntax=qf<cr>pgg | |
map <leader>n :cn<cr> | |
map <leader>p :cp<cr> | |
"------------------------------------------------------------------------------ | |
" Spell checking | |
"------------------------------------------------------------------------------ | |
" Pressing ,ss will toggle and untoggle spell checking | |
map <leader>ss :setlocal spell!<cr> | |
" Shortcuts using <leader> | |
map <leader>sn ]s | |
map <leader>sp [s | |
map <leader>sa zg | |
map <leader>s? z= | |
"------------------------------------------------------------------------------ | |
" Misc | |
"------------------------------------------------------------------------------ | |
" Remove the Windows ^M - when the encodings gets messed up | |
noremap <Leader>m mmHmt:%s/<C-V><cr>//ge<cr>'tzt'm | |
" Quickly open a buffer for scribble | |
map <leader>q :e ~/buffer<cr> | |
" Quickly open a markdown buffer for scribble | |
map <leader>x :e ~/buffer.md<cr> | |
" Toggle paste mode on and off | |
map <leader>pp :setlocal paste!<cr> | |
" easy way to edit reload .vimrc | |
nmap <leader>V :source $MYVIMRC<cr> | |
nmap <leader>v :vsp $MYVIMRC<cr> | |
"------------------------------------------------------------------------------ | |
" Helper functions | |
"------------------------------------------------------------------------------ | |
function! CmdLine(str) | |
exe "menu Foo.Bar :" . a:str | |
emenu Foo.Bar | |
unmenu Foo | |
endfunction | |
function! VisualSelection(direction, extra_filter) range | |
let l:saved_reg = @" | |
execute "normal! vgvy" | |
let l:pattern = escape(@", '\\/.*$^~[]') | |
let l:pattern = substitute(l:pattern, "\n$", "", "") | |
if a:direction == 'b' | |
execute "normal ?" . l:pattern . "^M" | |
elseif a:direction == 'gv' | |
call CmdLine("Ack \"" . l:pattern . "\" " ) | |
elseif a:direction == 'replace' | |
call CmdLine("%s" . '/'. l:pattern . '/') | |
elseif a:direction == 'f' | |
execute "normal /" . l:pattern . "^M" | |
endif | |
let @/ = l:pattern | |
let @" = l:saved_reg | |
endfunction | |
" Returns true if paste mode is enabled | |
function! HasPaste() | |
if &paste | |
return 'PASTE MODE ' | |
en | |
return '' | |
endfunction | |
" Don't request terminal version string (for xterm) | |
set t_RV= | |
" Switch between the last two files | |
nnoremap <leader><leader> <C-^> | |
" Switch between the last two files | |
nnoremap <leader><leader> <C-^> | |
" Allow to copy/paste between VIM instances | |
"copy the current visual selection to ~/.vbuf | |
vmap <leader>y :w! ~/.vbuf<cr> | |
"copy the current line to the buffer file if no visual selection | |
nmap <leader>y :.w! ~/.vbuf<cr> | |
"paste the contents of the buffer file | |
nmap <leader>p :r ~/.vbuf<cr> | |
" map CTRL-L to piece-wise copying of the line above the current one | |
imap <C-L> @@@<esc>hhkywjl?@@@<CR>P/@@@<cr>3s | |
" turn off search highlighting (type <leader>n to de-select everything) | |
nmap <silent> <leader>n :silent :nohlsearch<cr> | |
" Make sure that CTRL-A (used by gnu screen) is redefined | |
noremap <leader>inc <C-A> | |
"------------------------------------------------------------------------------ | |
" NERDTree | |
"------------------------------------------------------------------------------ | |
" General properties | |
let NERDTreeDirArrows=1 | |
let NERDTreeMinimalUI=1 | |
let NERDTreeIgnore=['\.o$', '\.pyc$', '\.php\~$'] | |
let NERDTreeWinSize = 35 | |
" Make sure that when NT root is changed, Vim's pwd is also updated | |
let NERDTreeChDirMode = 2 | |
let NERDTreeShowLineNumbers = 1 | |
let NERDTreeAutoCenter = 1 | |
" Open NERDTree on startup, when no file has been specified | |
autocmd VimEnter * if !argc() | NERDTree | endif | |
" Locate file in hierarchy quickly | |
map <leader>T :NERDTreeFind<cr> | |
" Toogle on/off | |
nmap <leader>o :NERDTreeToggle<cr> | |
"------------------------------------------------------------------------------ | |
" BufExplorer | |
"------------------------------------------------------------------------------ | |
" Shortcuts, type <leader>l to quickly navigate to necessary buffer | |
map <leader>l :BufExplorer<cr> | |
imap <leader>l <esc>:BufExplorer<cr> | |
vmap <leader>l <esc>:BufExplorer<cr> | |
"------------------------------------------------------------------------------ | |
" Fugitive | |
"------------------------------------------------------------------------------ | |
map ]] ]c | |
map [[ [c | |
map <leader>gdi :Gdiff<cr> | |
map <leader>gst :Gstatus<cr> | |
map <leader>dup :diffupdate<cr> | |
"------------------------------------------------------------------------------ | |
" Syntastic | |
"------------------------------------------------------------------------------ | |
set statusline+=%#warningmsg# | |
set statusline+=%{SyntasticStatuslineFlag()} | |
set statusline+=%* | |
let g:syntastic_aggregate_errors = 1 | |
let g:syntastic_always_populate_loc_list = 0 | |
let g:syntastic_auto_loc_list = 1 | |
let g:syntastic_check_on_open = 1 | |
let g:syntastic_check_on_wq = 0 | |
"------------------------------------------------------------------------------ | |
" Vim-go | |
"------------------------------------------------------------------------------ | |
let g:go_fmt_fail_silently = 1 | |
let g:go_fmt_command = "gofmt" "Explicited the formater plugin (gofmt, goimports, goreturn...) | |
" Show a list of interfaces which is implemented by the type under your cursor | |
au FileType go nmap <Leader>s <Plug>(go-implements) | |
" Show type info for the word under your cursor | |
au FileType go nmap <Leader>i <Plug>(go-info) | |
" Open the relevant Godoc for the word under the cursor | |
au FileType go nmap <Leader>gd <Plug>(go-doc) | |
au FileType go nmap <Leader>gv <Plug>(go-doc-vertical) | |
" Open the Godoc in browser | |
au FileType go nmap <Leader>gb <Plug>(go-doc-browser) | |
" Run/build/test/coverage | |
au FileType go nmap <leader>r <Plug>(go-run) | |
au FileType go nmap <leader>b <Plug>(go-build) | |
au FileType go nmap <leader>t <Plug>(go-test) | |
au FileType go nmap <leader>c <Plug>(go-coverage) | |
au FileType go nmap <leader>d :GoDecls | |
" By default syntax-highlighting for Functions, Methods and Structs is disabled. | |
" Let's enable them! | |
let g:go_highlight_functions = 1 | |
let g:go_highlight_methods = 1 | |
let g:go_highlight_structs = 1 | |
let g:go_highlight_types = 1 | |
let g:go_highlight_fields = 1 | |
let g:go_highlight_function_calls = 1 | |
let g:go_highlight_operators = 1 | |
let g:go_highlight_extra_types = 1 | |
let g:go_highlight_build_constraints = 1 | |
let g:go_highlight_generate_tags = 1 | |
let g:go_metalinter_enabled = ['vet', 'golint', 'errcheck'] | |
nmap <leader>tt :TagbarToggle<CR> | |
let g:tagbar_type_go = { | |
\ 'ctagstype' : 'go', | |
\ 'kinds' : [ | |
\ 'p:package', | |
\ 'i:imports:1', | |
\ 'c:constants', | |
\ 'v:variables', | |
\ 't:types', | |
\ 'n:interfaces', | |
\ 'w:fields', | |
\ 'e:embedded', | |
\ 'm:methods', | |
\ 'r:constructor', | |
\ 'f:functions' | |
\ ], | |
\ 'sro' : '.', | |
\ 'kind2scope' : { | |
\ 't' : 'ctype', | |
\ 'n' : 'ntype' | |
\ }, | |
\ 'scope2kind' : { | |
\ 'ctype' : 't', | |
\ 'ntype' : 'n' | |
\ }, | |
\ 'ctagsbin' : 'gotags', | |
\ 'ctagsargs' : '-sort -silent' | |
\ } | |
let g:rehash256 = 1 | |
let g:molokai_original = 1 | |
colorscheme molokai | |
autocmd Filetype go command! -bang A call go#alternate#Switch(<bang>0, 'edit') | |
autocmd Filetype go command! -bang AV call go#alternate#Switch(<bang>0, 'vsplit') | |
autocmd Filetype go command! -bang AS call go#alternate#Switch(<bang>0, 'split') | |
autocmd Filetype go command! -bang AT call go#alternate#Switch(<bang>0, 'tabe') | |
" Git gutter | |
let g:gitgutter_sign_added = '++' | |
let g:gitgutter_sign_modified = '**' | |
let g:gitgutter_sign_removed = '--' | |
let g:gitgutter_sign_removed_first_line = '^^' | |
let g:gitgutter_sign_removed_above_and_below = '{' | |
let g:gitgutter_sign_modified_removed = '-*' | |
set updatetime=10 | |
" Vim airline | |
let g:airline#extensions#tabline#enabled = 1 | |
" Telescope | |
" Find files using Telescope command-line sugar. | |
" nnoremap <leader>ff <cmd>Telescope find_files<cr> | |
nnoremap <leader>fg <cmd>Telescope live_grep<cr> | |
nnoremap <leader>fb <cmd>Telescope buffers<cr> | |
nnoremap <leader>fh <cmd>Telescope help_tags<cr> | |
nnoremap <Leader>ff :lua require'telescope.builtin'.find_files(require('telescope.themes').get_dropdown({}))<cr> | |
" Postgresql connection | |
vnoremap <leader>qe :<c-u>exec "PGRunQuery"<cr> | |
nnoremap <leader>qc :PGConnectBuffer<cr> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment