" ====================================== deni.vim settings ======================================
if &compatible
set nocompatible
endif
" install dir
let s:dein_dir = expand('~/.cache/dein')
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'
" dein installation check
if &runtimepath !~# '/dein.vim'
if !isdirectory(s:dein_repo_dir)
execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
endif
execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p')
endif
" begin settings
if dein#load_state(s:dein_dir)
call dein#begin(s:dein_dir)
" .toml file
let g:rc_dir = expand('~/.vim')
let s:toml = g:rc_dir . '/dein.toml'
let s:lazy_toml = g:rc_dir . '/dein_lazy.toml'
" read toml and cache
call dein#load_toml(s:toml, {'lazy': 0})
call dein#load_toml(s:lazy_toml, {'lazy': 1})
" end settings
call dein#end()
call dein#save_state()
endif
" plugin installation check
if dein#check_install()
call dein#install()
endif
" ====================================== general settings ======================================
" https://vim-jp.org/vimdoc-ja/map.html#mapleader
" Leaderキーをスペースに設定
let mapleader = "\<Space>"
" シンタックスを有効にする
syntax on
" https://vim-jp.org/vimdoc-ja/filetype.html#:filetype-plugin-on
" https://vim-jp.org/vimdoc-ja/filetype.html#:filetype-indent-on
" ファイル形式別プラグインとインデントを有効にする
" これがないとvim-goなどが動作しない
filetype plugin indent on
" https://github.com/posva/vim-vue#my-syntax-highlighting-stops-working-randomly
" vueファイルのシンタックスが効かなくなる問題対応
au FileType vue syntax sync fromstart
" バックスペースとCtrl+hで削除を有効にする
set backspace=2
" 改行時自動インデント
set smartindent
" 行番号を表示
set number
" カーソルから相対的な行数を表示する
set relativenumber
" https://vim-jp.org/vimdoc-ja/options.html#'tabstop'
" タブでも常に空白を挿入
set tabstop=4
set shiftwidth=4
set expandtab
" インクリメントサーチを有効にする
set incsearch
" https://vim-jp.org/vimdoc-ja/options.html#'ignorecase'
" 検索時大文字小文字を区別しない
set ignorecase
" https://vim-jp.org/vimdoc-ja/options.html#'smartcase'
" 検索時に大文字を入力した場合ignorecaseが無効になる
set smartcase
" ハイライトサーチを有効にする
set hlsearch
" undoできる最大数
set undolevels=1000
" mac os のクリップボードを共有
set clipboard+=unnamed
" カーソルが常に中央に来るようにする
set scrolloff=100
" スワップファイルに書き込まれる時間(ミリ秒単位)
set updatetime=450
set lazyredraw
set ttyfast
" 一行が長いファイルをsyntaxを制御することで軽くする
set synmaxcol=256
" カーソルラインを表示する
set cursorline
" https://vim-jp.org/vimdoc-ja/pi_netrw.html#g:netrw_liststyle
" netrwツリー表示を有効にする
let g:netrw_liststyle = 3
" 拡張子ごとのインデントを指定する
augroup fileTypeIndent
autocmd!
autocmd BufNewFile,BufRead *.html setlocal tabstop=4 softtabstop=4 shiftwidth=4
autocmd BufNewFile,BufRead *.js setlocal tabstop=2 softtabstop=2 shiftwidth=2
autocmd BufNewFile,BufRead *.vue setlocal tabstop=2 softtabstop=2 shiftwidth=2
augroup END
" https://vim-jp.org/vimdoc-ja/options.html#'wildmode'
" wildmenuを有効にする
set wildmenu
set wildmode=full
" grepした結果をquickfixに表示する
au QuickFixCmdPost *grep* cwindow
" ====================================== key mappings ======================================
" ファイル保存と終了
nmap <Leader>w :w<CR>
nmap <Leader>q :q!<CR>
" 検索
nmap <C-G><C-G> :Ggrep <C-R><C-W><CR><CR>
" 置換
nmap <Leader>re :%s;<C-R><C-W>;g<Left><Left>;
" visualで選択したテキストを置換する
vnoremap <Leader>re y:%s/<C-r>=substitute(@", "<C-v><NL>", "\\\\n", "g")<CR>//g<Left><Left>
" ハイライトを削除する
nmap <Esc><Esc> :nohlsearch<CR>
" 画面移動
nmap <C-H> <C-W>h
nmap <C-J> <C-W>j
nmap <C-K> <C-W>k
nmap <C-L> <C-W>l
" vimrcを開く
nmap <Leader>. :e ~/.vimrc<CR>
" Ctrl+cでnormalモード
nmap <C-c> <Esc>
" text object key mapping
" cut
nmap c8 ci(
nmap c2 ci"
nmap c7 ci'
nmap c@ ci`
nmap c[ ci[
nmap c{ ci{
nmap ca8 ca(
nmap ca2 ca"
nmap ca7 ca'
nmap ca@ ca`
nmap ca[ ca[
nmap ca{ ca{
" delete
nmap d8 di(
nmap d2 di"
nmap d7 di'
nmap d@ di`
nmap d[ di[
nmap d{ di{
nmap da8 da(
nmap da2 da"
nmap da7 da'
nmap da@ da`
nmap da[ da[
nmap da{ da{
" yank
nmap y8 yi(
nmap y2 yi"
nmap y7 yi'
nmap y@ yi`
nmap y[ yi[
nmap y{ yi{
nmap ya8 ya(
nmap ya2 ya"
nmap ya7 ya'
nmap ya@ ya`
nmap ya[ ya[
nmap ya{ ya{
" visual
nmap v8 vi(
nmap v2 vi"
nmap v7 vi'
nmap v@ vi`
nmap v[ vi[
nmap v{ vi{
nmap va8 va(
nmap va2 va"
nmap va7 va'
nmap va@ va`
nmap va[ va[
nmap va{ va{
" カーソルラインの位置を保存する
if has("autocmd")
autocmd BufReadPost *
\ if line("'\"") > 0 && line ("'\"") <= line("$") |
\ exe "normal! g'\"" |
\ endif
endif
" undoの保存先
if has('persistent_undo')
set undodir=~/.vim/undo
set undofile
endif
" numberとrelativenumberの切り替え
function! ToggleRelativenumber() abort
if &relativenumber == 1
setlocal norelativenumber
else
setlocal relativenumber
endif
endfunction
nnoremap <silent> <Leader>n :call ToggleRelativenumber()<CR>
" 自作アプリケーションランチャー
nnoremap <silent> <Leader>l :belowright term ++close gol -f<CR>
" visual paste
vnoremap <silent> <C-p> "0p<CR>
" ターミナルを下部で開く
nnoremap <silent> <Leader>te :belowright term<cr>
" ====================================== vim-go settings ======================================
" ファイル保存時go importを実行する
let g:go_fmt_command = "goimports"
" ファイル保存時、linterを実行する
let g:go_metalinter_autosave = 1
" linter実行時、go vetのみを実行する
let g:go_metalinter_autosave_enabled = ['vet']
" vim-lspをしようするので、vim-goの`Ctrl+]`を無効にする
let g:go_def_mapping_enabled = 0
" GoRunやGoTest時の画面分割方法変更
let g:go_term_mode = 'split'
" key mapping
au FileType go nmap <silent> <Leader>c <Plug>(go-coverage)
au FileType go nmap <silent> <Leader>r <Plug>(go-run)
au FileType go nmap <silent> <Leader>t <Plug>(go-test)
au FileType go nmap <silent> <Leader>c <Plug>(go-coverage)
au FileType go nmap <silent> <Leader>at :GoAddTags<CR>
au FileType go nmap <silent> <Leader>rt :GoRemoveTags<CR>
au FileType go nmap <silent> <Leader>fs :GoFillStruct<CR>
au FileType go nmap <silent> <Leader>ki :GoKeyify<CR>
au FileType go nmap <silent> <Leader>dd :GoDeclsDir<CR>
au FileType go nmap <silent> <Leader>dl :GoDecls<CR>
au FileType go nmap <silent> <Leader>ip :GoImpl<CR>
au FileType go nmap <silent> <Leader>rn :GoRename<CR>
au FileType go nmap <silent> <F12> :GoDebugStart<CR>
au FileType go nmap <silent> <F12><F12> :GoDebugStop<CR>
" ====================================== fzf settings ======================================
nmap <C-P> :GFiles<CR>
" ====================================== lsp settings ======================================
nmap <silent> <C-]> :LspDefinition<CR>
nmap <silent> <Leader>rf :LspReferences<CR>
nmap <silent> <Leader>im :LspImplementation<CR>
" 非同期補完を有効にする
let g:lsp_async_completion = 1
" ====================================== lsp golang settings ======================================
" https://github.com/saibing/bingo/wiki/Install
if executable('bingo')
au User lsp_setup call lsp#register_server({
\ 'name': 'bingo',
\ 'cmd': {server_info->['bingo', '-mode', 'stdio', '-logfile', '/Users/skanehira/bingo.log']},
\ 'whitelist': ['go'],
\ })
endif
let g:lsp_log_verbose = 1
let g:lsp_log_file = expand('~/vim-lsp.log')
" ====================================== lsp php settings ======================================
au User lsp_setup call lsp#register_server({
\ 'name': 'php-language-server',
\ 'cmd': {server_info->['php', expand('~/.cache/dein/repos/github.com/felixfbecker/php-language-server/bin/php-language-server.php')]},
\ 'whitelist': ['php'],
\ })
" ====================================== lsp js settings ======================================
if executable('flow-language-server')
au User lsp_setup call lsp#register_server({
\ 'name': 'flow-language-server',
\ 'cmd': {server_info->[&shell, &shellcmdflag, 'flow-language-server --stdio']},
\ 'root_uri':{server_info->lsp#utils#path_to_uri(lsp#utils#find_nearest_parent_file_directory(lsp#utils#get_buffer_path(), '.flowconfig'))},
\ 'whitelist': ['javascript', 'javascript.jsx'],
\ })
endif
" ====================================== lsp docker settings ======================================
if executable('docker-langserver')
au User lsp_setup call lsp#register_server({
\ 'name': 'docker-langserver',
\ 'cmd': {server_info->[&shell, &shellcmdflag, 'docker-langserver --stdio']},
\ 'whitelist': ['dockerfile'],
\ })
endif
" ====================================== lsp css settings ======================================
if executable('css-languageserver')
au User lsp_setup call lsp#register_server({
\ 'name': 'css-languageserver',
\ 'cmd': {server_info->[&shell, &shellcmdflag, 'css-languageserver --stdio']},
\ 'whitelist': ['css', 'less', 'sass'],
\ })
endif
" ====================================== asyncomplete settings ======================================
inoremap <expr> <C-j> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <C-k> pumvisible() ? "\<C-p>" : "\<S-Tab>"
inoremap <expr> <cr> pumvisible() ? "\<C-y>" : "\<cr>"
" ====================================== vim-markdown settings ======================================
" mdを開くときの折りたたみを無効にする
let g:vim_markdown_folding_disabled = 1
" ====================================== vim-surround settings ======================================
nmap <Leader>7 ysiw'
nmap <Leader>2 ysiw"
nmap <Leader>` ysiw`
nmap <Leader>8 ysiw)
nmap <Leader>[ ysiw]
nmap <Leader>{ ysiw}
" ====================================== ultisnips settings ======================================
let g:UltiSnipsExpandTrigger="<tab>"
let g:UltiSnipsJumpForwardTrigger="<tab>"
let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
" ultisnipes自動補完
if has('python3')
call asyncomplete#register_source(asyncomplete#sources#ultisnips#get_source_options({
\ 'name': 'ultisnips',
\ 'whitelist': ['*'],
\ 'completor': function('asyncomplete#sources#ultisnips#completor'),
\ }))
endif
" ====================================== profiling ======================================
" vim +'call ProfileCursorMove()' <カーソルを動かすのが重いファイル>
function! ProfileCursorMove() abort
let profile_file = expand('./vim-profile.log')
if filereadable(profile_file)
call delete(profile_file)
endif
normal! gg
normal! zR
execute 'profile start ' . profile_file
profile func *
profile file *
augroup ProfileCursorMove
autocmd!
autocmd CursorHold <buffer> profile pause | q
augroup END
for i in range(1000)
call feedkeys('j')
endfor
endfunction
" ====================================== emment ======================================
let g:user_emmet_install_global = 0
let g:user_emmet_settings = {
\ 'variables': {
\ 'lang' : 'ja'
\ }
\}
au FileType html,css,vue EmmetInstall
au FileType html,css,vue imap <C-f> <C-y>,
" ====================================== vim-keymaps ======================================
imap <c-g> <Plug>KeyMapRotate
let g:keymaps = [
\ {
\ 'name': 'normal',
\ },
\ {
\ 'name': 'coding',
\ 'keymap': {
\ 'inoremap': {
\ '1': '!',
\ '!': '1',
\ '2': '"',
\ '"': '2',
\ '3': '#',
\ '#': '3',
\ '4': '$',
\ '$': '4',
\ '5': '%',
\ '%': '5',
\ '6': '&',
\ '&': '6',
\ '7': "'",
\ "'": '7',
\ '8': '(',
\ '(': '8',
\ '9': ')',
\ ')': '9',
\ '@': '`',
\ '`': '@',
\ '-': '=',
\ '=': '-',
\ },
\ },
\ },
\]
" ====================================== lightline ======================================
set laststatus=2
if !has('gui_running')
set t_Co=256
endif
" ====================================== ale ======================================
let g:ale_sign_error = 'xx'
let g:ale_sign_warning = '!!'
let g:ale_echo_msg_error_str = 'E'
let g:ale_echo_msg_warning_str = 'W'
let g:ale_echo_msg_format = '[%linter%] %s [%severity%]'
let g:ale_set_highlights = 0