if has("win32") || has("win64") set encoding=cp932 endif scriptencoding utf-8 " <Leader> let mapleader = "," if has("win32") || has("win64") let vimdir="~/vimfiles/" else let vimdir="~/.vim/" endif "----------------------------------------------------------------------------- " Plugins "----------------------------------------------------------------------------- " {{{ if empty(glob('~/.vim/autoload/plug.vim')) silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim autocmd VimEnter * PlugInstall | source $MYVIMRC endif call plug#begin('~/.vim/plugged') if v:version > 702 let s:enable_unite = 1 else let s:enable_unite = 0 endif " Edit {{{ " マルチバイト対応の整形 Plug 'h1mesuke/vim-alignta' " surround.vim : テキストを括弧で囲む/削除する Plug 'tpope/vim-surround' " vim-operator-user : 簡単にoperatorを定義できるようにする Plug 'kana/vim-operator-user' " operator-camelize : camel-caseへの変換 Plug 'tyru/operator-camelize.vim' " operator-replace : yankしたものでreplaceする Plug 'kana/vim-operator-replace' " textobj-user : 簡単にVimエディタのテキストオブジェクトをつくれる Plug 'kana/vim-textobj-user' " <C-a>でtrue/false切替。他色々 Plug 'taku-o/vim-toggle' " f/Fの移動をリッチに Plug 'rhysd/clever-f.vim' " }}} " Completion {{{ " completion if has('lua') Plug 'Shougo/neocomplete' else Plug 'Shougo/neocomplcache' end " clang補完 Plug 'justmao945/vim-clang', { 'for' : ['c', 'cpp'] } " snippet Plug 'Shougo/neosnippet' Plug 'Shougo/neosnippet-snippets' " }}} " Searching/Moving{{{ " vim-smartword : 単語移動がスマートな感じで Plug 'kana/vim-smartword' " <Leader><Leader>w/fなどで、motion先をhilightする Plug 'Lokaltog/vim-easymotion', {'vim_version' : '7.3'} " }}} " Programming {{{ " quickrun.vim : 編集中のファイルを簡単に実行できるプラグイン Plug 'thinca/vim-quickrun' Plug 'mattn/quickrunex-vim' " }}} " FileType {{{ " " vim Plug 'thinca/vim-ft-vim_fold' " markdown Plug 'tpope/vim-markdown' " scala Plug 'derekwyatt/vim-scala' " haskell Plug 'kana/vim-filetype-haskell' " reStructuredText Plug 'nvie/vim-rst-tables' " yaml Plug 'chase/vim-ansible-yaml' " jinja2 Plug 'mitsuhiko/vim-jinja' " Dockerfile Plug 'ekalinin/Dockerfile.vim' " go Plug 'fatih/vim-go' " rust Plug 'rust-lang/rust.vim' Plug 'racer-rust/vim-racer' " cpp Plug 'vim-jp/cpp-vim', { 'for' : ['cpp'] } Plug 'osyo-manga/vim-stargate', { 'for' : ['cpp'] } " thrift Plug 'solarnz/thrift.vim' " TOML Plug 'cespare/vim-toml' " }}} " Buffer {{{ " ファイラー if s:enable_unite Plug 'Shougo/vimfiler' endif " .c/cpp .hを切り替え Plug 'vim-scripts/a.vim' " gfを拡張 Plug 'kana/vim-gf-user' " gf for git diff Plug 'kana/vim-gf-diff' " }}} " Utility {{{ " vimproc : vimから非同期実行。vimshellで必要 Plug 'Shougo/vimproc', { 'do': 'make'} " 任意のsub modeを利用できるようにする Plug 'kana/vim-submode' " キーの同時押しにmapできるようにする Plug 'kana/vim-arpeggio' " .local.vimrcを読み込む Plug 'thinca/vim-localrc' " vimの二重起動を防ぐ Plug 'thinca/vim-singleton' " vimのデータを見やすく出力 Plug 'thinca/vim-prettyprint' " Exコマンドをそれっぽく展開 Plug 'thinca/vim-ambicmd' " エラーの箇所の表示 Plug 'jceb/vim-hier' " tab local cd Plug 'kana/vim-tabpagecd' " sudo Plug 'vim-scripts/sudo.vim' " リポジトリのrootに移動 Plug 'airblade/vim-rooter' " }}} " Tool {{{ " vimの再起動を行う Plug 'tyru/restart.vim' " open-browser.vim : カーソルの下のURLを開くor単語を検索エンジンで検索 Plug 'tyru/open-browser.vim', { 'on' : ['OpenBrowser', 'OpenBrowserSearch'] } " vinarise if v:version > 702 Plug 'Shougo/vinarise' endif " fugitive Plug 'tpope/vim-fugitive' " github Plug 'tyru/open-browser-github.vim', { 'on' : ['OpenGithubFile', 'OpenGithubIssue', 'OpenGithubPullReq'] } " ag Plug 'rking/ag.vim' " EditorConfig Plug 'editorconfig/editorconfig-vim' " }}} " ColorScheme{{{ Plug 'altercation/vim-colors-solarized' " }}} " Unite {{{ if s:enable_unite " 本体 Plug 'Shougo/unite.vim' " QuickFix Plug 'osyo-manga/unite-quickfix' " other Plug 'sorah/unite-ghq' endif " }}} " call plug#end() " }}} "----------------------------------------------------------------------------- " Plugin settings "----------------------------------------------------------------------------- " {{{ " matchit {{{ source $VIMRUNTIME/macros/matchit.vim " }}} " neosnippets {{{ if has("win32") || has("win64") let g:neosnippet#snippets_directory = '~/vimfiles/snippets' else let g:neosnippet#snippets_directory = '~/.vim/snippets' endif " Plugin key-mappings. imap <C-k> <Plug>(neosnippet_expand_or_jump) smap <C-k> <Plug>(neosnippet_expand_or_jump) xmap <C-k> <Plug>(neosnippet_expand_target) imap <C-s> <Plug>(neosnippet_start_unite_snippet) xmap <C-l> <Plug>(neosnippet_start_unite_snippet_target) " SuperTab like snippets behavior. imap <expr><TAB> neosnippet#expandable_or_jumpable() ? \ "\<Plug>(neosnippet_expand_or_jump)" \: pumvisible() ? "\<C-n>" : "\<TAB>" smap <expr><TAB> neosnippet#expandable_or_jumpable() ? \ "\<Plug>(neosnippet_expand_or_jump)" \: "\<TAB>" " For snippet_complete marker. if has('conceal') set conceallevel=2 concealcursor=i endif " }}} " unite.vim {{{ if s:enable_unite " 入力モードで開始する let g:unite_enable_start_insert=1 " 下に開く let g:unite_split_rule = 'botright' " history/yankを有効化 let g:unite_source_history_yank_enable = 1 let g:unite_source_grep_default_opts = '-Hn --color=never' let g:unite_source_rec_max_cache_files = 20000 if executable('ag') let g:unite_source_grep_command = 'ag' let g:unite_source_grep_default_opts = '--nogroup --nocolor --column' let g:unite_source_grep_recursive_opt = '' elseif executable('ack-grep') let g:unite_source_grep_command = 'ack-grep' let g:unite_source_grep_default_opts = '-i --no-heading --no-color -k -H' let g:unite_source_grep_recursive_opt = '' endif nnoremap <SID>[unite] <Nop> nnoremap <SID>[unite_project] <Nop> nmap <Leader>u <SID>[unite] nmap <Leader>p <SID>[unite_project] nnoremap <silent> <SID>[unite]b :<C-u>Unite buffer<CR> nnoremap <silent> <SID>[unite]u :<C-u>Unite bookmark buffer file_mru<CR> nnoremap <silent> <SID>[unite]a :<C-u>UniteWithBufferDir -buffer-name=files buffer file_mru bookmark file<CR> nnoremap <silent> <SID>[unite]g :<C-u>Unite ghq<CR> nnoremap <silent> <SID>[unite]s :<C-u>Unite source<CR> nnoremap <silent> <SID>[unite_project]r :<C-u>call <SID>unite_project('file_rec/git')<CR> nnoremap <silent> <SID>[unite_project]g :<C-u>call <SID>unite_project('grep')<CR> nnoremap <SID>[unite_project]d :<C-u>lcd <C-r>=unite#util#path2project_directory(expand('%'))<CR><CR> "nnoremap <silent> <C-h> :<C-u>Unite help<CR> function! s:unite_project(source, ...) let dir = unite#util#path2project_directory(expand('%')) execute 'Unite' a:source . ':' . escape(dir, ':') . (a:0 > 0 ? ':' . join(a:000, ':') : '') endfunction call unite#custom#default_action('directory', 'vimfiler') call unite#custom#default_action('source/ghq/directory', 'vimfiler') " タグジャンプをunite-tagsで置き換え " autocmd BufEnter * " \ if empty(&buftype) " \| nnoremap <buffer> <C-]> :<C-u>UniteWithCursorWord -immediately tag<CR> " \| endif autocmd FileType unite call s:unite_my_settings() function! s:unite_my_settings()"{{{ " Overwrite settings. nmap <buffer> <ESC> <Plug>(unite_exit) imap <buffer> jj <Plug>(unite_insert_leave) " <C-l>: manual neocomplcache completion. inoremap <buffer> <C-l> <C-x><C-u><C-p><Down> endfunction"}}} endif " }}} " quickrun {{{ noremap <SID>[quickrun] <Nop> map <Leader>q <SID>[quickrun] nmap <SID>[quickrun]r <Plug>(quickrun) let g:quickrun_config = { \ "_" : { \ "runner" : "vimproc", \ "runner/vimproc/updatetime" : 50, \ "outputter" : "error", \ "outputter/error/success" : "buffer", \ "outputter/error/error" : "quickfix", \ "outputter/buffer/split" : ":botright 8sp", \ "outputter/buffer/name" : "QuickRun output", \ "outputter/buffer/running" : "running", \ "outputter/buffer/close_on_empty" :1, \ }, \ "cpp" : { \ "type" : "cpp/clang++", \ "cmdopt" : "-std=c++11", \ }, \} " :QuickRun 時に quickfix の中身をクリアする " こうしておかないと quickfix の中身が残ったままになってしまうため let s:hook = { \ "name" : "clear_quickfix", \ "kind" : "hook", \} function! s:hook.on_normalized(session, context) call setqflist([]) endfunction call quickrun#module#register(s:hook, 1) unlet s:hook " }}} " open-browser {{{ let g:netrw_nogx = 1 " disable netrw's gx mapping. nmap gx <Plug>(openbrowser-smart-search) vmap gx <Plug>(openbrowser-smart-search) if !exists('g:openbrowser_search_engines') let g:openbrowser_search_engines = {} endif let g:openbrowser_search_engines['amazon'] = 'http://www.amazon.co.jp/s/?keywords={query}' " }}} " Vimfiler {{{ if s:enable_unite "nnoremap <silent> <Leader>vf :VimFilerBufferDir -simple -split -winwidth=50<CR> nnoremap <silent> <Leader>vb :VimFilerBufferDir<CR> nnoremap <silent> <Leader>vf :VimFiler<CR> let g:vimfiler_as_default_explorer=1 " Like Textmate icons. let g:vimfiler_tree_leaf_icon = ' ' let g:vimfiler_tree_opened_icon = '▾' let g:vimfiler_tree_closed_icon = '▸' let g:vimfiler_file_icon = '-' let g:vimfiler_marked_file_icon = '*' " ignore let s:ignore_target = { \ 'dotfiles' : '\..\+', \ 'obj' : '.\+\.o' \ } let g:vimfiler_ignore_pattern = '^\%('.join(values(s:ignore_target), '\|').'\)$' augroup MyVimfiler autocmd! autocmd FileType vimfiler nmap <buffer> q <Plug>(vimfiler_exit) augroup END endif " }}} " surround.vim {{{ let g:surround_custom_mapping = {} let g:surround_custom_mapping.vim= { \'f': "function! \r endfunction", \'z': "\"{{{ \r \"}}}" \ } " }}} " submode {{{ call submode#enter_with('undo/redo', 'n', '', 'g-', 'g-') call submode#enter_with('undo/redo', 'n', '', 'g+', 'g+') call submode#leave_with('undo/redo', 'n', '', '<Esc>') call submode#map('undo/redo', 'n', '', '-', 'g-') call submode#map('undo/redo', 'n', '', '+', 'g+') call submode#enter_with('tabnext', 'n', '', '<C-Tab>', ':<C-u>tabnext<CR>') call submode#enter_with('tabnext', 'n', '', 'gt', ':<C-u>tabnext<CR>') call submode#enter_with('tabnext', 'n', '', '<C-S-Tab>', ':<C-u>tabprevious<CR>') call submode#enter_with('tabnext', 'n', '', 'gT', ':<C-u>tabprevious<CR>') call submode#leave_with('tabnext', 'n', '', '<Esc>') call submode#map('tabnext', 'n', '', '<Tab>', ':<C-u>tabnext<CR>') call submode#map('tabnext', 'n', '', '<C-Tab>', ':<C-u>tabnext<CR>') call submode#map('tabnext', 'n', '', 't', ':<C-u>tabnext<CR>') call submode#map('tabnext', 'n', '', '<S-Tab>', ':<C-u>tabprevious<CR>') call submode#map('tabnext', 'n', '', '<C-S-Tab>', ':<C-u>tabprevious<CR>') call submode#map('tabnext', 'n', '', 'T', ':<C-u>tabprevious<CR>') " " function! s:resizeWindow() " call submode#enter_with('winsize', 'n', '', 'mws', '<Nop>') " call submode#leave_with('winsize', 'n', '', '<Esc>') " " let curwin = winnr() " wincmd j | let target1 = winnr() | exe curwin "wincmd w" " wincmd l | let target2 = winnr() | exe curwin "wincmd w" " " " execute printf("call submode#map ('winsize', 'n', 'r', 'j', '<C-w>%s')", curwin == target1 ? "-" : "+") " execute printf("call submode#map ('winsize', 'n', 'r', 'k', '<C-w>%s')", curwin == target1 ? "+" : "-") " execute printf("call submode#map ('winsize', 'n', 'r', 'h', '<C-w>%s')", curwin == target2 ? ">" : "<") " execute printf("call submode#map ('winsize', 'n', 'r', 'l', '<C-w>%s')", curwin == target2 ? "<" : ">") " endfunction " " nnoremap <C-w>r :<C-u>call <SID>resizeWindow()<CR>mws " }}} " restart.vim {{{ let g:restart_sessionoptions = 'blank,curdir,folds,help,localoptions,tabpages' command! \ -bar \ RestartWithSession \ let g:restart_sessionoptions = 'blank,curdir,folds,help,localoptions,tabpages' \ | Restart " }}} " operator-replace {{{ map _ <Plug>(operator-replace) " }}} " operator-camelize {{{ nmap <Leader>C <Plug>(operator-camelize-toggle) vmap <Leader>C <Plug>(operator-camelize-toggle) " }}} " Gtags{{{ nnoremap <SID>[gtags] <Nop> nmap <Leader>g <SID>[gtags] " 定義箇所 nnoremap <silent> <C-g> :<C-u>Gtags <C-r><C-w><CR> " 使用箇所 nnoremap <silent> <SID>[gtags]r :<C-u>Gtags -r <C-r><C-w><CR> " シンボル nnoremap <silent> <SID>[gtags]s :<C-u>Gtags -s <C-r><C-w><CR> " grep nnoremap <silent> <SID>[gtags]g :<C-u>Gtags -g <C-r><C-w><CR> " 関数一覧 nnoremap <silent> <SID>[gtags]l :<C-u>Gtags -f %<CR> " update nnoremap <expr> <SID>[gtags]u GtagsUpdate() " from http://d.hatena.ne.jp/abulia/20111205/1323111263 function! GtagsUpdate() let gtagsroot = s:GtagsCscope_GtagsRoot() if gtagsroot == '' silent! exe "!gtags" echo "update gtags at current directory" else let l:now_pwd = getcwd() echo "update gtags at " . gtagsroot silent! exe "cd " . gtagsroot silent! exe "!gtags" silent! exe "cd " . l:now_pwd endif silent! exec "redr!" endfunction " from gtags-cscope.vim function! s:GtagsCscope_GtagsRoot() let cmd = "global -pq" let cmd_output = system(cmd) if v:shell_error != 0 if v:shell_error == 3 call s:Error('GTAGS not found.') else call s:Error('global command failed. command line: ' . cmd) endif return '' endif return strpart(cmd_output, 0, strlen(cmd_output) - 1) endfunction " }}} " neocomplcache && neocomplete {{{ if has('lua') " neocomplete {{{ " Use neocomplete. let g:neocomplete#enable_at_startup = 1 " Use smartcase. let g:neocomplete#enable_smart_case = 1 " Set minimum syntax keyword length. let g:neocomplete#sources#syntax#min_keyword_length = 3 let g:neocomplete#lock_buffer_name_pattern = '\*ku\*' " Define keyword. if !exists('g:neocomplete#keyword_patterns') let g:neocomplete#keyword_patterns = {} endif let g:neocomplete#keyword_patterns['default'] = '\h\w*' " Plugin key-mappings. inoremap <expr><C-g> neocomplete#undo_completion() inoremap <expr><C-l> neocomplete#complete_common_string() " Recommended key-mappings. " <CR>: close popup and save indent. inoremap <silent> <CR> <C-r>=<SID>my_cr_function()<CR> function! s:my_cr_function() return neocomplete#smart_close_popup() . "\<CR>" " For no inserting <CR> key. "return pumvisible() ? neocomplete#close_popup() : "\<CR>" endfunction " <TAB>: completion. inoremap <expr><TAB> pumvisible() ? "\<C-n>" : "\<TAB>" " <C-h>, <BS>: close popup and delete backword char. inoremap <expr><C-h> neocomplete#smart_close_popup()."\<C-h>" inoremap <expr><BS> neocomplete#smart_close_popup()."\<C-h>" inoremap <expr><C-y> neocomplete#close_popup() inoremap <expr><C-e> neocomplete#cancel_popup() " Close popup by <Space>. "inoremap <expr><Space> pumvisible() ? neocomplete#close_popup() : "\<Space>" " For cursor moving in insert mode(Not recommended) "inoremap <expr><Left> neocomplete#close_popup() . "\<Left>" "inoremap <expr><Right> neocomplete#close_popup() . "\<Right>" "inoremap <expr><Up> neocomplete#close_popup() . "\<Up>" "inoremap <expr><Down> neocomplete#close_popup() . "\<Down>" " Or set this. "let g:neocomplete#enable_cursor_hold_i = 1 " Or set this. "let g:neocomplete#enable_insert_char_pre = 1 " Enable omni completion. autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS autocmd FileType python setlocal omnifunc=pythoncomplete#Complete autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags highlight Pmenu ctermbg=8 guibg=#606060 highlight PmenuSel ctermbg=1 guifg=#dddd00 guibg=#1f82cd highlight PmenuSbar ctermbg=0 guibg=#d6d6d6 " Enable heavy omni completion. if !exists('g:neocomplete#sources#omni#input_patterns') let g:neocomplete#sources#omni#input_patterns = {} endif if !exists('g:neocomplete#sources#omni#functions') let g:neocomplete#sources#omni#functions = {} endif if !exists('g:neocomplete#force_omni_input_patterns') let g:neocomplete#force_omni_input_patterns = {} endif let g:neocomplete#force_overwrite_completefunc = 1 let g:neocomplete#force_omni_input_patterns.c = \ '[^.[:digit:] *\t]\%(\.\|->\)\w*' let g:neocomplete#force_omni_input_patterns.cpp = \ '[^.[:digit:] *\t]\%(\.\|->\)\w*\|\h\w*::\w*' " }}} else " neocomplcache {{{ "Vimデフォルトのオムニ補完を置き換え inoremap <expr><C-x><C-o> &filetype == 'vim' ? "\<C-x><C-v><C-p>" : neocomplcache#manual_omni_complete() " Use neocomplcache. let g:neocomplcache_enable_at_startup = 1 " Use smartcase. let g:neocomplcache_enable_smart_case = 1 " Use camel case completion. let g:neocomplcache_enable_camel_case_completion = 1 " Use underbar completion. let g:neocomplcache_enable_underbar_completion = 1 " Set minimum syntax keyword length. let g:neocomplcache_min_syntax_length = 3 let g:neocomplcache_lock_buffer_name_pattern = '\*ku\*' " Define dictionary. let g:neocomplcache_dictionary_filetype_lists = { \ 'default' : '', \ 'vimshell' : $HOME.'/.vimshell_hist' \ } " Define keyword. if !exists('g:neocomplcache_keyword_patterns') let g:neocomplcache_keyword_patterns = {} endif let g:neocomplcache_keyword_patterns['default'] = '\h\w*' " Plugin key-mappings. inoremap <expr><C-g> neocomplcache#undo_completion() inoremap <expr><C-l> neocomplcache#complete_common_string() " Recommended key-mappings. " <CR>: close popup and save indent. inoremap <expr><CR> neocomplcache#smart_close_popup() . "\<CR>" " <C-h>, <BS>: close popup and delete backword char. inoremap <expr><C-h> neocomplcache#smart_close_popup()."\<C-h>" inoremap <expr><BS> neocomplcache#smart_close_popup()."\<C-h>" inoremap <expr><C-y> neocomplcache#close_popup() inoremap <expr><C-e> neocomplcache#cancel_popup() " Enable omni completion. autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags autocmd FileType javascript setlocal omnifunc=jscomplete#CompleteJS autocmd FileType python setlocal omnifunc=pythoncomplete#Complete autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags " Enable heavy omni completion. if !exists('g:neocomplcache_omni_patterns') let g:neocomplcache_omni_patterns = {} endif let g:neocomplcache_omni_patterns.php = '[^. \t]->\h\w*\|\h\w*::' " rsense let g:rsenseUseOmniFunc = 1 if filereadable(expand('~/.vim/bundle/rsense/bin/rsense')) let g:rsenseHome = expand('~/.vim/bundle/rsense') let g:neocomplcache_omni_patterns.ruby = '[^. *\t]\.\w*\|\h\w*::' endif " for clang_complete if !exists('g:neocomplcache_force_omni_patterns') let g:neocomplcache_force_omni_patterns = {} endif let g:neocomplcache_force_overwrite_completefunc = 1 " }}} endif " }}} " fugitive {{{ command! Gpull Git pull command! Gpush Git push command! Gammend execute 'Git commit --amend --no-edit' command! Gnow execute 'Git now' " }}} " ag {{{ nnoremap <SID>[ag] <Nop> nmap <Leader>ag <SID>[ag] nnoremap <SID>[ag] :<C-u>Ag nnoremap <silent> <C-a> :<C-u>Ag <C-r><C-w><CR> " }}} " rooter {{{ " disable the default map (,cd) map <Nop> <Plug>RooterChangeToRootDirectory " }}} " vim-go {{{ let g:gocomplete#system_function = 'vimproc#system2' "to use vimproc let g:go_snippet_engine = 'neosnippet' let g:go_fmt_command = "goimports" " }}} " vim-racer {{{ let g:racer_cmd = "/Users/okuno/.multirust/toolchains/stable/cargo/bin/racer" let $RUST_SRC_PATH="/Users/okuno/.ghq/github.com/rust-lang/rust/src" " }}} " vim-clang {{{ " disable auto completion for vim-clang let g:clang_auto = 0 let g:clang_complete_auto = 0 let g:clang_auto_select = 0 let g:clang_use_library = 1 " default 'longest' can not work with neocomplete let g:clang_c_completeopt = 'menuone' let g:clang_cpp_completeopt = 'menuone' if executable('clang-3.6') let g:clang_exec = 'clang-3.6' elseif executable('clang-3.5') let g:clang_exec = 'clang-3.5' elseif executable('clang-3.4') let g:clang_exec = 'clang-3.4' else let g:clang_exec = 'clang' endif if executable('clang-format-3.6') let g:clang_format_exec = 'clang-format-3.6' elseif executable('clang-format-3.5') let g:clang_format_exec = 'clang-format-3.5' elseif executable('clang-format-3.4') let g:clang_format_exec = 'clang-format-3.4' else let g:clang_format_exec = 'clang-format' endif let g:clang_c_options = '-std=c11' let g:clang_cpp_options = '-std=c++11 -stdlib=libc++' " }}} " }}} "----------------------------------------------------------------------------- " set "----------------------------------------------------------------------------- " {{{ "スワップを作らない set noswapfile set backupdir=~/.vim/backup if version >= 704 set undodir=~/.vim/undo endif "ファイル保存ダイアログの初期ディレクトリをバッファファイル位置に設定 set browsedir=buffer "左右のカーソル移動で行間移動可能にする。 set whichwrap=h,l,b,s,<,>,[,] "新しい行を作ったときに高度な自動インデントを行う set smartindent "タブの代わりに空白文字を挿入する set expandtab "シフト移動幅 set shiftwidth=4 "ファイル内の Tab が対応する空白の数 set tabstop=4 "行頭の余白内で Tab を打ち込むと、'shiftwidth' の数だけインデントする。 set smarttab "タブ文字、行末など不可視文字を表示する set list "listで表示される文字のフォーマットを指定する set listchars=tab:▸\ ,extends:<,trail:_ "変更中のファイルでも、保存しないで他のファイルを表示 set hidden "インクリメンタルサーチを行う set incsearch "シンタックスハイライトを有効にする if has("syntax") syntax on endif "ルーラーを表示 set ruler set title "検索時に大文字を含んでいたら大/小を区別 set ignorecase set smartcase "Vimgrepで外部grepを使用 if executable('ag') set grepprg=ag\ --nogroup\ -iS set grepformat=%f:%l:%m elseif executable('ack') set grepprg=ack\ --nogroup set grepformat=%f:%l:%m else set grepprg=grep\ -Hnd\ skip\ -r set grepformat=%f:%l:%m,%f:%l%m,%f\ \ %l%m endif "入力中のコマンドをステータスに表示する set showcmd "括弧入力時の対応する括弧を表示 set showmatch "検索結果文字列のハイライトを有効にする set hlsearch "ステータスラインを常に表示 set laststatus=2 "ステータスのところにファイル情報表示 set statusline=%< set statusline+=\ [%{fnamemodify(getcwd(),':~')}]\ %F\ set statusline+=%= set statusline+=\ %{fugitive#statusline()}%m%r%h%w%y set statusline+=%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'} set statusline+=\ %l,%c\ %P " 矩形選択で行末を超えてブロックを選択できるようにする set virtualedit+=block "tagファイル読み込み set tags=./tags,tags "コマンドの補完候補を一覧表示 set wildmode=list:longest,full " foldを有効化 set foldenable set foldmethod=marker " diff set diffopt=filler,vertical " splitは右下 set splitbelow set splitright " 変更のあったファイルを自動で読みなおす set autoread " 下に余白を残してスクロールする set scrolloff=5 " BOMをつけない set nobomb " タブラベルを常に表示 set showtabline=2 " insert開始時の文字列を削除できるように set backspace=indent,eol,start " これをしないと候補選択時に Scratch ウィンドウが開いてしまう set completeopt=menuone " 行番号非表示 set nonumber " set backupcopy=yes " normal mode/command line のみconceal表示をする if has('conceal') set concealcursor=nc endif set fileencodings="utf-8,iso-2022-jp-3,euc-jisx0213,guess,ucs-bom,latin1,iso-2022-jp-3,cp932,euc-jisx0213,euc-jp" "}}} "----------------------------------------------------------------------------- " map "----------------------------------------------------------------------------- " {{{ " 見た目で行移動 nnoremap j gj nnoremap k gk nnoremap gj j nnoremap gk k "検索語が画面の真ん中に来るようにする nnoremap n nzz nnoremap N Nzz nnoremap * *zz nnoremap # #zz nnoremap g* g*zz nnoremap g# g#z "タブの作成 nnoremap <C-w>t :<C-u>tabnew<CR> nnoremap ; : vnoremap ; : nnoremap : ; vnoremap : ; "<C-l>でハイライトを止める nnoremap <silent> <C-l> :nohlsearch<CR><C-l> nnoremap <C-W><C-F> <C-W><C-F><C-W><S-L> " jjでESC inoremap jj <Esc> " help nnoremap <C-h> :<C-u>vertical help "C-w tでタブ nnoremap <C-W>t :<C-u>tabnew<CR>:cd<CR> " imap inoremap <C-d> <ESC>lxi inoremap <C-a> <Home> inoremap <C-e> <End> inoremap <C-b> <Left> inoremap <C-f> <Right> " quickfix nnoremap <SID>[quickfix] <Nop> nmap <Leader>c <SID>[quickfix] nnoremap <silent> <SID>[quickfix]o :<C-u>copen<CR> nnoremap <silent> <SID>[quickfix]c :<C-u>cclose<CR> nnoremap <C-n> :<C-u>cnext<CR> nnoremap <C-p> :<C-u>cprevious<CR> "}}} "----------------------------------------------------------------------------- " autocomd "----------------------------------------------------------------------------- " {{{ augroup MyAutoCmd autocmd! " help autocmd FileType help nnoremap <buffer><silent> q :quit<CR> " filetypeに合わせた辞書ファイルを読み込み autocmd FileType * execute printf("setlocal dict=$HOME/.vim/dict/%s.dict", &filetype) " IME自動制御 autocmd InsertEnter,CmdwinEnter * set noimdisable autocmd InsertLeave,CmdwinLeave * set imdisable augroup END " ft-vim_fold {{{ augroup foldmethod-expr autocmd! autocmd InsertEnter * if &l:foldmethod ==# 'expr' \ | let b:foldinfo = [&l:foldmethod, &l:foldexpr] \ | setlocal foldmethod=manual foldexpr=0 \ | endif autocmd InsertLeave * if exists('b:foldinfo') \ | let [&l:foldmethod, &l:foldexpr] = b:foldinfo \ | endif augroup END " }}} " }}} "----------------------------------------------------------------------------- " GUI "----------------------------------------------------------------------------- " {{{ "+guiでコンパイルされている try if has('gui') colorscheme solarized set background=light else colorscheme robokai endif catch " only suppress error message endtry "gvimとして起動(:guiで起動したときは読み込まれないので注意) if has('gui_running') endif "}}} "----------------------------------------------------------------------------- " Windows "----------------------------------------------------------------------------- " {{{ "WindowsでCtrl+C Ctrl+V Ctrl+Xを有効にする if has('win32') || has('win64') source $VIMRUNTIME/mswin.vim call submode#enter_with('tabnext', 'n', '', '<C-Tab>', ':<C-u>tabnext<CR>') nmap <C-v> <C-v> nmap <C-a> <C-a> nmap <C-z> <C-z> inoremap <F7> <Nop> if has('gui_running') "ウィンドウを最大化して起動 autocmd MyAutoCmd GUIEnter * simalt ~x endif endif " }}} "----------------------------------------------------------------------------- " Mac "----------------------------------------------------------------------------- " {{{ if has('mac') "let $PYTHON_DLL = "/usr/local/Frameworks/Python.framework/Versions/2.7/lib/libpython2.7.dylib" endif " }}} "----------------------------------------------------------------------------- " Misc "----------------------------------------------------------------------------- " {{{ " tablineを設定{{{ " 各タブページのカレントバッファ名+αを表示 function! s:tabpage_label(n) " t:title と言う変数があったらそれを使う let title = v:version >= 703 ? gettabvar(a:n, 'title') : '' if title !=# '' return title endif " タブページ内のバッファのリスト let bufnrs = tabpagebuflist(a:n) " カレントタブページかどうかでハイライトを切り替える let hi = a:n is tabpagenr() ? '%#TabLineSel#' : '%#TabLine#' " バッファが複数あったらバッファ数を表示 let no = len(bufnrs) if no is 1 let no = '' endif " タブページ内に変更ありのバッファがあったら '+' を付ける let mod = len(filter(copy(bufnrs), 'getbufvar(v:val, "&modified")')) ? '+' : '' let sp = (no . mod) ==# '' ? '' : ' ' " 隙間空ける " カレントバッファ let curbufnr = bufnrs[tabpagewinnr(a:n) - 1] " tabpagewinnr() は 1 origin let fname = fnamemodify(bufname(curbufnr), ":p:t") let label = no . mod . sp . fname return '%' . a:n . 'T' . hi . label . '%T%#TabLineFill#' endfunction function! MakeTabLine() let titles = map(range(1, tabpagenr('$')), 's:tabpage_label(v:val)') let sep = ' | ' " タブ間の区切り let tabpages = join(titles, sep) . sep . '%#TabLineFill#%T' let info = fnamemodify(getcwd(), ":~") . ' ' return tabpages . '%=' . info " タブリストを左に、情報を右に表示 endfunction set tabline=%!MakeTabLine() "}}} " numberとrelativenumberを切り替え {{{ if version >= 703 nnoremap <silent><expr> <Leader>n ToggleNumberOption() function! ToggleNumberOption() if &number set nonumber set relativenumber elseif &relativenumber set nonumber set norelativenumber else set number set norelativenumber endif endfunction endif " }}} " cursorcolumn cursorlineを切り替え {{{ " nnoremap <silent><expr> <Leader>c ToggleCursor() function! ToggleCursor() if &cursorcolumn || &cursorline set nocursorcolumn set nocursorline else set cursorcolumn set cursorline endif endfunction " }}} " }}} "----------------------------------------------------------------------------- " Command "----------------------------------------------------------------------------- " {{{ " GitLogViewer {{{ " " Inspired by ujihisa's vimrc function! s:GitLogViewer() new VimProcRead git log -u 'ORIG_HEAD..HEAD' set filetype=git set buftype=nofile setlocal foldmethod=expr setlocal foldexpr=getline(v:lnum)=~'^commit'?'>1':getline(v:lnum+1)=~'^commit'?'<1':'=' setlocal foldtext=FoldTextOfGitLog() endfunction " git log表示時の折りたたみ用 function! FoldTextOfGitLog() let month_map = { \ 'Jan' : '01', \ 'Feb' : '02', \ 'Mar' : '03', \ 'Apr' : '04', \ 'May' : '05', \ 'Jun' : '06', \ 'Jul' : '07', \ 'Aug' : '08', \ 'Sep' : '09', \ 'Oct' : '10', \ 'Nov' : '11', \ 'Dec' : '12', \ } if getline(v:foldstart) !~ '^commit' return getline(v:foldstart) endif if getline(v:foldstart + 1) =~ '^Author:' let author_lnum = v:foldstart + 1 elseif getline(v:foldstart + 2) =~ '^Author:' " commitの次の行がMerge:の場合があるので let author_lnum = v:foldstart + 2 else " commitの下2行がどちらもAuthor:で始まらなければ諦めて終了 return getline(v:foldstart) endif let date_lnum = author_lnum + 1 let message_lnum = date_lnum + 2 let author = matchstr(getline(author_lnum), '^Author: \zs.*\ze <.\{-}>') let date = matchlist(getline(date_lnum), ' \(\a\{3}\) \(\d\{1,2}\) \(\d\{2}:\d\{2}:\d\{2}\) \(\d\{4}\)') let message = getline(message_lnum) let month = date[1] let day = printf('%02s', date[2]) let time = date[3] let year = date[4] let datestr = join([year, month_map[month], day], '-') return join([datestr, time, author, message], ' ') endfunctio command! GitLogViewer call s:GitLogViewer() " }}} " Capture {{{ command! \ -nargs=1 \ -complete=command \ Capture \ call Capture(<f-args>) function! Capture(cmd) redir => result silent execute a:cmd redir END let bufname = 'Capture: ' . a:cmd new setlocal bufhidden=unload setlocal nobuflisted setlocal buftype=nofile setlocal noswapfile silent file `=bufname` silent put =result 1,2delete _ endfunction " }}} " }}} " vim:ts=2 sw=2