dgy
/
hexagons
Archived
1
0
Fork 0
This repository has been archived on 2021-03-24. You can view files and clone it, but cannot push or open issues or pull requests.
hexagons/.config/nvim/init.vim

736 lines
23 KiB
VimL
Raw Normal View History

2017-12-28 13:49:45 +00:00
" Important stuff {{{
scriptencoding utf-8 " Set utf-8 as default script encoding
let g:loaded_python_provider=1 " Disable python 2 interface
let g:python_host_skip_check=1 " Skip python 2 host check
let g:python3_host_prog = '/usr/bin/python3'
let g:tagbar_ctags_bin = '/usr/bin/ctags'
let python_highlight_all=1
set inccommand=nosplit " Live preview of substitutes and other similar commands
" Plug updates itself automatically
if empty(glob('~/.config/nvim/autoload/plug.vim'))
silent !curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs
\ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
au VimEnter * PlugInstall --sync | source $MYVIMRC
endif
set grepprg=rg\ --vimgrep\ --hidden\ --no-heading
set grepformat=%f:%l:%c:%m,%f:%l:%m
2017-12-28 13:49:45 +00:00
" }}}
" Plugins {{{
call plug#begin('~/.config/nvim/plugged')
Plug 'w0rp/ale'
Plug 'othree/yajs.vim', {'for': 'javascript'}
Plug 'othree/es.next.syntax.vim', {'for': 'javascript'}
Plug 'mxw/vim-jsx', {'for': 'javascript'}
Plug 'HerringtonDarkholme/yats.vim', {'for': 'typescript'}
Plug 'mhartington/nvim-typescript', {'do': './install.sh', 'for': 'typescript'}
Plug 'mattn/emmet-vim'
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'sheerun/vim-polyglot'
Plug 'tmsvg/pear-tree'
Plug 'tpope/vim-commentary'
Plug '/usr/bin/fzf'
Plug 'junegunn/fzf.vim'
Plug 'vim-airline/vim-airline'
Plug 'Shougo/defx.nvim', { 'do': ':UpdateRemotePlugins' }
Plug 'mhartington/oceanic-next'
call plug#end()
2017-12-28 13:49:45 +00:00
" }}}
" Options {{{
set path+=**
set binary
set clipboard^=unnamedplus " system clipboard (requires +clipboard)
set fileencoding=utf-8 " The encoding written to file.
set shell=/bin/zsh " Setting shell to zsh
set number " Line numbers on
set pumheight=12 " Completion window max size
set helpheight=12 " Minimum help window height
set noswapfile " New buffers will be loaded without creating a swapfile
set hidden " Enables to switch between unsaved buffers and keep undo history
set lazyredraw " Don't redraw while executing macros (better performance)
set showmatch " Show matching brackets when text indicator is over them
set matchpairs+=<:> " Add HTML brackets to pair matching
set matchtime=1 " Tenths of a second to show the matching paren
set cpoptions-=m " showmatch will wait 0.5s or until a char is typed
set nojoinspaces " No extra space when joining a line which ends with . ? !
set updatetime=300 " Update time used to create swap file or other things
set synmaxcol=200 " Don't try to syntax highlight minified files
set splitbelow " Splitting a window will put the new window below the current
set splitright " Splitting a window will put the new window right of the current
set notimeout " Time out on key codes but not mappings.
set ignorecase " Ignore case by default
set cursorline " Hightlight the screen line of the cursor
set visualbell " Use visual bell instead of beeping
set scrolloff=3 " Keep this many lines padding when scrolling
set shortmess+=aoOIWcs " Shorten messages and don't show intro
set tabstop=4 " Number of spaces a <Tab> equals
set shiftwidth=4 " Number of spaces for each (auto)indent step
set foldnestmax=10 " Deepest fold is 10 levels
set foldmethod=marker " Markers are used to specify folds.
set foldlevelstart=10
set foldclose=all
set title
set titlestring=%t%(\ %M%)%(\ (%{expand(\"%:~:.:h\")})%)%(\ %a%)
set selectmode=key
set keymodel=startsel
set softtabstop=4
set noshowmode
set breakindent
set redrawtime=500
set ttimeoutlen=10
set nowritebackup
set completeopt-=preview
set nostartofline
set nosmarttab
set modeline
2018-07-21 04:46:57 +00:00
set title
set undofile
set undolevels=1000
set undoreload=10000
set undodir=$HOME/.config/nvim/undo
set formatoptions+=nj
set signcolumn=yes
set pastetoggle=<F12>
set fillchars+=vert:\|
" Display all matching files when we tab complete
set wildmode=longest:full,full
set wildignorecase
set wildoptions=tagfile
if &diff
set textwidth=80
endif
match ErrorMsg '^\(<\|=\|>\)\{7\}\([^=].\+\)\?$'
let mapleader="\<SPACE>"
let maplocalleader=","
let formatlistpat='^\s*\(\d\+[\]:.)}\t ]\|[*-][\t ]\)\s*'
" }}}
" Read Only {{{
if &readonly
set laststatus=0
set cmdheight=0
set nonumber
set noshowmode
set noruler
set colorcolumn=0
set signcolumn=no
let g:ale_disabled
let w:airline_disabled = 1
endif
2017-12-28 13:49:45 +00:00
" }}}
" {{{ Ale
let g:ale_use_global_executables = 1
let g:ale_completion_enabled = 0
let g:ale_linters_explicit = 1
let g:ale_lint_delay = 0
let g:ale_lint_on_text_changed = 'normal'
let g:ale_lint_on_insert_leave = 1
let g:ale_fix_on_save = 1
let g:ale_close_preview_on_insert = 1
let g:ale_sign_error = '✖'
let g:ale_sign_warning = '⚠'
let g:ale_sign_info = 'i'
let g:ale_set_loclist = 0
let g:ale_set_quickfix = 1
let g:ale_loclist_msg_format = '[%linter%] %s% (code)% [%severity%]'
let g:ale_set_highlights = 1
let g:ale_set_signs = 1
let g:ale_set_balloons = 1
let g:ale_linter_aliases = {
\ 'jsx': ['css', 'javascript'],
\ 'vue': ['vue', 'javascript'],
\}
let g:ale_linters = {
\ 'javascript': ['standard'],
\ 'jsx': ['stylelint', 'eslint'],
\ 'typescript': ['tsserver', 'tslint'],
\ 'vue': ['eslint', 'vls'],
\ 'html': ['tidy'],
\ 'bash': ['shellcheck'],
\}
let g:ale_fixers = {
\ 'javascript': ['prettier_standard'],
\ 'typescript': ['prettier'],
\ 'vue': ['eslint'],
\ 'scss': ['prettier'],
\ 'css': ['prettier'],
\ 'markdown': ['prettier'],
\ 'html': ['prettier'],
\}
let g:ale_pattern_options = {
\ '\.min\.js$': {'ale_linters': [], 'ale_fixers': []},
\ '\.min\.css$': {'ale_linters': [], 'ale_fixers': []},
\}
nmap <silent> <F10> <Plug>(ale_previous_wrap)
nmap <silent> <F11> <Plug>(ale_next_wrap)
" }}}
" CoC {{{
let g:coc_global_extensions = ['coc-vimlsp', 'coc-stylelint', 'coc-vetur', 'coc-tsserver', 'coc-emmet', 'coc-css', 'coc-html', 'coc-json', 'coc-eslint', 'coc-prettier']
" Remap keys for gotos
nmap <silent> <leader>ld <Plug>(coc-definition)
nmap <silent> <leader>lt <Plug>(coc-type-definition)
nmap <silent> <leader>li <Plug>(coc-implementation)
nmap <silent> <leader>lr <Plug>(coc-references)
nmap <silent> <leader>l{ <Plug>(coc-diagnostic-prev)
nmap <silent> <leader>l} <Plug>(coc-diagnostic-next)
" Remap for rename current word
nmap <leader>lr <Plug>(coc-rename)
" Show documentation in preview window
nnoremap <silent> <leader>lk :call <SID>show_documentation()<CR>
function! s:show_documentation()
if &filetype == 'vim'
execute 'h '.expand('<cword>')
else
call CocAction('doHover')
endif
endfunction
"}}}
" FZF {{{
let g:fzf_layout = { 'down': '~35%' }
let g:fzf_action = {
\ 'ctrl-e': 'enew',
\ 'ctrl-t': 'tab split',
\ 'ctrl-s': 'split',
\ 'ctrl-v': 'vsplit' }
let g:fzf_colors = {
\ 'fg': ['fg', 'Normal'],
\ 'bg': ['bg', 'Clear'],
\ 'hl': ['fg', 'String'],
\ 'fg+': ['fg', 'CursorLine', 'CursorColumn', 'Normal'],
\ 'bg+': ['bg', 'CursorLine', 'CursorColumn'],
\ 'hl+': ['fg', 'Statement'],
\ 'info': ['fg', 'PreProc'],
\ 'prompt': ['fg', 'Conditional'],
\ 'pointer': ['fg', 'Exception'],
\ 'marker': ['fg', 'Keyword'],
\ 'spinner': ['fg', 'Label'],
\ 'header': ['fg', 'Comment'] }
let $FZF_DEFAULT_COMMAND='fd -t f -S -2m -F -H --ignore-file .gitignore'
let g:fzf_buffers_jump = 1
let g:fzf_tags_command = 'ctags -R'
let g:fzf_history_dir = '~/.local/share/fzf-history'
let g:fzf_nvim_statusline = 0
let g:fzf_files_options = "--preview 'bat --color \"always\" {}'"
command! -bang -nargs=* Rg
\ call fzf#vim#grep(
\ 'rg --column --line-number --hidden --ignore-case --no-heading --color=always '.shellescape(<q-args>), 1,
\ <bang>0 ? fzf#vim#with_preview({'options': '--delimiter : --nth 4..'}, 'up:60%')
\ : fzf#vim#with_preview({'options': '--delimiter : --nth 4..'}, 'right:50%:hidden', '?'),
\ <bang>0)
command! -bang -nargs=? -complete=dir Files
\ call fzf#vim#files(<q-args>, fzf#vim#with_preview(), <bang>0)
" only use FZF shortcuts in non diff-mode
if !&diff
nnoremap <F1> :Helptags<CR>
nnoremap <F2> :Files<CR>
nnoremap <F3> :Buffers<CR>
nnoremap <F4> :Windows<CR>
nnoremap <F6> :History<CR>
nnoremap <F7> :Rg<CR>
endif
" }}}
" JS {{{
let g:polyglot_disabled = ['javascript', 'jsx', 'typescript', 'json', 'python']
let g:jsx_ext_required = 1
let g:yats_host_keyword = 1
"}}}
" Emmet {{{
let g:user_emmet_leader_key=','
"}}}
" Statusline {{{
let g:airline_extensions = ['quickfix', 'ale', 'coc', 'tabline']
let g:airline#extensions#default#layout = [['a', 'b', 'c'], ['warning', 'error', 'z']]
let g:airline_section_b = '%{abs(line(".") - line("v")) + 1}'
let g:airline_section_c = '%{getcwd()}'
let g:airline_section_z = '%p%%'
let g:airline_skip_empty_sections = 1
let g:airline_focuslost_inactive = 1
let g:airline#extensions#tabline#formatter = 'unique_tail'
let g:airline#extensions#tabline#alt_sep = 1
let g:airline#extensions#tabline#show_splits = 1
let g:airline#extensions#tabline#show_buffers = 1
let g:airline#extensions#tabline#show_tab_count = 0
let g:airline#extensions#tabline#show_tab_type = 0
let g:airline#extensions#tabline#show_close_button = 0
let g:airline#extensions#tabline#exclude_preview = 1
" let g:airline#extensions#tabline#tab_min_count = 2
let g:airline#extensions#tabline#tab_nr_type = 2 " splits and tab number
let g:airline_exclude_preview = 1
let g:airline_powerline_fonts = 1
let g:airline_highlighting_cache = 1
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
let g:airline_left_sep = ' '
let g:airline_right_sep = ' '
let g:airline_left_alt_sep = ' '
let g:airline_right_alt_sep = ' '
let g:airline#extensions#tabline#left_sep = ' '
let g:airline#extensions#tabline#left_alt_sep = ' '
let g:airline#extensions#tabline#right_sep = ' '
let g:airline#extensions#tabline#right_alt_sep = ' '
let g:airline#extensions#ale#checking_symbol=""
let airline#extensions#ale#warning_symbol = ' '
let airline#extensions#ale#error_symbol = ' '
let airline#extensions#ale#open_lnum_symbol = ' (L '
let airline#extensions#ale#show_line_numbers = 1
let g:airline_theme='moonfly'
" }}}
" Colors {{{
set termguicolors
let g:oceanic_next_terminal_italic = 1
colo OceanicNext
function! MyHighlights() abort
highlight Trail ctermbg=red guibg=red
call matchadd('Trail', '\s\+$', 100)
highlight ColorColumn ctermbg=magenta
call matchadd('ColorColumn', '\%81v', 100)
endfunction
hi! VertSplit ctermbg=NONE ctermfg=NONE guibg=#080808 guifg=#080808
hi! Comment cterm=italic ctermbg=NONE
hi! Normal ctermbg=NONE guibg=#080808
hi! NonText ctermbg=NONE guibg=#080808
hi! LineNr ctermbg=232 ctermfg=237 guibg=#080808 guifg=#3a3a3a
hi! CursorLineNr ctermbg=236 ctermfg=NONE guibg=#303030 guifg=NONE
hi! CursorLine ctermbg=236 ctermfg=NONE guibg=#303030 guifg=NONE
hi! SignColumn ctermbg=NONE guibg=#080808
hi! Folded ctermbg=NONE guibg=#080808
hi! StatusLine guibg=#080808 ctermbg=NONE
hi! StatusLineNC guibg=#080808 ctermbg=NONE
hi! TabLine cterm=None ctermbg=NONE guibg=#080808
hi! TabLineSel cterm=None ctermbg=NONE guibg=#080808
hi! TabLineFill cterm=None ctermbg=NONE guibg=#080808 guifg=#080808
hi! EndOfBuffer ctermbg=NONE ctermfg=NONE guibg=#080808 guifg=NONE
hi! WildMenu ctermfg=226 ctermbg=0 guifg=#ffff00 guibg=#000000
hi! link CocErrorSign WarningMsg
hi! link CocWarningSign Number
hi! link CocInfoSign Type
" }}}
" AutoCommands {{{
if !exists("autocommands_loaded") && has("autocmd")
let autocommands_loaded = 1
function! PopOutOfInsertMode()
if v:insertmode
call feedkeys("\<C-\>\<C-n>")
endif
endfunction
aug on_save
au BufWritePre * :%s/\s\+$//e " Auto remove all trailing whitespace on :w
au BufWritePost ~/.Xresources,~/.Xdefaults !xrdb %
aug END
aug on_quit
au VimLeave *.tex !texclear % " Runs a script that cleans out tex build files whenever I close out of a .tex file.
au QuitPre * if empty(&buftype) | lclose | endif
aug END
aug defx_things
" Close defx if it's the only buffer left in the window
au WinEnter * if &ft == 'defx' && winnr('$') == 1 | q | endif
" Move focus to the next window if current buffer is defx
au TabLeave * if &ft == 'defx' | wincmd w | endif
au FileType defx do WinEnter | call s:defx_my_settings()
aug END
aug term_stuff
au TermOpen * setlocal nonumber
au TermOpen * setlocal laststatus=0
au TermOpen * setlocal nocursorline
au TermOpen * setlocal signcolumn=no
au TermOpen * setlocal noshowmode
au TermOpen * setlocal noruler
aug END
aug miscs
au CursorHold * silent call CocActionAsync('highlight') " Highlight symbol under cursor on CursorHold
au ColorScheme * call MyHighlights()
aug END
2019-01-08 13:01:43 +00:00
aug inserts
au InsertEnter * setlocal nocursorline
au InsertLeave * setlocal cursorline
au InsertLeave,CompleteDone * if pumvisible() == 0 | pclose | endif
au FocusLost,TabLeave * call PopOutOfInsertMode()
aug END
aug skeletons
au BufNewFile *.py 0r ~/.config/nvim/templates/py.skeleton
au BufNewFile *.sh 0r ~/.config/nvim/templates/sh.skeleton
aug END
aug fzf_setup
au FileType fzf set laststatus=0 noruler
\| au BufLeave <buffer> set ruler laststatus=2
au TermOpen term://*FZF tnoremap <silent> <buffer> <esc> <c-c>
aug END
aug file_types
au FileType * setl formatoptions-=cro " Disables automatic commenting on newline
au BufRead,BufNewFile *.md set filetype=markdown
au BufRead,BufNewFile *.conf set filetype=config
au BufRead,BufNewFile *.bash* set filetype=sh
au BufRead,BufNewFile *.vue set filetype=vue
au BufRead,BufNewFile *.jsx set filetype=javascript.jsx
au BufRead,BufNewFile *.ts set filetype=typescript
au BufRead,BufNewFile *.tsx set filetype=typescript.tsx
au FileType typescript,json setl formatexpr=CocAction('formatSelected')
au FileType json syntax match Comment +\/\/.\+$+
aug END
endif
" }}}
" File browser {{{
call defx#custom#option('_', {
\ 'columns': 'mark:indent:icons:filename',
\ 'winwidth': 30,
\ 'split': 'vertical',
\ 'direction': 'botright',
\ 'show_ignored_files': 0,
\ 'toggle': 1,
\ })
call defx#custom#column('icon', {
\ 'directory_icon': '▸',
\ 'opened_icon': '▾',
\ 'root_icon': ' ',
\ })
call defx#custom#column('mark', {
\ 'readonly_icon': '✗',
\ 'selected_icon': '✓',
\ })
function! s:defx_my_settings() abort
nnoremap <silent><buffer><expr> <CR> defx#do_action('drop')
nnoremap <silent><buffer><expr> l <sid>defx_toggle_tree()
nnoremap <silent><buffer><expr> s defx#do_action('open', 'botright vsplit')
nnoremap <silent><buffer><expr> i defx#do_action('open', 'topleft split')
nnoremap <silent><buffer><expr> st defx#do_action('multi', [['drop', 'tabnew'], 'quit'])
nnoremap <silent><buffer><expr> sg defx#do_action('multi', [['drop', 'vsplit'], 'quit'])
nnoremap <silent><buffer><expr> sp defx#do_action('multi', [['drop', 'split'], 'quit'])
nnoremap <silent><buffer><expr> P defx#do_action('open', 'pedit')
nnoremap <silent><buffer><expr> K defx#do_action('new_directory')
nnoremap <silent><buffer><expr> N defx#do_action('new_multiple_files')
nnoremap <silent><buffer><expr> dd defx#do_action('remove')
nnoremap <silent><buffer><expr> r defx#do_action('rename')
nnoremap <silent><buffer><expr> x defx#do_action('execute_system')
nnoremap <silent><buffer><expr> . defx#do_action('toggle_ignored_files')
nnoremap <silent><buffer><expr> yy defx#do_action('yank_path')
nnoremap <silent><buffer><expr> h defx#do_action('cd', ['..'])
nnoremap <silent><buffer><expr> ~ defx#async_action('cd')
nnoremap <silent><buffer><expr> q defx#do_action('quit')
nnoremap <silent><buffer><expr><nowait> \ defx#do_action('cd', getcwd())
nnoremap <silent><buffer><expr><nowait> c defx#do_action('copy')
nnoremap <silent><buffer><expr><nowait> m defx#do_action('move')
nnoremap <silent><buffer><expr><nowait> p defx#do_action('paste')
nnoremap <silent><buffer><expr> ' defx#do_action('toggle_select') . 'j'
nnoremap <silent><buffer><expr> * defx#do_action('toggle_select_all')
nnoremap <silent><buffer><expr> <C-r> defx#do_action('redraw')
nnoremap <silent><buffer><expr> S defx#do_action('toggle_sort', 'Time')
endfunction
function! s:defx_toggle_tree() abort
if defx#is_directory()
return defx#do_action('open_or_close_tree')
endif
return defx#do_action('drop')
endfunction
nnoremap <F5> :Defx<CR>
" }}}
" REPL {{{
let g:my_active_terminal_job_id = -1
function! LaunchTerminal() range
silent exe "normal! :12split\n"
silent exe "normal! :terminal\n"
call SetActiveTerminalJobID()
endfunction
function! LaunchSC() range abort
silent exe "normal! :tabnew\n"
silent exe "normal! :terminal\n"
call SetActiveTerminalJobID()
call jobsend(g:my_active_terminal_job_id, "scsynth -u 57110\r")
sleep 2200ms
silent exe "normal! :vsplit\n"
silent exe "normal! :terminal\n"
call SetActiveTerminalJobID()
call jobsend(g:my_active_terminal_job_id, "sclang -D ~/Music/LiveCoding/foxdot.scd\r")
silent exe "normal! :tabprev\n"
silent exe "normal! <cr>\n"
sleep 2200ms
endfunction
function! LaunchFoxDot() range abort
call LaunchTerminal()
call jobsend(g:my_active_terminal_job_id, "ipython\r")
sleep 2200ms
call jobsend(g:my_active_terminal_job_id, "from FoxDot import *\r")
endfunction
function! SetActiveTerminalJobID()
let g:my_active_terminal_job_id = b:terminal_job_id
echom "Active terminal job ID set to " . g:my_active_terminal_job_id
endfunction
function! LineFlash(blinktime)
redraw!
exec 'sleep ' . float2nr(a:blinktime * 1000) . 'm'
silent exe "normal! vv"
endfunction
function! SendToFoxdot() range abort
" Yank the last selection into register 'a'
silent exe 'normal! gv"ay'
" Flash selection
call LineFlash(0.3)
" Send register 'a' into the terminal
call jobsend(g:my_active_terminal_job_id, @a)
" Pause a moment, then send a carriage return to trigger its evaluation
sleep 210ms
call jobsend(g:my_active_terminal_job_id, "\r")
endfunction
function! SilenceFoxDot() abort
call jobsend(g:my_active_terminal_job_id, "Clock.clear()\r")
endfunction
map <silent> <Leader>xs :call LaunchSC()<CR>
map <silent> <Leader>xd :call LaunchFoxDot()<CR>
map <silent> <Leader>xx :call SendToFoxdot()<CR>
map <silent> <Leader>x. :call SilenceFoxDot()<CR>
map <silent> <Leader>xf :set filetype=foxdot<CR>
"}}}
"Mappings {{{
"Normal {{{
" LaTeX and friends
nnoremap <F8> :w! \| !compiler <c-r>%<CR>
" Plug
nnoremap <leader>pu :PlugUpdate<CR>
nnoremap <leader>pU :PlugUpgrade<CR>
" Super quick search and replace
nnoremap <leader>+ :'{,'}s/\<<C-r>=expand("<cword>")<CR>\>/
nnoremap <leader>¿ :%s/\<<C-r>=expand("<cword>")<CR>\>/
" Learn vim keys the hard way
nnoremap <silent> <Left> :vertical resize -2<CR>
nnoremap <silent> <Right> :vertical resize +2<CR>
2018-07-21 04:46:57 +00:00
nnoremap <silent> <Up> :resize -1<CR>
nnoremap <silent> <Down> :resize +1<CR>
inoremap jk <esc>
cnoremap jk <C-c>
2018-07-21 04:46:57 +00:00
" Edit and source config file
2018-07-21 04:46:57 +00:00
nnoremap <silent> <leader>ev :vsplit $MYVIMRC<CR>
nnoremap <silent> <leader>sv :source $MYVIMRC<CR>
" Fast saves
nnoremap <leader>w :w!<CR>
" Fast exits
nnoremap <leader>q :q!<CR>
nnoremap <leader>Q :qa!<CR>
" Splits
nnoremap <leader>T :terminal<CR>
nnoremap <leader>s :split<CR>
nnoremap <leader>v :vsplit<CR>
nnoremap <leader>nv :vnew<CR>
nnoremap <leader>ns :new<CR>
" My vim wants to enter all the time, enter all the time
nnoremap <silent> <CR> i<CR><ESC>
" Quote words under cursor
nnoremap <leader>" viW<esc>a"<esc>gvo<esc>i"<esc>gvo<esc>3l
nnoremap <leader>' viW<esc>a'<esc>gvo<esc>i'<esc>gvo<esc>3l
" Move a line of text using Shift+[jk]
nnoremap <S-j> mz:m+<cr>`z
nnoremap <S-k> mz:m-2<cr>`z
2018-07-21 04:46:57 +00:00
" Unhighlight search terms
2018-07-04 19:27:13 +00:00
nnoremap <silent> <leader><space> :noh<C-R>=has('diff')?'<Bar>diffupdate':''<CR><CR><C-L>
" What about the Q
nnoremap Q <nop>
map q <nop>
2018-07-21 04:46:57 +00:00
" j = gj :: k = gk while preserving numbered jumps ie. 12j or 30k
nnoremap <buffer><silent><expr>j v:count ? 'j' : 'gj'
nnoremap <buffer><silent><expr>k v:count ? 'k' : 'gk'
" Line movements
noremap <silent> <Home> g<Home>
noremap <silent> <End> g<End>
nnoremap Y 0y$
nnoremap <leader>y y$
nnoremap L 0v$
" Alt to switch windows
nnoremap <M-j> <C-W><C-J>
nnoremap <M-k> <C-W><C-K>
nnoremap <M-l> <C-W><C-L>
nnoremap <M-h> <C-W><C-H>
" Tab movement
nnoremap tn :tabnew<cr>
nnoremap th :tabfirst<cr>
nnoremap tl :tablast<cr>
" Center view on search result
nnoremap n nzz
nnoremap N Nzz
nnoremap * *zz
nnoremap # #zz
nnoremap g* g*zz
nnoremap g# g#zz
"}}}
"Insert {{{
" Ensure that ctrl+u in insert mode can be reversed
" http://vim.wikia.com/wiki/Recover_from_accidental_Ctrl-U
inoremap <c-u> <c-g>u<c-u>
inoremap <c-w> <c-g>u<c-w>
" Deedee
inoremap <c-d> <esc>ddi
" Line movements
inoremap <silent> <Home> <C-o>g<Home>
inoremap <silent> <End> <C-o>g<End>
" Alt to switch windows
inoremap <A-h> <Esc><C-w>h
inoremap <A-j> <Esc><C-w>j
inoremap <A-k> <Esc><C-w>k
inoremap <A-l> <Esc><C-w>l
"}}}
"Visual {{{
" Visual mode pressing * or # searches for the current selection
vnoremap <silent> # :<C-u>call VisualSelection('', '')<CR>?<C-R>=@/<CR><CR>
" Move a line of text using Shift+[jk]
vnoremap <S-j> :m'>+<cr>`<my`>mzgv`yo`z
vnoremap <S-k> :m'<-2<cr>`>my`<mzgv`yo`z
" j = gj :: k = gk while preserving numbered jumps ie. 12j or 30k
vnoremap <buffer><silent><expr>j v:count ? 'j' : 'gj'
vnoremap <buffer><silent><expr>k v:count ? 'k' : 'gk'
" Line movements
vnoremap $ $h
" Fix indentation without leaving visual mode
vnoremap > >gv
vnoremap < <gv
" Delete current visual selection and dump in black hole buffer before pasting
" Used when you want to paste over something without it getting copied to
" Vim's default buffer
vnoremap <leader>p "_dP
"}}}
"Terminal {{{
" Terminal movement
tnoremap <Esc> <C-\><C-n>
tnoremap <M-h> <C-\><C-n><C-w>h
tnoremap <M-j> <C-\><C-n><C-w>j
tnoremap <M-k> <C-\><C-n><C-w>k
tnoremap <M-l> <C-\><C-n><C-w>l
"}}}
"Command {{{
" Shift butterfinger
:command! WQ wq
:command! Wq wq
:command! Wqa wqa
:command! Wa wa
:command! WA wa
:command! W w
:command! Q q
:command! Qa qa
:command! QA qa
"}}}
" }}}
" Functions {{{
function! CmdLine(str)
call feedkeys(":" . a:str)
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 == 'gv'
call CmdLine("Ack '" . l:pattern . "' " )
elseif a:direction == 'replace'
call CmdLine("%s" . '/'. l:pattern . '/')
endif
let @/ = l:pattern
let @" = l:saved_reg
endfunction
2018-07-21 04:46:57 +00:00
" global replace
vnoremap <Leader>sw "hy
\ :let b:sub = input('global replacement: ') <Bar>
\ if b:sub !=? '' <Bar>
\ let b:rep = substitute(getreg('h'), '/', '\\/', 'g') <Bar>
2018-07-21 04:46:57 +00:00
\ execute '%s/'.b:rep."/".b:sub.'/g' <Bar>
\ unlet b:sub b:rep <Bar>
\ endif <CR>
nnoremap <Leader>sw
\ :let b:sub = input('global replacement: ') <Bar>
\ if b:sub !=? '' <Bar>
\ execute "%s/<C-r><C-w>/".b:sub.'/g' <Bar>
\ unlet b:sub <Bar>
\ endif <CR>
" prompt before each replace
vnoremap <Leader>cw "hy
\ :let b:sub = input('interactive replacement: ') <Bar>
\ if b:sub !=? '' <Bar>
\ let b:rep = substitute(getreg('h'), '/', '\\/', 'g') <Bar>
\ execute '%s/'.b:rep.'/'.b:sub.'/gc' <Bar>
\ unlet b:sub b:rep <Bar>
\ endif <CR>
nnoremap <Leader>cw
\ :let b:sub = input('interactive replacement: ') <Bar>
\ if b:sub !=? '' <Bar>
\ execute "%s/<C-r><C-w>/".b:sub.'/gc' <Bar>
\ unlet b:sub <Bar>
\ endif <CR>
" local keyword jump
nnoremap <Leader>fw
\ [I:let b:jump = input('Go To: ') <Bar>
\ if b:jump !=? '' <Bar>
\ execute "normal! ".b:jump."[\t" <Bar>
\ unlet b:jump <Bar>
\ endif <CR><Paste>
" }}}
" vim:foldmethod=marker:foldlevel=0