Omakeの自動継続ビルドしようとしたらvimでハマった

sphinx専用エディタとかないかなーってつぶやいたらOmakeを薦められた。
世の中便利なものがあるんだねーほえーとか思いながらOmakeをビルドして
自動makeいざ尋常にって勝負したら動いてくれないわけ。

いろいろやってもだめで悩んだ挙句ファイル汚くしたんで一旦戻そうと思って
svn revert * ってやったら動いたわけですよ。意味がわからんし。

そこでいろいろ試してみることに。
まずemacs使ってやった
なんだと。。。動くだと。。。
emacsにできてvimに(ry

次にvim -u NONE hoge.rst してみる。
vimをデフォルトの状態で起動したわけです。
なんだと。。。動くだと。。。

で、犯人は/Users/yuito/.vimrc or /Users/yuito/.vim/* に決定

で、ここからが本題です。

vimのhelpから引用

options - vimdoc-ja

'backupcopy' 'bkc' 文字列 (UnixでのViの既定値: "yes" 、それ以外: "auto")
グローバル
{Vi にはない}
ファイルの書き込みをしてバックアップが作られるとき、その方法をこのオプ
ションで指定する。このオプションはコンマで区切られた単語のリストである。

主な値は次の通り:
"yes" 先にファイルのコピーを作ってバックアップにして、更新した内容は
元のファイルに上書きする
"no" 先に元のファイルをリネームしてバックアップにして、更新した内容
は新しいファイルに書き出す
"auto" どちらか適切な方を選ぶ

次の値を上のどれか1つと組み合わせることができる:
"breaksymlink"は書き込み時に常にシンボリックリンクを切る。
"breakhardlink"は書き込み時に常にハードリンクを切る。

backupとwritebackupの関係

editing - vimdoc-ja

'backup' 'writebackup' 動作
off off バックアップは作られない
off on カレントファイルをバックアップし、後で消去する (既定)
on off 古いバックアップを消去し、カレントファイルをバックアッ
プする
on on 古いバックアップを消去し、カレントファイルをバックアッ
プする

簡単にいうとbackupを作成するときは元ファイルが更新されときと
元ファイルをバックアップにして新しいファイルに更新が書き出されるときがある。

しかし、こいつに関係しそうなオプションが沢山あってわけわかめなので
3つのオプションの組み合わせでどんな挙動をするのかの検証をしてみた。

基本的にはbackupはとらないので

set nobackup

は設定しておきます

  • その1
set writebackup
set backupcopy=auto
 *** omake error:
   File OMakefile: line 18, characters 1-36
   rule failed to build target: source/index.rst

対象ファイルがなくなったって言われる

  • その2
set writebackup
set backupcopy=yes

問題なし

  • その3
set writebackup
set backupcopy=no

問題なし

  • その4
set nowritebackup
set backupcopy=auto or yes or no

:quitのタイミングでbuildが走る


とりあえずbackupcopy=autoはやめましょうということで。

vimでpep8を実行

最近python書く機会が多くなったので、自動でやってほしいよねと。
探したらこれが見つかった
https://github.com/nvie/vim-pep8
感謝しながらダウンロードしてきて.vimに展開
vundleの人は

" .vimrc
Bundle 'git://github.com/nvie/vim-pep8.git'
" :BundleInstall 実行

保存したときに実行するように設定

autocmd FileType python call s:python_settings()
function! s:python_settings()
  autocmd BufWritePost <buffer> call Pep8()
endfunction

ftplugin/python.vimに書いてもいい

f:id:yuitowest:20111110135305p:image

quickfixに結果が出力されます

neocomplcacheをインストールしてみた

作者の方がneocomplcache.vimはそれなりに複雑なプラギンだしインストールしても
たいへんだよってなことを言っていた。
けどすごい便利なので使えないのももったいない気がする。
とりあえずインストールまでを説明してみようと思った。

インストール

http://github.com/Shougo/neocomplcache/downloads
から最新をダウンロードする。(現状最新はver.5.1)

zip or tarを解凍するとこんな感じの構成になっている。
f:id:yuitowest:20100907213247p:image
それぞれのフォルダが何なのか知りたい人はここ http://vim-users.jp/2009/06/hack34/

autoload doc indent plugin presen syntaxというフォルダがあると思います。
このフォルダをvimのフォルダにコピーします。
ただし、presenはいりません。

OSX, linux系をお使いの方は~/.vimに移動します。
windowsをお使いの方は vimのインストールフォルダ/runtime/に移動します。
[OSX]
f:id:yuitowest:20100907214529p:image
[windows]
f:id:yuitowest:20100907214716p:image

移動したらダウンロードしてきたneocomplcacheの中身をコピーします。
f:id:yuitowest:20100907215226p:image

これでインストール完了です。

neocomplcacheを動かしてみましょう

本来は:helpとか:helptagsとか使うのですが、わからない人もいると思うので直接いっちゃいます。
先ほどneocomplcacheをインストールしたフォルダ(.vim とか runtime とか)に移動します。
docというフォルダがあると思うのでさらにその中に移動します。
neocomplcache.txtというファイルがあるので開きます。
620行目あたりになんとサンプルの設定が書いてあるではないですか!
f:id:yuitowest:20100907220016p:image
サンプルをコピーします。
vimrcファイルに貼り付けます。
貼り付け時に勝手にインデントとかうぜぇ〜〜〜ってひとは:set pasteしてください。
f:id:yuitowest:20100907220459p:image
保存していったんvimを終了します。
vimを機動します。
なんとneocomplcacheが動きます。
f:id:yuitowest:20100907220500p:image
ご丁寧にmapまで書いていただいております。
tabで補完できるぜ!いぇいw

各設定が何をやってるかわからないとか、こんな設定ないの?とか思った方は
先ほどのdocフォルダにあるneocomplcache.jaxファイルを開いてみましょう。
詳しい説明が日本語で書かれています。まず読んでみましょう。

たのしい補完ライフを送ってください!

MacVimを広く使いたいので邪魔なモノを消す設定など

"透明度を指定
set transparency=20
"ツールバーなし
set guioptions-=T
"メニューバーなし
set guioptions-=m
"右スクロールバーなし
set guioptions-=r
set guioptions-=R
"左スクロールバーなし
set guioptions-=l
set guioptions-=
"下スクロールバーなし
set guioptions-=b

vimで自動補完

ずっとautocomplpopを使っていたのだが、neocomplcacheというのがあるのを知って試してみた。

クイックマッチがすごく便利!補完候補が大量にあるときとかCtrl+n叩きまくる必要がなくなったw
動作がさくさくwいらいらしなくてすむw
helpがしっかりしてるw
いろいろ設定ができてカスタムしやすいw


以上の理由でそく乗り換えました。


.vimrcに追記した設定

" vim起動時にneocomplcacheを起動するか 1:有効 2:無効(初期値)
let g:NeoComplCache_EnableAtStartup = 1
" 入力に大文字が含まれている場合は、大文字・小文字を無視しない 1:有効 2:無効(初期値)
let g:NeoComplCache_SmartCase = 1
" ポップアップメニューで表示される候補の数
let g:NeoComplCache_MaxList = 50
" 単語の出現頻度だけではなく、前の単語とのつながりも考慮して候補の並び替えを行うかどうか 1:有効(初期値) 0:無効
let g:NeoComplCache_PreviousKeywordCompletion = 1
" プレビューウインドウが開いているとき、追加情報を表示するかどうか 1:有効 0:無効
let g:NeoComplCache_EnableInfo = 1
" 大文字を入力したときに、それを単語の区切りとしてあいまい検索を行うかどうか 1:有効 0:無効(初期値)
let g:NeoComplCache_EnableCamelCaseCompletion = 1
" _を入力したときに、それを単語の区切りとしてあいまい検索を行うかどうか 1:有効 0:無効(初期値)
let g:NeoComplCache_EnableUnderbarCompletion = 1
" 補完の対象となるキーワードの最小長さ
let g:NeoComplCache_MinSyntaxLength = 3
" 自動補完を中止するための連続入力時間 初期値0.0
let g:NeoComplCache_SkipInputTime = '0.2'
" 手動補完時に補完を行う入力数
let g:NeoComplCache_ManualCompletionStartLength = 0
" 補完するためのキーワードパターンを記録する(まだよくわかってない)
if !exists('g:NeoComplCache_KeywordPatterns')
    let g:NeoComplCache_KeywordPatterns = {}
endif
let g:NeoComplCache_KeywordPatterns['default'] = '\v\h\w*'
" ユーザが定義したスニペット補完ファイルのパス
let g:NeoComplCache_SnippetsDir = $HOME.'/snippets'

参考:
http://vim-users.jp/2009/07/hack-49/


追記
g:NeoComplCache_KeywordPatternsについてコメントいただいたので。
fileタイプごとの補完キーワードのパターンマッチの設定が行えるものみたい。
.vim/autload/neocomplcache.vimを見るとまんま書いてある。
このままで使えそうです。
例)let g:NeoComplCache_KeywordPatterns['python'] = '\v\h\w*%(\s*\(\)?)?'

vimrc

syntax on
"-------------------------------------------------------------------------------
set nocompatible
"-------------------------------------------------------------------------------
" ステータスライン
set laststatus=2 " 常にステータスラインを表示
"set statusline=%<%F\ %r%h%w%y%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%4v(ASCII=%03.3b,HEX=%02.2B)\ %l/%L(%P)%m
set statusline=[%n]%F\ \ \ \ \ \|%{(&fenc!=''?&fenc:&enc).'\|'.&ff.'\|'}%m%r%=<%l/%L> " ステータスライン
"-------------------------------------------------------------------------------
" 文字コード関連
" □とか○の文字があってもカーソル位置がずれないようにする
if exists('&ambiwidth')
    set ambiwidth=double
endif
"-----------------------------------------------------------------------------
" 基本設定
set ambiwidth=double           " 文脈依存は全角
set ignorecase                 " 検索時に大文字小文字を無視 (noignorecase:無視しない)
set smartcase                  " 大文字小文字の両方が含まれている場合は大文字小文字を区別
set backspace=indent,eol,start " バックスペースでなんでも消せるように
set autoread                   " 他で書き換えられたら自動で読み直す
set noswapfile                 " スワップファイル作らない
set hidden                     " 編集中でも他のファイルを開けるようにする
set formatoptions=lmoq         " テキスト整形オプション,マルチバイト系を追加
"set whichwrap=b,s,h,l,<,>,[,]  " カーソルを行頭、行末で止まらないようにする
"-----------------------------------------------------------------------------
" インデント
set ts=4                 " タブの画面上での幅
set shiftwidth=4         " シフト移動幅
set expandtab            " タブをスペースに展開する
"-----------------------------------------------------------------------------
" 表示
set guicursor=a:blinkon0 " カーソルの点滅を行わない
set ruler                " ルーラーを表示
set sm                   " 括弧入力時に対応する括弧を表示
let loaded_matchparen = 1 "対応括弧を強調しない
set list              " 不可視文字表示
set listchars=tab:>.,trail:_,extends:>,precedes:<" 不可視文字の表示形式
set display=uhex      " 印字不可能文字を16進数で表示
"-----------------------------------------------------------------------------
" 色設定
hi NonText ctermfg=darkgray
hi Folded ctermfg=blue
hi SpecialKey cterm=underline ctermfg=darkgray
hi Folded term=standout cterm=bold ctermfg=4 ctermbg=0
hi Pmenu     cterm=bold ctermfg=4 ctermbg=7
hi PmenuSel  cterm=bold ctermfg=0 ctermbg=6
hi PmenuSbar ctermfg=4 ctermbg=7
hi Search term=NONE cterm=NONE ctermfg=black ctermbg=LightGray
hi Search ctermbg = 4 ctermfg = 7
hi TabLineSel  term=bold cterm=bold,underline ctermfg=7 ctermbg=0
hi TabLineFill ctermfg=white ctermbg=black
hi StatusLine   term=NONE cterm=NONE ctermfg=black ctermbg=white
hi MatchParen term=standout ctermbg=LightGrey ctermfg=Black guibg=LightGrey guifg=Black
"-----------------------------------------------------------------------------
"キーマップ
noremap j gj
noremap k gk
vnoremap j gj
vnoremap k gk
nmap n nzz
nmap N Nzz
nmap * *zz
nmap # #zz
nmap g* g*zz
nmap g# g#zz
" タブを使う
nnoremap <C-h>  gT
nnoremap <C-l>  gt
nnoremap <Leader>1 1gt
nnoremap <Leader>2 2gt
nnoremap <Leader>3 3gt
nnoremap <Leader>4 4gt
nnoremap <Leader>5 5gt
nnoremap <Leader>6 6gt
nnoremap <Leader>7 7gt
nnoremap <Leader>8 8gt
nnoremap <Leader>9 9gt
"-----------------------------------------------------------------------------
" 補完・履歴
set wildmenu           " コマンド補完を強化
set wildchar=<tab>     " コマンド補完を開始するキー
set wildmode=list:full " リスト表示,最長マッチ
set history=1000       " コマンド・検索パターンの履歴数
" <TAB>で補完
function! InsertTabWrapper()
    let col = col('.') - 1
    if !col || getline('.')[col - 1] !~ '\k'
        return "\<TAB>"
    else
        return "\<C-N>"
    endif
endfunction
inoremap <tab> <c-r>=InsertTabWrapper()<cr>
"-----------------------------------------------------------------------------
" 検索
set wrapscan   " 最後まで検索したら先頭へ戻る
set ignorecase " 大文字小文字無視
set smartcase  " 大文字ではじめたら大文字小文字無視しない
set incsearch  " インクリメンタルサーチ
set hlsearch   " 検索文字をハイライト
" 選択した文字列を検索
vnoremap <silent> // y/<C-R>=escape(@", '\\/.*$^~[]')<CR><CR>
" 選択した文字列を置換
vnoremap /r "xy:%s/<C-R>=escape(@x, '\\/.*$^~[]')<CR>//gc<Left><Left><Left>
" Escで検索ハイライトを削除
nnoremap <Esc><Esc> :<C-u>set nohlsearch<Return>
nnoremap / :<C-u>set hlsearch<Return>/
nnoremap ? :<C-u>set hlsearch<Return>?
nnoremap * :<C-u>set hlsearch<Return>*
nnoremap # :<C-u>set hlsearch<Return>#
"-------------------------------------------------------------------------------
" 全角スペース、末尾の半角スペース、タブを色づけする(色は俺好み、でも全角スペースを□にしたい)
if has("syntax")
    syntax on
    function! ActivateInvisibleIndicator()
        syntax match InvisibleJISX0208Space " " display containedin=ALL
        highlight InvisibleJISX0208Space term=underline ctermbg=Blue guifg=#999999 gui=underline
        syntax match InvisibleTrailedSpace "[ ]\+$" display containedin=ALL
        highlight InvisibleTrailedSpace term=underline ctermbg=Red guifg=#FF5555 gui=underline
        syntax match InvisibleTab "\t" display containedin=ALL
        highlight InvisibleTab term=underline ctermbg=Cyan guibg=#555555
    endf

    augroup invisible
        autocmd! invisible
        autocmd BufNew,BufRead * call ActivateInvisibleIndicator()
    augroup END
endif
"-----------------------------------------------------------------------------
"タブ機能
nmap <Tab> :tabn<CR>
nmap <C-t> :tabnew_
set showtabline=2
set tabline=%!MyTabLine()
function MyTabLine()
  let s = ''
  for i in range(tabpagenr('$'))
    if i + 1 == tabpagenr()
      let s .= '%#TabLineSel#'
    else
      let s .= '%#TabLine#'
    endif
    let s .= '%' . (i+1) . 'T'
    let s .= ' ' . (i+1) . (1==getwinvar(i+1,'&modified')?'[+]':'') . ' %{MyTabLabel(' . (i+1) . ')} '
  endfor
  let s .= '%#TabLineFill#%T'
  if tabpagenr('$') > 1
    let s .= '%=%#TabLine#%999Xclose'
  endif
  return s
endfunction

function MyTabLabel(n)
  let buflist = tabpagebuflist(a:n)
  let winnr = tabpagewinnr(a:n)
  return bufname(buflist[winnr - 1])
endfunction
"-----------------------------------------------------------------------------
" QFixHome
let howm_dir             = '~/.vim/howm/'
let howm_filename        = '%Y/%m/%Y-%m-%d-%H%M%S.howm'
let howm_fileencoding    = 'utf-8'
let howm_fileformat      = 'unix'
let mygrepprg = 'grep'
let MyGrep_ShellEncoding = 'utf-8'
"-----------------------------------------------------------------------------
" yankring.vim
let g:yankring_history_dir = "~/.vim/tmp/"
nmap ,y :YRShow<CR>
"-----------------------------------------------------------------------------
" backspace問題用
noremap! <7f> <08>
"-----------------------------------------------------------------------------
" 文字コードの自動認識
if &encoding !=# 'utf-8'
  set encoding=japan
  set fileencoding=japan
endif
if has('iconv')
  let s:enc_euc = 'euc-jp'
  let s:enc_jis = 'iso-2022-jp'
  " iconvがeucJP-msに対応しているかをチェック
  if iconv("\x87\x64\x87\x6a", 'cp932', 'eucjp-ms') ==# "\xad\xc5\xad\xcb"
    let s:enc_euc = 'eucjp-ms'
    let s:enc_jis = 'iso-2022-jp-3'
  " iconvがJISX0213に対応しているかをチェック
  elseif iconv("\x87\x64\x87\x6a", 'cp932', 'euc-jisx0213') ==# "\xad\xc5\xad\xcb"
    let s:enc_euc = 'euc-jisx0213'
    let s:enc_jis = 'iso-2022-jp-3'
  endif
  " fileencodingsを構築
  if &encoding ==# 'utf-8'
    let s:fileencodings_default = &fileencodings
    let &fileencodings = s:enc_jis .','. s:enc_euc .',cp932'
    let &fileencodings = &fileencodings .','. s:fileencodings_default
    unlet s:fileencodings_default
  else
    let &fileencodings = &fileencodings .','. s:enc_jis
    set fileencodings+=utf-8,ucs-2le,ucs-2
    if &encoding =~# '^\(euc-jp\|euc-jisx0213\|eucjp-ms\)$'
      set fileencodings+=cp932
      set fileencodings-=euc-jp
      set fileencodings-=euc-jisx0213
      set fileencodings-=eucjp-ms
      let &encoding = s:enc_euc
      let &fileencoding = s:enc_euc
    else
      let &fileencodings = &fileencodings .','. s:enc_euc
    endif
  endif
  " 定数を処分
  unlet s:enc_euc
  unlet s:enc_jis
endif
" 日本語を含まない場合は fileencoding に encoding を使うようにする
if has('autocmd')
  function! AU_ReCheck_FENC()
    if &fileencoding =~# 'iso-2022-jp' && search("[^\x01-\x7e]", 'n') == 0
      let &fileencoding=&encoding
endif
  endif
  " 定数を処分
  unlet s:enc_euc
  unlet s:enc_jis
endif
" 日本語を含まない場合は fileencoding に encoding を使うようにする
if has('autocmd')
  function! AU_ReCheck_FENC()
    if &fileencoding =~# 'iso-2022-jp' && search("[^\x01-\x7e]", 'n') == 0
      let &fileencoding=&encoding
    endif
  endfunction
  autocmd BufReadPost * call AU_ReCheck_FENC()
endif
" 改行コードの自動認識
set fileformats=unix,dos,mac
" □とか○の文字があってもカーソル位置がずれないようにする
if exists('&ambiwidth')
  set ambiwidth=double
endif
"-----------------------------------------------------------------------------