読者です 読者をやめる 読者になる 読者になる

赤色のケトル

いつか、どこかの誰かの役に立つことを願って記すメモ帳

.vimrc についてのメモ

個人的なメモとして記す。

" dein.vim の設定 -------------------------------------------------------------
  if &compatible
    set nocompatible               " Be iMproved
  endif

  set runtimepath+=/home/hoge/.cache/dein/repos/github.com/Shougo/dein.vim

  " プラグインが実際にインストールされるディレクトリ
  let s:dein_dir = expand('~/.cache/dein')

  " 設定開始
  if dein#load_state(s:dein_dir)
    call dein#begin(s:dein_dir)

    " プラグインリストを収めたTOMLファイル
    let g:rc_dir = expand('~/.vim/rc')
    let s:toml   = g:rc_dir . '/dein.toml'
    let s:lazy_toml = g:rc_dir . '/dein_lazy.toml'

    " TOML を読み込み、キャッシュしておく
    call dein#load_toml(s:toml,      {'lazy': 0})
    call dein#load_toml(s:lazy_toml, {'lazy': 1})

    " 設定終了
    call dein#end()
    call dein#save_state()
  endif

  " 未インストールのものがあったらインストール
  if dein#check_install()
    call dein#install()
  endif


" neocomplete.vim の設定 ------------------------------------------------------
  " Disable AutoComplPop.
  let g:acp_enableAtStartup = 0
  " 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 dictionary.
  let g:neocomplete#sources#dictionary#dictionaries = {
      \ 'default' : '',
      \ 'vimshell' : $HOME.'/.vimshell_hist',
      \ 'scheme' : $HOME.'/.gosh_completions'
      \ }

  " 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 (pumvisible() ? "\<C-y>" : "" ) . "\<CR>"
      " For no inserting <CR> key.
        "return pumvisible() ? "\<C-y>" : "\<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>"
        " Close popup by <Space>.
        "inoremap <expr><Space> pumvisible() ? "\<C-y>" : "\<Space>"

  " AutoComplPop like behavior.
  "let g:neocomplete#enable_auto_select = 1

  " Shell like behavior(not recommended).
  "set completeopt+=longest
  "let g:neocomplete#enable_auto_select = 1
  "let g:neocomplete#disable_auto_complete = 1
  "inoremap <expr><TAB>  pumvisible() ? "\<Down>" : "\<C-x>\<C-u>"

  " 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

  " Enable heavy omni completion.
  if !exists('g:neocomplete#sources#omni#input_patterns')
    let g:neocomplete#sources#omni#input_patterns = {}
    endif
    "let g:neocomplete#sources#omni#input_patterns.php = '[^. \t]->\h\w*\|\h\w*::'
    "let g:neocomplete#sources#omni#input_patterns.c = '[^.[:digit:] *\t]\%(\.\|->\)'
    "let g:neocomplete#sources#omni#input_patterns.cpp = '[^.[:digit:] *\t]\%(\.\|->\)\|\h\w*::'

" For perlomni.vim setting.
  " https://github.com/c9s/perlomni.vim
  let g:neocomplete#sources#omni#input_patterns.perl = '\h\w*->\h\w*\|\h\w*::'


" vim-easymotion の設定 -------------------------------------------------------
  " デフォルトのキーマッピングを無効に
    let g:EasyMotion_do_mapping = 0
  " f + 2文字 で画面全体を検索してジャンプ
    nmap f <plug>(easymotion-overwin-f2)
  " 検索時、大文字小文字を区別しない
    let g:EasyMotion_smartcase = 1


