aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--[l---------].config/nvim/init.vim1881
-rw-r--r--.vimrc102
2 files changed, 1914 insertions, 69 deletions
diff --git a/.config/nvim/init.vim b/.config/nvim/init.vim
index 71b3819..7cddc92 120000..100644
--- a/.config/nvim/init.vim
+++ b/.config/nvim/init.vim
@@ -1 +1,1880 @@
-../../.vimrc \ No newline at end of file
+" Global settings {{{1
+
+" Global constants {{{2
+
+let g:MY_ENV = {}
+
+if has('unix')
+ let g:MY_ENV.os = 'unix'
+elseif has('mac')
+ let g:MY_ENV.os = 'mac'
+elseif has('wsl')
+ let g:MY_ENV.os = 'wsl'
+elseif has('win32') || has('win64')
+ let g:MY_ENV.os = 'windows'
+else
+ let g:MY_ENV.os = 'unknown'
+endif
+
+if empty($XDG_CONFIG_HOME)
+ let g:MY_ENV.config_home = $HOME . '/.config'
+else
+ let g:MY_ENV.config_home = $XDG_CONFIG_HOME
+endif
+if empty($XDG_CACHE_HOME)
+ let g:MY_ENV.cache_home = $HOME . '/.cache'
+else
+ let g:MY_ENV.cache_home = $XDG_CONFIG_HOME
+endif
+if empty($XDG_DATA_HOME)
+ let g:MY_ENV.data_home = $HOME . '/.local/share'
+else
+ let g:MY_ENV.data_home = $XDG_DATA_HOME
+endif
+
+let g:MY_ENV.config_dir = g:MY_ENV.config_home . '/nvim'
+let g:MY_ENV.cache_dir = g:MY_ENV.cache_home . '/nvim'
+let g:MY_ENV.data_dir = g:MY_ENV.data_home . '/nvim'
+
+let g:MY_ENV.my_dir = g:MY_ENV.config_dir . '/my'
+let g:MY_ENV.plug_dir = g:MY_ENV.config_dir . '/plugged'
+let g:MY_ENV.yankround_dir = g:MY_ENV.data_dir . '/yankround'
+let g:MY_ENV.skk_dir = g:MY_ENV.config_home . '/skk'
+
+for [s:k, s:v] in items(g:MY_ENV)
+ if s:k =~# '_dir$' && !isdirectory(s:v)
+ call mkdir(s:v, 'p')
+ endif
+endfor
+unlet s:k s:v
+
+
+
+
+" The autogroup used in .vimrc {{{2
+
+augroup Vimrc
+ autocmd!
+augroup END
+
+
+" Note: |:autocmd| does not accept |-bar|.
+command! -nargs=*
+ \ Autocmd
+ \ autocmd Vimrc <args>
+
+
+
+" Language {{{2
+
+" Disable L10N.
+language messages C
+language time C
+
+
+
+
+
+" Options {{{1
+
+" * Use |:set|, not |:setglobal|.
+" |:setglobal| does not set local options, so options are not set in
+" the starting buffer you specified as commandline arguments like
+" "$ vim ~/.vimrc".
+
+" Moving around, searching and patterns {{{2
+
+set nowrapscan
+set ignorecase
+set smartcase
+
+
+
+" Displaying text {{{2
+
+set scrolloff=7
+set linebreak
+set breakindent
+set breakindentopt+=sbr
+let &showbreak = '> '
+set sidescrolloff=20
+let &fillchars = 'stl: ,stlnc: ,vert: ,fold: ,diff: '
+set cmdheight=2
+set list
+let &listchars="eol:\u00ac,tab:\u25b8 ,trail:\u00b7,extends:\u00bb,precedes:\u00ab"
+set concealcursor=cnv
+
+
+
+" Syntax, highlighting and spelling {{{2
+
+set background=dark
+set synmaxcol=500
+set hlsearch
+" Execute nohlsearch to avoid highlighting last searched pattern when reloading
+" .vimrc.
+nohlsearch
+set termguicolors
+set colorcolumn=+1
+
+
+" Multiple windows {{{2
+
+set winminheight=0
+set hidden
+set switchbuf=usetab
+
+
+
+" Multiple tabpages {{{2
+
+set showtabline=2
+
+
+
+" Terminal {{{2
+
+set notitle
+
+
+
+" Using the mouse {{{2
+
+set mouse=
+
+
+
+" Messages and info {{{2
+
+set shortmess+=a
+set shortmess+=s
+set shortmess+=I
+set shortmess+=c
+set noshowmode
+set report=999
+set confirm
+
+
+
+" Selecting text {{{2
+
+set clipboard=unnamed
+
+
+
+" Editing text {{{2
+
+set undofile
+set textwidth=0
+set completeopt-=preview
+set pumheight=10
+set matchpairs+=<:>
+set nojoinspaces
+set nrformats+=unsigned
+
+
+
+" Tabs and indenting {{{2
+" Note: you should also set them for each file types.
+" These following settings are global, used for unknown file types.
+
+set tabstop=4
+set shiftwidth=4
+set softtabstop=4
+set expandtab
+set smartindent
+set copyindent
+set preserveindent
+
+
+
+" Folding {{{2
+
+set foldlevelstart=0
+set foldopen+=insert
+set foldmethod=marker
+
+
+
+" Diff mode {{{2
+
+set diffopt+=vertical
+ \ diffopt+=foldcolumn:3
+
+
+
+" Mapping {{{2
+
+set maxmapdepth=10
+set notimeout
+
+
+
+" Reading and writing files {{{2
+
+set nofixendofline
+" Note: if 'fileformat' is empty, the first item of 'fileformats' is used.
+set fileformats=unix,dos
+" Note: these settings make one backup. If you want more backups, see
+" |'backupext'|.
+set backup
+set autowrite
+
+
+
+" Command line editing {{{2
+set wildignore+=*.o,*.obj,*.lib
+set wildignorecase
+
+
+
+" Executing external commands {{{2
+
+set shell=zsh
+set keywordprg=
+
+
+
+" Encoding {{{2
+
+" Note: if 'fileencoding' is empty, 'encoding' is used.
+set fileencodings=utf-8,cp932,euc-jp
+
+
+
+" Misc. {{{2
+
+set sessionoptions+=localoptions
+set sessionoptions+=resize
+set sessionoptions+=winpos
+
+
+
+" Installed plugins {{{1
+
+" === BEGIN === {{{2
+
+execute 'set runtimepath+=' . g:MY_ENV.config_dir
+call plug#begin(g:MY_ENV.plug_dir)
+
+
+" Text editing {{{2
+
+" IME {{{3
+
+" SKK (Simple Kana to Kanji conversion program) for Vim.
+Plug 'vim-skk/eskk.vim'
+
+" Operators {{{3
+
+" Support for user-defined operators.
+Plug 'kana/vim-operator-user'
+
+" Extract expression and make assingment statement.
+Plug 'tek/vim-operator-assign'
+
+" Replace text without updating registers.
+Plug 'kana/vim-operator-replace'
+
+" Reverse text.
+Plug 'tyru/operator-reverse.vim'
+
+" Search in a specific region.
+Plug 'osyo-manga/vim-operator-search'
+
+" Shiffle text.
+Plug 'pekepeke/vim-operator-shuffle'
+
+" Sort text characterwise and linewise.
+Plug 'emonkak/vim-operator-sort'
+
+" Super surround.
+Plug 'machakann/vim-sandwich'
+
+" Non-operators {{{3
+
+" Comment out.
+Plug 'tyru/caw.vim'
+
+" Align text.
+Plug 'junegunn/vim-easy-align', { 'on': '<Plug>(EasyAlign)' }
+
+
+" Text objects {{{2
+
+" Support for user-defined text objects.
+Plug 'kana/vim-textobj-user'
+
+" Text object for blockwise.
+Plug 'osyo-manga/vim-textobj-blockwise'
+
+" Text object for comment.
+Plug 'thinca/vim-textobj-comment'
+
+" Text object for continuous line.
+Plug 'rhysd/vim-textobj-continuous-line'
+
+" Text object for entire file.
+Plug 'kana/vim-textobj-entire'
+
+" Text object for function.
+Plug 'kana/vim-textobj-function'
+
+" Text object for indent.
+Plug 'kana/vim-textobj-indent'
+
+" Text object for last inserted text.
+Plug 'rhysd/vim-textobj-lastinserted'
+
+" Text object for last pasted text.
+Plug 'gilligan/textobj-lastpaste'
+
+" Text object for last searched pattern.
+Plug 'kana/vim-textobj-lastpat'
+
+" Text object for line.
+Plug 'kana/vim-textobj-line'
+
+" Text object for parameter.
+Plug 'sgur/vim-textobj-parameter'
+
+" Text object for space.
+Plug 'saihoooooooo/vim-textobj-space'
+
+" Text object for syntax.
+Plug 'kana/vim-textobj-syntax'
+
+" Text object for URL.
+Plug 'mattn/vim-textobj-url'
+
+" Text object for words in words.
+Plug 'h1mesuke/textobj-wiw'
+
+
+" Search {{{2
+
+" Extend * and #.
+Plug 'haya14busa/vim-asterisk'
+
+" Extend incremental search.
+Plug 'haya14busa/incsearch.vim'
+
+" NOTE: it is a fork version of jremmen/vim-ripgrep
+" Integration with ripgrep, fast alternative of grep command.
+Plug 'nsfisis/vim-ripgrep', { 'on': 'Rg' }
+
+
+" Files {{{2
+
+" Switch to related files.
+Plug 'kana/vim-altr'
+
+" Fast Fuzzy Finder.
+Plug 'ctrlpvim/ctrlp.vim', { 'on': '<Plug>(ctrlp)' }
+
+" CtrlP's matcher by builtin `matchfuzzy()`.
+Plug 'mattn/ctrlp-matchfuzzy', { 'on': '<Plug>(ctrlp)' }
+
+" Filer for minimalists.
+Plug 'justinmk/vim-dirvish'
+
+
+" Appearance {{{2
+
+" Show highlight.
+Plug 'cocopon/colorswatch.vim', { 'on': 'ColorSwatchGenerate' }
+
+" NOTE: it is a fork of godlygeek/csapprox
+" Make gui-only color schemes 256colors-compatible.
+Plug 'nsfisis/csapprox'
+
+" Makes folding text cool.
+Plug 'LeafCage/foldCC.vim'
+
+" Show indent.
+Plug 'Yggdroot/indentLine'
+
+" Cool status line.
+Plug 'itchyny/lightline.vim'
+
+" Highlight matched parentheses.
+Plug 'itchyny/vim-parenmatch'
+
+" Highlight specified words.
+Plug 't9md/vim-quickhl', { 'on': [ 'QuickhlManualReset', '<Plug>(quickhl-manual-this)'] }
+
+
+" Filetypes {{{2
+
+" Syntax {{{3
+
+" HCL
+Plug 'b4b4r07/vim-hcl'
+
+" JavaScript
+Plug 'pangloss/vim-javascript', { 'for': 'javascript' }
+
+" JSON5
+Plug 'GutenYe/json5.vim'
+
+" MoonScript
+Plug 'leafo/moonscript-vim'
+
+" Nginx conf
+Plug 'chr4/nginx.vim'
+
+" Rust
+Plug 'rust-lang/rust.vim', { 'for': 'rust' }
+
+" TOML
+Plug 'cespare/vim-toml', { 'for': 'toml' }
+
+" TypeScript
+Plug 'leafgarland/typescript-vim', { 'for': 'typescript' }
+
+" Tools {{{3
+
+" C/C++: clang-format
+Plug 'rhysd/vim-clang-format', { 'for': ['c', 'cpp'] }
+
+" Python: autopep8
+Plug 'tell-k/vim-autopep8', { 'for': 'python' }
+
+
+" QoL {{{2
+
+" If a directory is missing, make it automatically.
+Plug 'mopp/autodirmake.vim'
+
+" Capture the output of a command.
+Plug 'tyru/capture.vim'
+
+" Write git commit message.
+Plug 'rhysd/committia.vim'
+
+" Motion on speed.
+Plug 'easymotion/vim-easymotion', { 'on': [
+ \ '<Plug>(easymotion-Fl)',
+ \ '<Plug>(easymotion-N)',
+ \ '<Plug>(easymotion-Tl)',
+ \ '<Plug>(easymotion-bd-w)',
+ \ '<Plug>(easymotion-fl)',
+ \ '<Plug>(easymotion-j)',
+ \ '<Plug>(easymotion-k)',
+ \ '<Plug>(easymotion-n)',
+ \ '<Plug>(easymotion-s2)',
+ \ '<Plug>(easymotion-tl)',
+ \ ] }
+
+" Integration with EditorConfig (https://editorconfig.org)
+Plug 'editorconfig/editorconfig-vim'
+
+" Extend J.
+Plug 'osyo-manga/vim-jplus'
+
+" Improve behaviors of I, A and gI in Blockwise-Visual mode.
+Plug 'kana/vim-niceblock'
+
+" Edit QuickFix and reflect to original buffers.
+Plug 'thinca/vim-qfreplace'
+
+" Run anything.
+Plug 'thinca/vim-quickrun'
+
+" Extend dot-repeat.
+Plug 'tpope/vim-repeat'
+
+" Split one line format and Join multiline format.
+Plug 'AndrewRadev/splitjoin.vim'
+
+" Introduce user-defined mode.
+Plug 'kana/vim-submode'
+
+" Swap arguments.
+Plug 'machakann/vim-swap'
+
+" Adjust window size.
+Plug 'rhysd/vim-window-adjuster'
+
+" Remember yank history and paste them.
+Plug 'LeafCage/yankround.vim'
+
+
+" === END === {{{2
+
+Plug g:MY_ENV.my_dir
+
+call plug#end()
+
+
+
+
+" Autocommands {{{1
+
+" Auto-resize windows when Vim is resized.
+Autocmd VimResized * wincmd =
+
+
+" Calculate 'numberwidth' to fit file size.
+" Note: extra 2 is the room of left and right spaces.
+Autocmd BufEnter,WinEnter,BufWinEnter *
+ \ let &l:numberwidth = len(line('$')) + 2
+
+
+" Jump to the last cursor position when you open a file.
+Autocmd BufRead *
+ \ if 0 < line("'\"") && line("'\"") <= line('$') &&
+ \ &filetype !~# 'commit' && &filetype !~# 'rebase' |
+ \ execute "normal g`\"" |
+ \ endif
+
+
+" Syntax highlight for .vimrc {{{2
+
+Autocmd Filetype vim
+ \ if expand('%') =~? 'vimrc' || expand('%') =~? 'init.vim' |
+ \ call s:highlight_vimrc() |
+ \ endif
+
+
+function! s:highlight_vimrc() abort
+ " Autocmd
+ syn keyword vimrcAutocmd Autocmd skipwhite nextgroup=vimAutoEventList
+
+ " Plugin manager command
+ syn keyword vimrcPluginManager Plug
+
+ hi def link vimrcAutocmd vimAutocmd
+ hi def link vimrcPluginManager vimCommand
+endfunction
+
+
+
+Autocmd ColorScheme ocean call s:extra_highlight()
+
+
+function! s:extra_highlight() abort
+ if &background != 'dark'
+ return
+ endif
+
+ hi! link YankRoundRegion DiffChange
+
+ hi! link OperatorSandwichBuns DiffChange
+ hi! link OperatorSandwichStuff DiffChange
+ hi! link OperatorSandwichDelete DiffChange
+ hi! link OperatorSandwichAdd OperatorSandwichBuns
+
+ hi EasyMotionShade guifg=#4d4d4d guibg=NONE gui=NONE cterm=NONE
+ hi EasyMotionTarget guifg=#ff7100 guibg=NONE gui=underline cterm=underline
+ hi! link EasyMotionMoveHL IncSearch
+endfunction
+
+
+
+
+" Mappings {{{1
+
+" Note: |:noremap| defines mappings in |Normal|, |Visual|, |Operator-Pending|
+" and |Select| mode. Because I don't use |Select| mode, I use |:noremap| as
+" substitute of |:nnoremap|, |:xnoremap| and |:onoremap| for simplicity.
+
+
+" Fix the search direction. {{{2
+
+noremap <expr> gn v:searchforward ? 'gn' : 'gN'
+noremap <expr> gN v:searchforward ? 'gN' : 'gn'
+
+noremap <expr> n v:searchforward ? 'n' : 'N'
+noremap <expr> N v:searchforward ? 'N' : 'n'
+
+
+
+nnoremap <silent> & :%&&<CR>
+xnoremap <silent> & :%&&<CR>
+
+
+
+" Registers and macros. {{{2
+
+
+" Access an resister in the same way in Insert and Commandline mode.
+nnoremap <C-r> "
+xnoremap <C-r> "
+
+
+" Paste clipboard content with 'paste' enabled
+function! s:paste_clipboard_content_with_paste_opt() abort
+ let old_paste = &paste
+ set paste
+ set pastetoggle=<Plug>(pastetoggle)
+ if old_paste
+ return "\<C-r>+"
+ else
+ " 'paste' was off when the function was called. Then, 'paste' will be
+ " disabled via 'pastetoggle'.
+ return "\<C-r>+\<Plug>(pastetoggle)"
+ endif
+endfunction
+
+" Automatically enable 'paste' and disable it after pasting clipboard's
+" content.
+inoremap <expr> <C-r>+ <SID>paste_clipboard_content_with_paste_opt()
+
+
+let @j = 'j.'
+let @k = 'k.'
+let @n = 'n.'
+nnoremap @N N.
+
+" Repeat the last executed macro as many times as possible.
+" a => all
+" Note: "let @a = '@@'" does not work well.
+nnoremap @a 9999@@
+
+
+" Execute the last executed macro again.
+nnoremap ` @@
+
+
+
+" Emacs like key mappings in Insert and CommandLine mode. {{{2
+
+function! s:go_to_beginning_of_line() abort
+ if col('.') == match(getline('.'), '\S') + 1
+ return repeat("\<C-g>U\<Left>", col('.') - 1)
+ else
+ return (col('.') < match(getline('.'), '\S')) ?
+ \ repeat("\<C-g>U\<Right>", match(getline('.'), '\S') - col('.') + 1) :
+ \ repeat("\<C-g>U\<Left>", col('.') - 1 - match(getline('.'), '\S'))
+ endif
+endfunction
+
+
+inoremap <C-d> <Del>
+
+" Go elsewhere without deviding the undo history.
+inoremap <expr> <C-a> <SID>go_to_beginning_of_line()
+inoremap <expr> <C-e> repeat('<C-g>U<Right>', col('$') - col('.'))
+inoremap <C-b> <C-g>U<Left>
+inoremap <C-f> <C-g>U<Right>
+
+" Delete something deviding the undo history.
+inoremap <C-u> <C-g>u<C-u>
+inoremap <C-w> <C-g>u<C-w>
+
+cnoremap <C-a> <Home>
+cnoremap <C-e> <End>
+cnoremap <C-f> <Right>
+cnoremap <C-b> <Left>
+cnoremap <C-n> <Down>
+cnoremap <C-p> <Up>
+cnoremap <C-d> <Del>
+
+cnoremap <Left> <Nop>
+inoremap <Left> <Nop>
+cnoremap <Right> <Nop>
+inoremap <Right> <Nop>
+
+
+
+
+function! s:my_gA()
+ let line = getline('.')
+ if match(line, ';;$') != -1 " For OCaml.
+ return "A\<C-g>U\<Left>\<C-g>U\<Left>"
+ elseif match(line, '[,;)]$') != -1
+ return "A\<C-g>U\<Left>"
+ else
+ return 'A'
+ endif
+endfunction
+
+nnoremap <expr> gA <SID>my_gA()
+
+
+
+" QuickFix or location list. {{{2
+
+nnoremap <silent> bb :<C-u>cc<CR>
+
+nnoremap <silent> bn :<C-u><C-r>=v:count1<CR>cnext<CR>
+nnoremap <silent> bp :<C-u><C-r>=v:count1<CR>cprevious<CR>
+
+nnoremap <silent> bf :<C-u>cfirst<CR>
+nnoremap <silent> bl :<C-u>clast<CR>
+
+nnoremap <silent> bS :colder<CR>
+nnoremap <silent> bs :cnewer<CR>
+
+
+
+" Operators {{{2
+
+" Throw deleted text into the black hole register ("_).
+nnoremap c "_c
+xnoremap c "_c
+nnoremap C "_C
+xnoremap C "_C
+
+
+noremap g= =
+
+
+noremap ml gu
+noremap mu gU
+
+noremap gu <Nop>
+noremap gU <Nop>
+xnoremap u <Nop>
+xnoremap U <Nop>
+
+
+xnoremap x "_x
+
+
+nnoremap Y y$
+" In Blockwise-Visual mode, select text linewise.
+" In default, select text characterwise, neither blockwise nor linewise.
+xnoremap <expr> Y mode() ==# 'V' ? 'y' : 'Vy'
+
+
+
+" Swap the keys entering Replace mode and Visual-Replace mode.
+nnoremap R gR
+nnoremap gR R
+nnoremap r gr
+nnoremap gr r
+
+
+nnoremap U <C-r>
+
+
+
+
+" Motions {{{2
+
+noremap H ^
+noremap L $
+noremap M %
+
+noremap gw b
+noremap gW B
+
+noremap k gk
+noremap j gj
+noremap gk k
+noremap gj j
+
+nnoremap gff gF
+
+
+
+" Tabpages and windows. {{{2
+
+function! s:move_current_window_to_tabpage() abort
+ if winnr('$') == 1
+ " Leave the current window and open it in a new tabpage.
+ " Because :wincmd T fails when the current tabpage has only one window.
+ tab split
+ else
+ " Close the current window and re-open it in a new tabpage.
+ wincmd T
+ endif
+endfunction
+
+
+function! s:bdelete_bang_with_confirm() abort
+ if s:getchar_with_prompt('Delete? (y/n) ') ==? 'y'
+ bdelete!
+ else
+ echo 'Canceled'
+ endif
+endfunction
+
+
+function! s:choose_window_interactively() abort
+ const indicators = [
+ \ 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';',
+ \ '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
+ \ ]
+
+ " List normal windows up to 20.
+ let wins = []
+ for winnr in range(1, winnr('$'))
+ if winnr !=# winnr() && win_gettype(winnr) ==# ''
+ call add(wins, win_getid(winnr))
+ endif
+ endfor
+ if len(indicators) < len(wins)
+ unlet wins[len(indicators):]
+ endif
+
+ if len(wins) ==# 0
+ return
+ endif
+ if len(wins) ==# 1
+ if wins[0] ==# win_getid()
+ call win_gotoid(wins[1])
+ else
+ call win_gotoid(wins[0])
+ endif
+ return
+ endif
+
+ " Show popups.
+ let popups = []
+ for i in range(len(wins))
+ let winid = wins[i]
+ let indicator = indicators[i]
+ let [winy, winx, winh, winw] = s:win_getrect(winid)
+ let buf_id = nvim_create_buf(v:false, v:true)
+ call nvim_buf_set_lines(buf_id, 0, -1, v:true, ['', ' ' . indicator . ' ', ''])
+ let popup = nvim_open_win(
+ \ buf_id,
+ \ v:false,
+ \ {
+ \ 'relative': 'win',
+ \ 'win': winid,
+ \ 'row': (winh - 5) / 2,
+ \ 'col': (winw - 9) / 2,
+ \ 'width': 5,
+ \ 'height': 3,
+ \ 'focusable': v:false,
+ \ 'style': 'minimal',
+ \ 'border': 'double',
+ \ 'noautocmd': v:true,
+ \ })
+ call add(popups, #{
+ \ winid: popup,
+ \ indicator: indicator,
+ \ target_winid: winid,
+ \ })
+ endfor
+
+ " Prompt
+ let result = s:getchar_with_prompt('Select window: ')
+
+ " Jump
+ let jump_target = -1
+ for popup in popups
+ if result ==? popup.indicator
+ let jump_target = popup.target_winid
+ endif
+ endfor
+ if jump_target !=# -1
+ call win_gotoid(jump_target)
+ endif
+
+ " Close popups
+ for popup in popups
+ call nvim_win_close(popup.winid, v:true)
+ endfor
+endfunction
+
+
+nnoremap <silent> tt :<C-u>tabnew<CR>
+nnoremap <silent> tT :<C-u>call <SID>move_current_window_to_tabpage()<CR>
+
+nnoremap <silent> tn :<C-u><C-r>=(tabpagenr() + v:count1 - 1) % tabpagenr('$') + 1<CR>tabnext<CR>
+nnoremap <silent> tp :<C-u><C-r>=(tabpagenr('$') * 10 + tabpagenr() - v:count1 - 1) % tabpagenr('$') + 1<CR>tabnext<CR>
+
+nnoremap <silent> tN :<C-u>tabmove +<CR>
+nnoremap <silent> tP :<C-u>tabmove -<CR>
+
+nnoremap <silent> tsh :<C-u>leftabove vsplit<CR>
+nnoremap <silent> tsj :<C-u>rightbelow split<CR>
+nnoremap <silent> tsk :<C-u>leftabove split<CR>
+nnoremap <silent> tsl :<C-u>rightbelow vsplit<CR>
+
+nnoremap <silent> tsH :<C-u>topleft vsplit<CR>
+nnoremap <silent> tsJ :<C-u>botright split<CR>
+nnoremap <silent> tsK :<C-u>topleft split<CR>
+nnoremap <silent> tsL :<C-u>botright vsplit<CR>
+
+nnoremap <silent> twh :<C-u>leftabove vnew<CR>
+nnoremap <silent> twj :<C-u>rightbelow new<CR>
+nnoremap <silent> twk :<C-u>leftabove new<CR>
+nnoremap <silent> twl :<C-u>rightbelow vnew<CR>
+
+nnoremap <silent> twH :<C-u>topleft vnew<CR>
+nnoremap <silent> twJ :<C-u>botright new<CR>
+nnoremap <silent> twK :<C-u>topleft new<CR>
+nnoremap <silent> twL :<C-u>botright vnew<CR>
+
+nnoremap th <C-w>h
+nnoremap tj <C-w>j
+nnoremap tk <C-w>k
+nnoremap tl <C-w>l
+
+nnoremap tH <C-w>H
+nnoremap tJ <C-w>J
+nnoremap tK <C-w>K
+nnoremap tL <C-w>L
+
+nnoremap tx <C-w>x
+
+" r => manual resize.
+" R => automatic resize.
+nnoremap tRH <C-w>_
+nnoremap tRW <C-w><Bar>
+nnoremap tRR <C-w>_<C-w><Bar>
+
+nnoremap t= <C-w>=
+
+nnoremap <silent> tq :<C-u>bdelete<CR>
+nnoremap <silent> tQ :<C-u>call <SID>bdelete_bang_with_confirm()<CR>
+
+nnoremap tc <C-w>c
+
+nnoremap to <C-w>o
+nnoremap <silent> tO :<C-u>tabonly<CR>
+
+nnoremap <silent> tg :<C-u>call <SID>choose_window_interactively()<CR>
+
+
+
+function! s:smart_open(command) abort
+ if winwidth(winnr()) < 150
+ let modifiers = 'topleft'
+ else
+ let modifiers = 'vertical botright'
+ endif
+
+ try
+ execute modifiers a:command
+ catch
+ echohl Error
+ echo v:exception
+ echohl None
+ return
+ endtry
+
+ if &filetype ==# 'help'
+ if &l:textwidth > 0
+ execute 'vertical resize' &l:textwidth
+ endif
+ " Help tags are often right-justfied, moving the cursor to BoL.
+ normal! 0
+ endif
+endfunction
+
+
+command! -nargs=+ -complete=command
+ \ SmartOpen
+ \ call s:smart_open(<q-args>)
+
+
+
+
+" Increment/decrement numbers {{{2
+
+" nnoremap + <C-a>
+" nnoremap - <C-x>
+" xnoremap + <C-a>
+" xnoremap - <C-x>
+" xnoremap g+ g<C-a>
+" xnoremap g- g<C-x>
+
+
+
+" Disable unuseful or dangerous mappings. {{{2
+
+" Disable Select mode.
+nnoremap gh <Nop>
+nnoremap gH <Nop>
+nnoremap g<C-h> <Nop>
+
+" Disable Ex mode.
+nnoremap Q <Nop>
+nnoremap gQ <Nop>
+
+nnoremap ZZ <Nop>
+nnoremap ZQ <Nop>
+
+
+" Help {{{2
+
+" Search help.
+nnoremap <C-h> :<C-u>SmartOpen help<Space>
+
+
+
+" For writing Vim script. {{{2
+
+
+if !v:vim_did_enter
+ " Define this function only when Vim is starting up. |v:vim_did_enter|
+ function! SourceThisFile() abort
+ let filename = expand('%')
+ if &filetype ==# 'vim' || expand('%:e') ==# 'vim' || filename =~# '\.g\?vimrc'
+ if &filetype !=# 'vim'
+ setfiletype vim
+ endif
+ update
+ unlet! g:loaded_{expand('%<')}
+ source %
+ else
+ echo filename ' is not a Vim Script.'
+ endif
+ endfunction
+endif
+
+
+
+nnoremap <silent> XV :<C-u>tabedit $MYVIMRC<CR>
+
+nnoremap <silent> XX :<C-u>call SourceThisFile()<CR>
+
+" See |numbered-function|.
+nnoremap <silent> XF :<C-u>function {<C-r>=v:count<CR>}<CR>
+
+nnoremap <silent> XM :<C-u>messages<CR>
+
+nnoremap <silent> XP :<C-u>call popup_clear(1)<CR>
+
+
+
+
+" Misc. {{{2
+
+onoremap <silent> gv :<C-u>normal! gv<CR>
+
+" Swap : and ;.
+nnoremap ; :
+nnoremap : ;
+xnoremap ; :
+xnoremap : ;
+nnoremap @; @:
+xnoremap @; @:
+cnoremap <C-r>; <C-r>:
+inoremap <C-r>; <C-r>:
+
+
+" Since <ESC> may be mapped to something else somewhere, it should be :map, not
+" :noremap.
+imap jk <ESC>
+cmap jk <ESC>
+
+
+
+nnoremap <silent> <C-c> :<C-u>nohlsearch<CR>
+
+
+
+nnoremap <silent> <Plug>(my-insert-blank-lines-after)
+ \ :<C-u>call <SID>insert_blank_line(0)<CR>
+nnoremap <silent> <Plug>(my-insert-blank-lines-before)
+ \ :<C-u>call <SID>insert_blank_line(1)<CR>
+
+nmap go <Plug>(my-insert-blank-lines-after)
+nmap gO <Plug>(my-insert-blank-lines-before)
+
+function! s:insert_blank_line(offset) abort
+ for i in range(v:count1)
+ call append(line('.') - a:offset, '')
+ endfor
+endfunction
+
+
+nnoremap <silent> <Space>w :<C-u>write<CR>
+
+
+" Abbreviations {{{1
+
+inoreabbrev retrun return
+inoreabbrev reutrn return
+inoreabbrev tihs this
+
+
+
+
+
+" Commands {{{1
+
+" Set 'makeprg' to `ninja` if `build.ninja` exists in the current working
+" directory. Then, execute :make command.
+command! -bang -bar -nargs=*
+ \ Make
+ \ if filereadable('build.ninja') |
+ \ let &makeprg = 'ninja' |
+ \ endif |
+ \ make<bang> <args>
+
+
+" Reverse a selected range in line-wise.
+" Note: directly calling `g/^/m` will overwrite the current search pattern with
+" '^' and highlight it, which is not expected.
+" :h :keeppatterns
+command! -bar -range=%
+ \ Reverse
+ \ keeppatterns <line1>,<line2>g/^/m<line1>-1
+
+
+function! s:dummy_man_command(mods, args) abort
+ " Delete the dummy command.
+ delcommand Man
+ " Load man.vim which defines |:Man|.
+ runtime ftplugin/man.vim
+ " Pass the given arguments to it.
+ execute printf("%s Man %s", a:mods, a:args)
+endfunction
+
+
+" To shorten Vim startup, lazily load ftplugin/man.vim.
+command! -complete=shellcmd -nargs=+
+ \ Man
+ \ call s:dummy_man_command(<q-mods>, <f-args>)
+
+
+
+
+" ftplugin {{{1
+
+" This command do the followings:
+" * Execute |:setlocal| for each options.
+" * Set information to restore the original setting to b:|undo_ftplugin|.
+
+" This command is used in ftplugin/*.vim.
+
+" Note: specify only single option.
+
+command! -nargs=+
+ \ FtpluginSetLocal
+ \ call s:ftplugin_setlocal(<q-args>)
+
+function! s:ftplugin_setlocal(qargs) abort
+ execute 'setlocal' a:qargs
+
+ let option_name = substitute(a:qargs, '\L.*', '', '')
+
+ if option_name ==# 'shiftwidth' && exists(':IndentLinesReset') ==# 2
+ IndentLinesReset
+ endif
+
+ if exists('b:undo_ftplugin')
+ let b:undo_ftplugin .= '|setlocal ' . option_name . '<'
+ else
+ let b:undo_ftplugin = 'setlocal ' . option_name . '<'
+ endif
+endfunction
+
+
+
+
+" Color scheme {{{1
+
+" A command which changes color scheme with fall back.
+command! -bang -nargs=?
+ \ ColorScheme
+ \ call s:colorscheme(<bang>0, <q-args>)
+
+
+function! s:colorscheme(bang, name) abort
+ try
+ if get(g:, 'colors_name') isnot# a:name || a:bang
+ execute 'colorscheme' a:name
+ endif
+ catch
+ " Loading colorscheme failed.
+ " The color scheme, "desert", is one of the built-in ones. Probably, it
+ " will be loaded without any errors.
+ colorscheme desert
+ endtry
+endfunction
+
+
+ColorScheme! ocean
+
+
+
+
+" Plugins configuration {{{1
+
+" Disable standard plugins. {{{2
+
+let g:loaded_2html_plugin = 1
+let g:loaded_getscriptPlugin = 1
+let g:loaded_gzip = 1
+let g:loaded_logiPat = 1
+let g:loaded_matchparen = 1
+let g:loaded_netrwPlugin = 1
+let g:loaded_rrhelper = 1
+let g:loaded_spellfile_plugin = 1
+let g:loaded_tarPlugin = 1
+let g:loaded_vimballPlugin = 1
+let g:loaded_zipPlugin = 1
+
+
+
+" altr {{{2
+
+" For vim
+call altr#define('autoload/%.vim', 'doc/%.txt', 'plugin/%.vim')
+" For C and C++
+call altr#define('%.c', '%.cpp', '%.cc', '%.h', '%.hh', '%.hpp')
+
+" Go to File Alternative
+nmap gfa <Plug>(altr-forward)
+
+
+
+
+" asterisk {{{2
+
+function! s:asterisk(ret, keeppos)
+ let g:asterisk#keeppos = a:keeppos
+ return a:ret
+endfunction
+
+" Do not keep the relative cursor position.
+nmap <expr> * <SID>asterisk('<Plug>(asterisk-z*)', 0)
+omap <expr> * <SID>asterisk('<Plug>(asterisk-z*)', 0)
+xmap <expr> * <SID>asterisk('<Plug>(asterisk-z*)', 0)
+nmap <expr> g* <SID>asterisk('<Plug>(asterisk-gz*)', 0)
+omap <expr> g* <SID>asterisk('<Plug>(asterisk-gz*)', 0)
+xmap <expr> g* <SID>asterisk('<Plug>(asterisk-gz*)', 0)
+
+" Keep the relative cursor position (use offset like /s+1).
+" Note: I fix the search direction in typing 'n' and 'N', so there is no
+" difference between '*' and '#'.
+nmap <expr> # <SID>asterisk('<Plug>(asterisk-z*)', 1)
+omap <expr> # <SID>asterisk('<Plug>(asterisk-z*)', 1)
+xmap <expr> # <SID>asterisk('<Plug>(asterisk-z*)', 1)
+nmap <expr> g# <SID>asterisk('<Plug>(asterisk-gz*)', 1)
+omap <expr> g# <SID>asterisk('<Plug>(asterisk-gz*)', 1)
+xmap <expr> g# <SID>asterisk('<Plug>(asterisk-gz*)', 1)
+
+
+
+" autodirmake {{{2
+
+let g:autodirmake#msg_highlight = 'Question'
+
+
+
+" autopep8 {{{2
+
+let g:autopep8_on_save = 1
+let g:autopep8_disable_show_diff = 1
+
+command!
+ \ Autopep8Disable
+ \ let g:autopep8_on_save = 0
+
+
+
+" caw {{{2
+
+let g:caw_no_default_keymappings = 1
+
+nmap m// <Plug>(caw:hatpos:toggle)
+xmap m// <Plug>(caw:hatpos:toggle)
+nmap m/w <Plug>(caw:wrap:comment)
+xmap m/w <Plug>(caw:wrap:comment)
+nmap m/W <Plug>(caw:wrap:uncomment)
+xmap m/W <Plug>(caw:wrap:uncomment)
+nmap m/b <Plug>(caw:box:comment)
+xmap m/b <Plug>(caw:box:comment)
+
+
+
+" clang-format {{{2
+
+let g:clang_format#auto_format = 1
+Autocmd FileType javascript ClangFormatAutoDisable
+Autocmd FileType typescript ClangFormatAutoDisable
+
+
+
+" ctrlp {{{2
+
+let g:ctrlp_map = '<Space>f'
+let g:ctrlp_match_func = {'match': 'ctrlp_matchfuzzy#matcher'}
+
+
+
+" dirvish {{{2
+
+" Prevent dirvish from mapping hyphen key to "<Plug>(dirvish_up)".
+" nmap <Plug>(nomap-dirvish_up) <Plug>(dirvish_up)
+
+
+
+" easyalign {{{2
+
+nmap = <Plug>(EasyAlign)
+xmap = <Plug>(EasyAlign)
+
+
+
+" easymotion {{{2
+
+let g:EasyMotion_keys = 'asdfghweryuiocvbnmjkl;'
+let g:EasyMotion_space_jump_first = 1
+let g:EasyMotion_do_shade = 0
+let g:EasyMotion_do_mappings = 0
+let g:EasyMotion_smartcase = 1
+let g:EasyMotion_verbose = 0
+let g:EasyMotion_startofline = 0
+
+nmap f <Plug>(easymotion-fl)
+omap f <Plug>(easymotion-fl)
+xmap f <Plug>(easymotion-fl)
+nmap F <Plug>(easymotion-Fl)
+omap F <Plug>(easymotion-Fl)
+xmap F <Plug>(easymotion-Fl)
+omap t <Plug>(easymotion-tl)
+xmap t <Plug>(easymotion-tl)
+omap T <Plug>(easymotion-Tl)
+xmap T <Plug>(easymotion-Tl)
+
+" Note: Don't use the following key sequences! It is used 'vim-sandwich'.
+" * sa
+" * sd
+" * sr
+nmap ss <Plug>(easymotion-s2)
+omap ss <Plug>(easymotion-s2)
+xmap ss <Plug>(easymotion-s2)
+nmap sw <Plug>(easymotion-bd-w)
+omap sw <Plug>(easymotion-bd-w)
+xmap sw <Plug>(easymotion-bd-w)
+nmap sn <Plug>(easymotion-n)
+omap sn <Plug>(easymotion-n)
+xmap sn <Plug>(easymotion-n)
+nmap sN <Plug>(easymotion-N)
+omap sN <Plug>(easymotion-N)
+xmap sN <Plug>(easymotion-N)
+nmap sj <Plug>(easymotion-j)
+omap sj <Plug>(easymotion-j)
+xmap sj <Plug>(easymotion-j)
+nmap sk <Plug>(easymotion-k)
+omap sk <Plug>(easymotion-k)
+xmap sk <Plug>(easymotion-k)
+
+
+
+" eskk {{{2
+
+let g:eskk#dictionary = {
+ \ 'path': g:MY_ENV.skk_dir . '/jisyo',
+ \ 'sorted': 0,
+ \ 'encoding': 'utf-8',
+ \ }
+
+let g:eskk#large_dictionary = {
+ \ 'path': g:MY_ENV.skk_dir . '/jisyo.L',
+ \ 'sorted': 1,
+ \ 'encoding': 'euc-jp',
+ \ }
+
+let g:eskk#backup_dictionary = g:eskk#dictionary.path . ".bak"
+
+let g:eskk#kakutei_when_unique_candidate = v:true
+let g:eskk#enable_completion = v:false
+" let g:eskk#no_default_mappings = v:true
+
+
+function! s:eskk_initialize_pre() abort
+ let t = eskk#table#new('rom_to_hira*', 'rom_to_hira')
+ call t.add_map('z ', ' ')
+ call t.add_map('0.', '0.')
+ call t.add_map('1.', '1.')
+ call t.add_map('2.', '2.')
+ call t.add_map('3.', '3.')
+ call t.add_map('4.', '4.')
+ call t.add_map('5.', '5.')
+ call t.add_map('6.', '6.')
+ call t.add_map('7.', '7.')
+ call t.add_map('8.', '8.')
+ call t.add_map('9.', '9.')
+ call eskk#register_mode_table('hira', t)
+endfunction
+
+
+Autocmd User eskk-initialize-pre call s:eskk_initialize_pre()
+
+
+function! s:eskk_initialize_post() abort
+ " I don't use hankata mode for now.
+ EskkUnmap -type=mode:hira:toggle-hankata
+ EskkUnmap -type=mode:kata:toggle-hankata
+
+ " I don't use abbrev mode for now.
+ EskkUnmap -type=mode:hira:to-abbrev
+ EskkUnmap -type=mode:kata:to-abbrev
+
+ " I don't use ascii mode for now.
+ EskkUnmap -type=mode:hira:to-ascii
+ EskkUnmap -type=mode:kata:to-ascii
+
+ " Instead, l key disable SKK input.
+ EskkMap -type=disable l
+ EskkMap -type=disable l
+endfunction
+
+
+Autocmd User eskk-initialize-post call s:eskk_initialize_post()
+
+
+
+" foldcc {{{2
+
+set foldtext=FoldCCtext()
+let g:foldCCtext_head = 'repeat(">", v:foldlevel) . " "'
+
+
+
+" incsearch {{{2
+
+" let g:incsearch#magic = '\v'
+
+nmap / <Plug>(incsearch-forward)
+omap / <Plug>(incsearch-forward)
+xmap / <Plug>(incsearch-forward)
+nmap ? <Plug>(incsearch-backward)
+omap ? <Plug>(incsearch-backward)
+xmap ? <Plug>(incsearch-backward)
+nmap g/ <Plug>(incsearch-stay)
+omap g/ <Plug>(incsearch-stay)
+xmap g/ <Plug>(incsearch-stay)
+
+
+
+" indentline {{{2
+
+let g:indentLine_conceallevel = 1
+let g:indentLine_fileTypeExclude = ['help']
+
+
+
+" jplus {{{2
+
+let g:jplus#input_config = {
+ \ '__DEFAULT__': {'delimiter_format': ' %d '},
+ \ '__EMPTY__': {'delimiter_format': ''},
+ \ ' ': {'delimiter_format': ' '},
+ \ ',': {'delimiter_format': '%d '},
+ \ ';': {'delimiter_format': '%d '},
+ \ 'l': {'delimiter_format': ''},
+ \ 'L': {'delimiter_format': ''},
+ \ "\<Tab>": {'delimiter_format': '%d'},
+ \ }
+nmap J <Plug>(jplus-getchar)
+xmap J <Plug>(jplus-getchar)
+nmap gJ <Plug>(jplus-input)
+xmap gJ <Plug>(jplus-input)
+
+
+
+" lightline {{{2
+
+let g:lightline = {
+ \ 'colorscheme': 'jellybeans',
+ \ 'active': {
+ \ 'left': [['mode', 'paste'], ['readonly', 'filename', 'modified']],
+ \ 'right': [['linenum'], ['fileencoding', 'fileformat', 'filetype']]
+ \ },
+ \ 'inactive': {
+ \ 'left': [['readonly', 'filename', 'modified']],
+ \ 'right': [['linenum'], ['fileencoding', 'fileformat', 'filetype']]
+ \ },
+ \ 'component_function': {
+ \ 'mode': 'Lightline_mode',
+ \ 'linenum': 'Lightline_linenum',
+ \ 'fileformat': 'Lightline_fileformat',
+ \ },
+ \ 'mode_map': {
+ \ 'n' : 'N',
+ \ 'i' : 'I',
+ \ 'R' : 'R',
+ \ 'v' : 'V',
+ \ 'V' : 'V-L',
+ \ "\<C-v>": 'V-B',
+ \ 'c' : 'C',
+ \ 's' : 'S',
+ \ 'S' : 'S-L',
+ \ "\<C-s>": 'S-B',
+ \ 't': 'T',
+ \ },
+ \ 'tabline': {
+ \ 'left': [['tabs']],
+ \ 'right': [],
+ \ },
+ \ 'tab': {
+ \ 'active': ['tabnum', 'filename', 'modified'],
+ \ 'inactive': ['tabnum', 'filename', 'modified'],
+ \ },
+ \ }
+
+function! Lightline_mode()
+ " Calling `eskk#statusline()` makes Vim autoload eskk. If you call it
+ " without checking `g:loaded_autoload_eskk`, eskk is loaded on an early
+ " stage of the initialization (probably the first rendering of status line),
+ " which slows down Vim startup. Loading eskk can be delayed by checking both
+ " of `g:loaded_eskk` and `g:loaded_autoload_eskk`.
+ if exists('g:loaded_eskk') && exists('g:loaded_autoload_eskk')
+ let skk = eskk#statusline(' (%s)', '')
+ else
+ let skk = ''
+ endif
+ return lightline#mode() . skk
+endfunction
+
+function! Lightline_linenum()
+ return line('.') . '/' . line('$')
+endfunction
+
+function! Lightline_fileformat()
+ if &fileformat ==# 'unix'
+ return 'LF'
+ elseif &fileformat ==# 'dos'
+ return 'CRLF'
+ elseif &fileformat ==# 'mac'
+ return 'CR'
+ else
+ return '-'
+ endif
+endfunction
+
+
+
+" vim-lsp {{{2
+
+" TODO
+
+
+
+" niceblock {{{2
+
+xmap I <Plug>(niceblock-I)
+xmap gI <Plug>(niceblock-gI)
+xmap A <Plug>(niceblock-A)
+
+
+
+
+
+
+" operator-replace {{{2
+
+nmap <C-p> <Plug>(operator-replace)
+omap <C-p> <Plug>(operator-replace)
+xmap <C-p> <Plug>(operator-replace)
+
+
+
+" operator-search {{{2
+
+" Note: m/ is the prefix of comment out.
+nmap m? <Plug>(operator-search)
+omap m? <Plug>(operator-search)
+xmap m? <Plug>(operator-search)
+
+
+
+" prettyprint {{{2
+
+let g:prettyprint_indent = 2
+let g:prettyprint_string = ['split']
+let g:prettyprint_show_expression = 1
+
+
+
+" qfreplace {{{2
+
+nnoremap <silent> br :<C-u>Qfreplace SmartOpen<CR>
+
+
+
+" quickhl {{{2
+
+" TODO: CUI
+let g:quickhl_manual_colors = [
+ \ 'guifg=#101020 guibg=#8080c0 gui=bold',
+ \ 'guifg=#101020 guibg=#80c080 gui=bold',
+ \ 'guifg=#101020 guibg=#c08080 gui=bold',
+ \ 'guifg=#101020 guibg=#80c0c0 gui=bold',
+ \ 'guifg=#101020 guibg=#c0c080 gui=bold',
+ \ 'guifg=#101020 guibg=#a0a0ff gui=bold',
+ \ 'guifg=#101020 guibg=#a0ffa0 gui=bold',
+ \ 'guifg=#101020 guibg=#ffa0a0 gui=bold',
+ \ 'guifg=#101020 guibg=#a0ffff gui=bold',
+ \ 'guifg=#101020 guibg=#ffffa0 gui=bold',
+ \ ]
+
+nmap " <Plug>(quickhl-manual-this)
+xmap " <Plug>(quickhl-manual-this)
+nnoremap <silent> <C-c> :<C-u>nohlsearch <Bar> QuickhlManualReset<CR>
+
+
+
+" quickrun {{{2
+
+let g:quickrun_no_default_key_mappings = 1
+
+if !exists('g:quickrun_config')
+ let g:quickrun_config = {}
+endif
+let g:quickrun_config.cpp = {
+ \ 'cmdopt': '--std=c++17 -Wall -Wextra',
+ \ }
+let g:quickrun_config.d = {
+ \ 'exec': 'dub run',
+ \ }
+let g:quickrun_config.haskell = {
+ \ 'exec': ['stack build', 'stack exec %{matchstr(globpath(".,..,../..,../../..", "*.cabal"), "\\w\\+\\ze\\.cabal")}'],
+ \ }
+let g:quickrun_config.python = {
+ \ 'command': 'python3',
+ \ }
+
+
+nmap BB <Plug>(quickrun)
+xmap BB <Plug>(quickrun)
+" nnoremap BB make<CR>
+
+
+
+
+" repeat {{{2
+
+nmap U <Plug>(RepeatRedo)
+" Autoload vim-repeat immediately in order to make <Plug>(RepeatRedo) available.
+" repeat#setreg() does nothing here.
+call repeat#setreg('', '')
+
+
+" Make them repeatable with vim-repeat.
+nnoremap <silent> <Plug>(my-insert-blank-lines-after)
+ \ :<C-u>call <SID>insert_blank_line(0)<Bar>
+ \ silent! call repeat#set("\<Lt>Plug>(my-insert-blank-lines-after)")<CR>
+nnoremap <silent> <Plug>(my-insert-blank-lines-before)
+ \ :<C-u>call <SID>insert_blank_line(1)<Bar>
+ \ silent! call repeat#set("\<Lt>Plug>(my-insert-blank-lines-before)")<CR>
+
+
+
+" ripgrep {{{2
+
+" Workaround: do not open quickfix window.
+" exe g:rg_window_location 'copen'
+let g:rg_window_location = 'silent! echo'
+let g:rg_jump_to_first = 1
+
+command! -bang -nargs=* -complete=file -bar
+ \ RG
+ \ Rg<bang> <args>
+
+
+" rust {{{2
+
+let g:rustfmt_autosave = 1
+
+
+
+
+" sandwich {{{2
+
+
+
+
+
+
+" splitjoin {{{2
+
+" Note: Don't use J{any sign}, 'Jl' and 'JL'. They will conflict with 'vim-jplus'.
+let g:splitjoin_split_mapping = ''
+let g:splitjoin_join_mapping = ''
+
+nnoremap <silent> JS :<C-u>SplitjoinSplit<CR>
+nnoremap <silent> JJ :<C-u>SplitjoinJoin<CR>
+
+
+
+" submode {{{2
+
+" Global settings {{{3
+let g:submode_always_show_submode = 1
+let g:submode_keyseqs_to_leave = ['<C-c>', '<ESC>']
+let g:submode_keep_leaving_key = 1
+
+" yankround {{{3
+call submode#enter_with('YankRound', 'nv', 'rs', 'gp', '<Plug>(yankround-p)')
+call submode#enter_with('YankRound', 'nv', 'rs', 'gP', '<Plug>(yankround-P)')
+call submode#map('YankRound', 'nv', 'rs', 'p', '<Plug>(yankround-prev)')
+call submode#map('YankRound', 'nv', 'rs', 'P', '<Plug>(yankround-next)')
+
+" swap {{{3
+call submode#enter_with('Swap', 'n', 'r', 'g>', '<Plug>(swap-next)')
+call submode#map('Swap', 'n', 'r', '<', '<Plug>(swap-prev)')
+call submode#enter_with('Swap', 'n', 'r', 'g<', '<Plug>(swap-prev)')
+call submode#map('Swap', 'n', 'r', '>', '<Plug>(swap-next)')
+
+" Resizing a window (height) {{{3
+call submode#enter_with('WinResizeH', 'n', '', 'trh')
+call submode#enter_with('WinResizeH', 'n', '', 'trh')
+call submode#map('WinResizeH', 'n', '', '+', '<C-w>+')
+call submode#map('WinResizeH', 'n', '', '-', '<C-w>-')
+
+" Resizing a window (width) {{{3
+call submode#enter_with('WinResizeW', 'n', '', 'trw')
+call submode#enter_with('WinResizeW', 'n', '', 'trw')
+call submode#map('WinResizeW', 'n', '', '+', '<C-w>>')
+call submode#map('WinResizeW', 'n', '', '-', '<C-w><Lt>')
+
+" Super undo/redo {{{3
+call submode#enter_with('Undo/Redo', 'n', '', 'gu', 'g-')
+call submode#map('Undo/Redo', 'n', '', 'u', 'g-')
+call submode#enter_with('Undo/Redo', 'n', '', 'gU', 'g+')
+call submode#map('Undo/Redo', 'n', '', 'U', 'g+')
+
+
+
+" swap {{{2
+
+let g:swap_no_default_key_mappings = 1
+
+
+
+" textobj-continuousline {{{2
+
+let g:textobj_continuous_line_no_default_key_mappings = 1
+
+omap aL <Plug>(textobj-continuous-cpp-a)
+xmap aL <Plug>(textobj-continuous-cpp-a)
+omap iL <Plug>(textobj-continuous-cpp-i)
+xmap iL <Plug>(textobj-continuous-cpp-i)
+
+Autocmd FileType vim omap <buffer> aL <Plug>(textobj-continuous-vim-a)
+Autocmd FileType vim xmap <buffer> aL <Plug>(textobj-continuous-vim-a)
+Autocmd FileType vim omap <buffer> iL <Plug>(textobj-continuous-vim-i)
+Autocmd FileType vim xmap <buffer> iL <Plug>(textobj-continuous-vim-i)
+
+
+
+" textobj-lastpaste {{{2
+
+let g:textobj_lastpaste_no_default_key_mappings = 1
+
+omap iP <Plug>(textobj-lastpaste-i)
+xmap iP <Plug>(textobj-lastpaste-i)
+omap aP <Plug>(textobj-lastpaste-a)
+xmap aP <Plug>(textobj-lastpaste-a)
+
+
+
+" textobj-space {{{2
+
+let g:textobj_space_no_default_key_mappings = 1
+
+omap a<Space> <Plug>(textobj-space-a)
+xmap a<Space> <Plug>(textobj-space-a)
+omap i<Space> <Plug>(textobj-space-i)
+xmap i<Space> <Plug>(textobj-space-i)
+
+
+" textobj-wiw {{{2
+
+let g:textobj_wiw_no_default_key_mappings = 1
+
+nmap <C-w> <Plug>(textobj-wiw-n)
+omap <C-w> <Plug>(textobj-wiw-n)
+xmap <C-w> <Plug>(textobj-wiw-n)
+nmap g<C-w> <Plug>(textobj-wiw-p)
+omap g<C-w> <Plug>(textobj-wiw-p)
+xmap g<C-w> <Plug>(textobj-wiw-p)
+nmap <C-e> <Plug>(textobj-wiw-N)
+omap <C-e> <Plug>(textobj-wiw-N)
+xmap <C-e> <Plug>(textobj-wiw-N)
+nmap g<C-e> <Plug>(textobj-wiw-P)
+omap g<C-e> <Plug>(textobj-wiw-P)
+xmap g<C-e> <Plug>(textobj-wiw-P)
+
+omap a<C-w> <Plug>(textobj-wiw-a)
+xmap a<C-w> <Plug>(textobj-wiw-a)
+omap i<C-w> <Plug>(textobj-wiw-i)
+xmap i<C-w> <Plug>(textobj-wiw-i)
+
+
+
+" window-adjuster {{{2
+
+nnoremap <silent> tRw :<C-u>AdjustScreenWidth<CR>
+nnoremap <silent> tRh :<C-u>AdjustScreenHeight<CR>
+nnoremap <silent> tRr :<C-u>AdjustScreenWidth <Bar> AdjustScreenHeight<CR>
+
+
+
+
+
+" yankround {{{2
+
+let g:yankround_dir = g:MY_ENV.yankround_dir
+let g:yankround_use_region_hl = 1
+
+
+
+
+
+
+
+
+
+
+
+" Utilities {{{1
+
+"" Wrapper of |getchar()|.
+function! s:getchar()
+ let ch = getchar()
+ while ch == "\<CursorHold>"
+ let ch = getchar()
+ endwhile
+ return type(ch) == v:t_number ? nr2char(ch) : ch
+endfunction
+
+
+"" Wrapper of |:echo| and |:echohl|.
+function! s:echo(message, ...) abort
+ let highlight = get(a:000, 0, 'None')
+ redraw
+ execute 'echohl' highlight
+ echo a:message
+ echohl None
+endfunction
+
+
+"" Wrapper of |getchar()|.
+function! s:getchar_with_prompt(prompt) abort
+ call s:echo(a:prompt)
+ return s:getchar()
+endfunction
+
+
+"" Wrapper of |input()|.
+"" Only when it is used in a mapping, |inputsave()| and |inputstore()| are
+"" required.
+function! s:input(...) abort
+ call inputsave()
+ let result = call('input', a:000)
+ call inputrestore()
+ return result
+endfunction
+
+
+"" Wrapper of |win_screenpos()|, |winheight()| and |winwidth()|.
+"" Returns quadruple consisting of y, x, width and height.
+function! s:win_getrect(...) abort
+ let win = get(a:000, 0, 0)
+ let [y, x] = win_screenpos(win)
+ let h = winheight(win)
+ let w = winwidth(win)
+ return [y, x, h, w]
+endfunction
+
+
+
+" Modelines {{{1
+" vim: expandtab:softtabstop=4:shiftwidth=4:textwidth=80:colorcolumn=+1:
+" vim: foldenable:foldmethod=marker:foldlevel=0:
diff --git a/.vimrc b/.vimrc
index fcdafc1..ba26676 100644
--- a/.vimrc
+++ b/.vimrc
@@ -7,7 +7,7 @@ scriptencoding utf-8
" Global settings {{{1
-" Global variables. {{{2
+" Global constants {{{2
let g:MY_ENV = {}
@@ -33,24 +33,23 @@ if empty($XDG_CACHE_HOME)
else
let g:MY_ENV.cache_home = $XDG_CONFIG_HOME
endif
-
-if has('nvim')
- let g:MY_ENV.config_dir = g:MY_ENV.config_home . '/nvim'
-else
- let g:MY_ENV.config_dir = g:MY_ENV.config_home . '/vim'
-endif
-if has('nvim')
- let g:MY_ENV.cache_dir = g:MY_ENV.cache_home . '/nvim'
+if empty($XDG_DATA_HOME)
+ let g:MY_ENV.data_home = $HOME . '/.local/share'
else
- let g:MY_ENV.cache_dir = g:MY_ENV.cache_home . '/vim'
+ let g:MY_ENV.data_home = $XDG_DATA_HOME
endif
+let g:MY_ENV.config_dir = g:MY_ENV.config_home . '/vim'
+let g:MY_ENV.cache_dir = g:MY_ENV.cache_home . '/vim'
+let g:MY_ENV.data_dir = g:MY_ENV.data_home . '/vim'
+
let g:MY_ENV.my_dir = g:MY_ENV.config_dir . '/my'
let g:MY_ENV.plug_dir = g:MY_ENV.config_dir . '/plugged'
-let g:MY_ENV.undo_dir = g:MY_ENV.cache_dir . '/undo'
-let g:MY_ENV.backup_dir = g:MY_ENV.cache_dir . '/backup'
-let g:MY_ENV.swap_dir = g:MY_ENV.cache_dir . '/swap'
-let g:MY_ENV.yankround_dir = g:MY_ENV.cache_dir . '/yankround'
+let g:MY_ENV.undo_dir = g:MY_ENV.data_dir . '/undo'
+let g:MY_ENV.backup_dir = g:MY_ENV.data_dir . '/backup'
+let g:MY_ENV.swap_dir = g:MY_ENV.data_dir . '/swap'
+let g:MY_ENV.vimindo = g:MY_ENV.data_dir . '/viminfo'
+let g:MY_ENV.yankround_dir = g:MY_ENV.data_dir . '/yankround'
let g:MY_ENV.skk_dir = g:MY_ENV.config_home . '/skk'
for [s:k, s:v] in items(g:MY_ENV)
@@ -110,16 +109,13 @@ set wrap
set linebreak
set breakindent
set breakindentopt+=sbr
-" Use let statement to avoid trailing space.
let &showbreak = '> '
set sidescrolloff=20
set display=lastline
-" Use let statement to avoid trailing space.
let &fillchars = 'stl: ,stlnc: ,vert: ,fold: ,diff: '
set cmdheight=2
set list
-let &listchars="eol:\u00ac,tab:\u25b8 ,extends:\u00bb,precedes:\u00ab"
-set conceallevel=2
+let &listchars="eol:\u00ac,tab:\u25b8 ,trail:\u00b7,extends:\u00bb,precedes:\u00ab"
set concealcursor=cnv
@@ -138,15 +134,12 @@ if exists('+termguicolors')
set termguicolors
endif
set t_Co=256
-set nocursorline
set colorcolumn=+1
" Multiple windows {{{2
set laststatus=2
-set equalalways
-set eadirection=both
set winminheight=0
set hidden
set switchbuf=usetab
@@ -174,9 +167,9 @@ set mouse=
" Messages and info {{{2
set shortmess+=a
- \ shortmess+=s
- \ shortmess+=I
- \ shortmess+=c
+set shortmess+=s
+set shortmess+=I
+set shortmess+=c
set showcmd
set noshowmode
set report=999
@@ -197,14 +190,13 @@ set undofile
let &undodir = g:MY_ENV.undo_dir
set textwidth=0
set backspace=indent,eol,start
-set complete+=t
set completeopt-=preview
set pumheight=10
set noshowmatch
set matchpairs+=<:>
set nojoinspaces
set nrformats-=octal
- \ nrformats+=unsigned
+set nrformats+=unsigned
@@ -252,7 +244,7 @@ set ttimeoutlen=100
set nofixendofline
" Note: if 'fileformat' is empty, the first item of 'fileformats' is used.
-set fileformats=unix,dos,mac
+set fileformats=unix,dos
" Note: these settings make one backup. If you want more backups, see
" |'backupext'|.
set backup
@@ -266,7 +258,7 @@ set autoread
" Note: 'dictionary' is swap files' directory.
" '//' is converted to swap file's path.
-" If you are editing 'a/b.vim', Vim makes '{g:MY_ENV.cache_dir}/swap/a/b.vim'.
+" If you are editing 'a/b.vim', Vim makes '{g:MY_ENV.swap_dir}/a/b.vim'.
let &directory = g:MY_ENV.swap_dir . '//'
@@ -290,17 +282,15 @@ set keywordprg=
" Note: if 'fileencoding' is empty, 'encoding' is used.
set fileencodings=utf-8,cp932,euc-jp
-set termencoding=utf-8
" Misc. {{{2
-set maxfuncdepth=50
set sessionoptions+=localoptions
- \ sessionoptions+=resize
- \ sessionoptions+=winpos
-let &viminfo .= ',n' . g:MY_ENV.cache_dir . '/viminfo'
+set sessionoptions+=resize
+set sessionoptions+=winpos
+let &viminfofile = g:MY_ENV.vimindo
@@ -882,34 +872,14 @@ function! s:choose_window_interactively() abort
let winid = wins[i]
let indicator = indicators[i]
let [winy, winx, winh, winw] = s:win_getrect(winid)
- if has('nvim')
- let buf_id = nvim_create_buf(v:false, v:true)
- call nvim_buf_set_lines(buf_id, 0, -1, v:true, ['', ' ' . indicator . ' ', ''])
- let popup = nvim_open_win(
- \ buf_id,
- \ v:false,
- \ {
- \ 'relative': 'win',
- \ 'win': winid,
- \ 'row': (winh - 5) / 2,
- \ 'col': (winw - 9) / 2,
- \ 'width': 5,
- \ 'height': 3,
- \ 'focusable': v:false,
- \ 'style': 'minimal',
- \ 'border': 'double',
- \ 'noautocmd': v:true,
- \ })
- else
- let popup = popup_create(indicator, #{
- \ line: winy + (winh - 5) / 2,
- \ col: winx + (winw - 9) / 2,
- \ drag: v:false,
- \ resize: v:false,
- \ padding: [1, 3, 1, 3],
- \ border: [],
- \ })
- endif
+ let popup = popup_create(indicator, #{
+ \ line: winy + (winh - 5) / 2,
+ \ col: winx + (winw - 9) / 2,
+ \ drag: v:false,
+ \ resize: v:false,
+ \ padding: [1, 3, 1, 3],
+ \ border: [],
+ \ })
call add(popups, #{
\ winid: popup,
\ indicator: indicator,
@@ -933,11 +903,7 @@ function! s:choose_window_interactively() abort
" Close popups
for popup in popups
- if has('nvim')
- call nvim_win_close(popup.winid, v:true)
- else
- call popup_close(popup.winid)
- endif
+ call popup_close(popup.winid)
endfor
endfunction
@@ -999,7 +965,7 @@ nnoremap tc <C-w>c
nnoremap to <C-w>o
nnoremap <silent> tO :<C-u>tabonly<CR>
-if has('popupwin') || has('nvim')
+if has('popupwin')
nnoremap <silent> tg :<C-u>call <SID>choose_window_interactively()<CR>
endif
@@ -1881,7 +1847,7 @@ nnoremap <silent> tRr :<C-u>AdjustScreenWidth <Bar> AdjustScreenHeight<CR>
" yankround {{{2
-let g:yankround_dir = g:MY_ENV.cache_dir . '/yankround'
+let g:yankround_dir = g:MY_ENV.yankround_dir
let g:yankround_use_region_hl = 1