" vim-showmarks の設定 --------------------------------------------------------
  " 基本マップ
    nnoremap [Mark] <Nop>
    nmap m [Mark]
  " m + s で現在位置をマーク
    if !exists('g:markrement_char')
        let g:markrement_char = [
        \     'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
        \     'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
        \ ]
    endif
    nnoremap <silent>[Mark]s :<C-u>call <SID>AutoMarkrement()<CR>:DoShowMarks<CR>
    function! s:AutoMarkrement()
        if !exists('b:markrement_pos')
            let b:markrement_pos = 0
        else
            let b:markrement_pos = (b:markrement_pos + 1) % len(g:markrement_char)
        endif
        execute 'mark' g:markrement_char[b:markrement_pos]
        echo 'marked' g:markrement_char[b:markrement_pos]
    endfunction
  " m + l でマーク一覧を表示/非表示
    let g:mark_exist = 0
    set updatetime=1
    function! s:MarkList()
      if g:mark_exist == 0
        let g:mark_exist = 1
        nnoremap <silent>[Mark]l :<C-u>1PreviewMarks<CR>
        \:<C-u>NoShowMarks<CR> :<C-u>call <SID>MarkList()<CR>
      else
        let g:mark_exist = 0
        nnoremap <silent>[Mark]l :<C-u>PreviewMarks<CR>
        \:<C-u>DoShowMarks<CR> :<C-u>call <SID>MarkList()<CR>
      endif
    endfunction
    nnoremap <silent>[Mark]l :<C-u>PreviewMarks<CR>
  \:<C-u>DoShowMarks<CR> :<C-u>call <SID>MarkList()<CR>

  " m + m + 1文字 で指定のマークへ移動
    nnoremap [Mark]m '
  " m + n で次のマークへ移動
    nnoremap [Mark]n ]`
  " m + b で前のマークへ移動
    nnoremap [Mark]b [`


" lightline.vim の設定 --------------------------------------------------------
  let g:lightline = {
    \ 'colorscheme': 'jellybeans',
    \ 'active': {
    \   'left': [ ['mode', 'paste'],
    \             ['fugitive', 'readonly', 'filename', 'modified'],
    \             ['ctrlpmark'] ],
    \   'right': [ [ 'syntastic', 'lineinfo' ], ['percent'],
    \              [ 'fileformat', 'fileencoding', 'filetype' ] ]
    \ },
    \ 'component': {
    \   'readonly': '%{&readonly?"[読専]":""}',
    \ },
    \ 'component_function': {
    \   'fugitive': 'LightlineFugitive',
    \   'filename': 'LightlineFilename',
    \   'fileformat': 'LightlineFileformat',
    \   'filetype': 'LightlineFiletype',
    \   'fileencoding': 'LightlineFileencoding',
    \   'mode': 'LightlineMode',
    \   'ctrlpmark': 'CtrlPMark',
    \ },
    \ }

  function! LightlineFugitive()
    return exists('*fugitive#head') ? fugitive#head() : ''
  endfunction

  function! LightlineFilename()
  let fname = expand('%:t')
  return fname == 'ControlP' && has_key(g:lightline, 'ctrlp_item') ? g:lightline.ctrlp_item :
        \ fname =~ 'NERD_tree' ? '' :
        \ &ft == 'unite' ? unite#get_status_string() :
        \ ('' != fname ? fname : '[No Name]')
  endfunction

  function! LightlineFileformat()
    return winwidth(0) > 70 ? &fileformat : ''
  endfunction

  function! LightlineFiletype()
    return winwidth(0) > 70 ? (&filetype !=# '' ? &filetype : 'no ft') : ''
  endfunction

  function! LightlineFileencoding()
    return winwidth(0) > 70 ? (&fenc !=# '' ? &fenc : &enc) : ''
  endfunction

  function! LightlineMode()
    let fname = expand('%:t')
    return fname == 'ControlP' ? 'CtrlP' :
          \ fname =~ 'NERD_tree' ? 'NERDTree' :
          \ &ft == 'unite' ? 'Unite' :
          \ winwidth(0) > 60 ? lightline#mode() : ''
  endfunction

  function! CtrlPMark()
  if expand('%:t') =~ 'ControlP' && has_key(g:lightline, 'ctrlp_item')
    call lightline#link('iR'[g:lightline.ctrlp_regex])
    return lightline#concatenate([g:lightline.ctrlp_prev, g:lightline.ctrlp_item
          \ , g:lightline.ctrlp_next], 0)
  else
    return ''
  endif
  endfunction

  let g:ctrlp_status_func = {
    \ 'main': 'CtrlPStatusFunc_1',
    \ 'prog': 'CtrlPStatusFunc_2',
    \ }

  function! CtrlPStatusFunc_1(focus, byfname, regex, prev, item, next, marked)
    let g:lightline.ctrlp_regex = a:regex
    let g:lightline.ctrlp_prev = a:prev
    let g:lightline.ctrlp_item = a:item
    let g:lightline.ctrlp_next = a:next
    return lightline#statusline(0)
  endfunction

  function! CtrlPStatusFunc_2(str)
    return lightline#statusline(0)
  endfunction


" NERDTree の設定 -------------------------------------------------------------
  " ディレクトリ表示の設定
    let g:NERDTreeDirArrows = 1
    let g:NERDTreeDirArrowExpandable  = '→'
    let g:NERDTreeDirArrowCollapsible = '↓'
  " ctrl-n で NERDTree を起動
  nnoremap <silent> <C-n> :NERDTreeToggle<CR>


" CtrlP の設定 -------------------------------------------------------------
" キャッシュディレクトリ
  " F5 でキャッシュの更新ができる
    let g:ctrlp_cache_dir = $HOME.'/.cache/ctrlp'
  " キャッシュを終了時に削除しない
    let g:ctrlp_clear_cache_on_exit = 0
  " 遅延再描画
    let g:ctrlp_lazy_update = 1
  " 無視するディレクトリ/ファイル
    let g:ctrlp_custom_ignore = {
      \ 'dir':  '',
      \ 'file': '\v\.(exe|o)$',
      \ 'link': 'some_bad_symbolic_links',
      \ }

" 基本設定 --------------------------------------------------------------------
  " 画面表示
    syntax on                 " 構文をハイライト
    colorscheme hybrid        " カラースキームを hybrid に設定
    set background=dark       " カラースキームのテーマを設定
    set t_Co=256              " Vim の表示に256色用いる
    " カラースキームの調整
      hi Normal ctermbg=none
      hi Comment ctermfg=102
      hi default link fortranTab none
    set number                " 行番号を表示
    set ruler                 " 現在の行とカラム位置を表示
    set cursorline            " カーソルラインを表示
    set laststatus=2          " ステータス行を常に表示
    set showcmd               " 入力中のコマンドを表示
    set noshowmode            " vim のモードを表示しない
    set cmdheight=2           " コマンドラインを2行確保
    set showmatch             " 対応する括弧を強調表示する
    set matchtime=1           " カッコにカーソルが飛ぶ時間の設定
    let fortran_free_source=1 " 固定形式を自由形式に変える
    let fortran_fold=1

  " カーソル移動
    set backspace=start,indent,eol " Backspaceキーの影響範囲に制限を設けない
    set scrolloff=8                " 上下スクロール時の視界を確保
    set sidescrolloff=16           " 左右スクロール時の視界を確保
    set sidescroll=1               " 左右スクロールは一文字づつ行う

  " 文字入力
    set autoindent                              " インデント
    set tabstop=2                               " タブ幅
    set expandtab                               " タブを空白で置換
    autocmd Filetype * setlocal formatoptions=q " 自動改行しない
    set pastetoggle=<F2>                        " F2 でペーストモードへ切り替え
    set viminfo='20,\"1000                      " ヤンクを1000行まで保存する

  " ファイル処理
    set confirm    " 保存されていないファイルがあるときは終了前に保存確認
    set hidden     " 保存されていないファイルがあるときでも別のファイルを開くことが出来る
    set autoread   " 外部でファイルに変更がされた場合は読みなおす
    set nobackup   " ファイル保存時にバックアップファイルを作らない
    set noswapfile " ファイル編集中にスワップファイルを作らない

  " 検索/置換
    set hlsearch   " 検索文字列をハイライトする
    set incsearch  " インクリメンタルサーチを行う
    set ignorecase " 大文字と小文字を区別しない
    set smartcase  " 大文字と小文字が混在した言葉で検索を行った場合に限り、大文字と小文字を区別する
    set wrapscan   " 最後尾まで検索を終えたら次の検索で先頭に移る

  " キーマッピング
    " ESC + ESC でハイライトを消す
    nnoremap <silent><ESC><ESC> :nohlsearch<CR>
    " g + h でカーソルの位置の文字を検索
    nnoremap gh *<CR>
    " Y で行末までヤンクする
    nnoremap Y y$
    " + と - で数字のインクリメント、デクリメントを行う
    nnoremap + <C-a>
    nnoremap - <C-x>
    " gis で git status の呼び出し
    "   -  : add, reset
    "   cc : git commit
    nnoremap <silent>gis :Gstatus<CR>
    " gid で git diff を行う
    nnoremap <silent>gid :Gvdiff<CR>
    " gic で git checkout HEAD を行う
    nnoremap <silent>gic :Gread<CR>
    " ctrl + j で半画面進む、ctrl + k で半画面戻る
    nnoremap <C-j> <C-d>
    nnoremap <C-k> <C-u>
    " U で redo を行う(u は undo)
    nnoremap U <C-r>