" Vi互換オフ
set nocompatible

" Setup Vundle
filetype off

set rtp+=$HOME/.vim/bundle/vundle/
call vundle#rc()

" Vundle manage Vundle
Bundle 'gmarik/vundle'

" Vundle Tips
" :BundleInstall                      プラグインのインストール
" :BundleInstall!                     プラグインのアップデート
" :Bundles script_name                プラグインの検索
" :helptags ~/.vim/bundle/vundle/doc  ヘルプの生成

" github repos
" Bundle 'user_name/repository_name'

" vim-scripts repos
" Bundle 'script_name'

" non github repos
" Bundle 'git://repository_url'

Bundle 'h1mesuke/vim-alignta'
Bundle 'tyru/DumbBuf.vim'
Bundle 'sjl/gundo.vim'
Bundle 'Shougo/neocomplcache'
Bundle 'scrooloose/nerdcommenter'
Bundle 'scrooloose/nerdtree'
Bundle 'thinca/vim-quickrun'
Bundle 'thinca/vim-ref'
Bundle 'kana/vim-smartchr'
Bundle 'tpope/vim-surround'
Bundle 'Shougo/unite.vim'
Bundle 'Shougo/vimproc'
Bundle 'Shougo/vimshell'
Bundle 'osyo-manga/vim-cpp11-syntax'
Bundle 'mattn/zencoding-vim'
Bundle 'mattn/webapi-vim'
Bundle 'mattn/vimplenote-vim'
Bundle 'vim-jp/vimdoc-ja'
Bundle 'vim-ruby/vim-ruby'
Bundle 'vim-scripts/YankRing.vim'
Bundle 'tpope/vim-rails'
Bundle 't9md/vim-textmanip'
Bundle 'othree/eregex.vim'

Bundle 'bufexplorer.zip'
Bundle 'SQLUtilities'
Bundle 'dbext.vim'
Bundle 'SQLComplete.vim'
Bundle 'taglist.vim'
Bundle 'Source-Explorer-srcexpl.vim'
Bundle 'capslock.vim'
Bundle 'Quich-Filter'
Bundle 'grep.vim'
Bundle 'mru.vim'
Bundle 'renamer.vim'
Bundle 'sudo.vim'
Bundle 'trinity.vim'
" Bundle 'project.tar.gz'

Bundle 'altercation/vim-colors-solarized'
Bundle 'tomasr/molokai'

filetype plugin indent on

"RUNTIMEPATHの共通化
set runtimepath+=$HOME/.vim,$HOME/.vim/after

"文字コードの設定
" set encoding=japan
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
set fileencodings=ucs-bom,utf-8,iso2022-jp,utf-16,sjis,cp932,euc-jp

" tmux用設定
if &term == 'screen'
    set <F1>=[11~
    set <F2>=[12~
    set <F3>=[13~
    set <F4>=[14~
    set <F5>=[15~
    set <F6>=[17~
    set <F7>=[18~
    set <F8>=[19~
    set <F9>=[20~
    set <F10>=[21~
    set <F11>=[23~
    set <F12>=[24~
endif

" カラースキーマの設定
set t_Co=256
" colorscheme desert
" colorscheme h2u_black
colorscheme DarkDefault

" C++11用syntaxの有効化
let g:c_no_curly_error = 1

" カラースキーマのカスタマイズ
command! MyHi call MyColor()

function! MyColor()
    highlight TabLineSel term=bold cterm=bold,underline ctermfg=3
    highlight Visual term=reverse ctermbg=60
endfunction

" ヘルプファイルの優先度
set helplang& helplang=ja,en

" ビープ音消去
set visualbell t_vb=

" コマンドをステータス行に表示
set showcmd
" 現在のモードを表示
set showmode

" モードラインを有効
set modeline
set modelines=2

" splitの表示位置を下に
set splitbelow
" vsplitの表示位置を右に
set splitright

" puttyでマウス操作可能にする設定
" screen: xterm2  tmux: xterm
set mouse=a
" set ttymouse=xterm2
set ttymouse=xterm

" ***** バックアップ関連の設定 *****
" スワップの設定
set swapfile
set directory=$HOME/vimbackup

" バックアップを作らない
set nobackup
" 保存時のみバックアップを作成
set writebackup
" バックアップの保存先
set backupdir=$HOME/vimbackup
" バックアップファイルの拡張子
set backupext=.back
" ファイルのコピーを作成してバックアップにし上書き保存
set backupcopy=yes

" スクロールのマージ
set scrolloff=5

" ***** 検索に関する設定 *****
" 小文字での検索時に大文字小文字を区別しない
set ignorecase
" 大文字がある場合のみ大文字小文字を区別
set smartcase
" インクリメンタルサーチ
set incsearch
" 検索結果をハイライト
set hlsearch
" 検索のループ
set wrapscan

" 補完の際の大文字小文字の区別しない ignorecaseとsmartcaseに依存
set infercase

" ポップアップで表示される補完候補の最大表示数
set pumheight=10

" 行番号や色分けなど
set number
set showmatch
set ruler
set cursorline
set cursorcolumn
set guicursor& guicursor=a:blinkwait1000-blinkon750-blinkoff750

" 不可視文字の表示
" tab:最初2文字 trail:行末の空白 extends:折り返しの行末 precedes:折り返しの行頭 eol:行末
set list
set listchars=tab:>\ ,trail:-,nbsp:%,extends:>,precedes:<

syntax on
filetype on
filetype indent on
filetype plugin on

" GUI用のオプション e削除:タブの非GUI化 m→M:メニュー非表示 r削除:サイドバー非表示
set guioptions& guioptions=ceMgr

" クリップボードの使用
set clipboard& clipboard+=unnamed

" :コマンドの記録数
set history=100

" ターミナル接続の高速化
set ttyfast

" キーワード補完の検索対象
"set complete=.,b,u,i
set complete+=k

" コマンドラインの行数
set cmdheight=3

" スクリプト実行中に画面を描画しない
" set lazyredraw

" ***** statuslineの設定 *****
" ステータスラインを常に表示
set laststatus=2
" ステータスラインに文字コードと改行文字を表示
if winwidth(0) >= 120
    set statusline=%<[%n]%m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).':'.&ff.']'}%y\ %F%=[%{GetByte()}]\ %l
else
    set statusline=%<[%n]%m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).':'.&ff.']'}%y\ %f%=[%{GetByte()}]\ %l
endif

" カーソルの下の文字コード取得の為の関数群
function! GetByte()
    let c = matchstr(getline('.'), '.', col('.') - 1)
    let c = iconv(c, &enc, &fenc)
    return String2Hex(c)
endfunction

function! String2Hex(str)
    let out = ''
    let ix = 0
    while ix < strlen(a:str)
        let out = out . Nr2Hex(char2nr(a:str[ix]))
        let ix = ix + 1
    endwhile
    return out
endfunction

function! Nr2Hex(nr)
    let n = a:nr
    let r = ""
    while n
        let r = '0123456789ABCDEF'[n % 16] . r
        let n = n / 16
    endwhile
    return r
endfunction

" インサートモードでステータスラインのカラーを変更
augroup InsertHock
    autocmd!
    autocmd InsertEnter * highlight StatusLine term=bold cterm=bold ctermfg=7 ctermbg=4
    autocmd InsertLeave * highlight StatusLine term=bold cterm=bold ctermfg=4 ctermbg=7
    " autocmd InsertEnter * highlight StatusLine guifg=#ccdc90 guibg=#2E4340
    " autocmd InsertLeave * highlight StatusLine guifg=#2E4340 guibg=#ccdc90
augroup END

" ***** タブ関係の設定 *****
" タブのラベル表示の設定 0:なし 1:2以上で表示 2:常に表示
set showtabline=2
" タブ幅の設定
set tabstop=2
" タブで挿入されるスペース数
set softtabstop=2
" autoindentのスペース数
set shiftwidth=2
" タブをスペースに置換
set expandtab
" 行頭でのタブをshiftwidthの幅に
set smarttab
" オートインデント
set autoindent
" オートインデントが賢くなる
set smartindent
" Cプログラムのインデント
set cindent
" '>' '<' でのインデントをshiftwidthの倍数
set shiftround

" BackSpaceの設定
set backspace=indent,eol,start

" 外部でのファイル更新を自動読み込み
set autoread
" ウィンドウを移動する度にファイルの更新をチェックする自動コマンド
augroup vimrc-checktime
  autocmd!
  autocmd WinEnter * checktime
augroup END

" 編集中の内容を保ったまま別画面に切り替え
set hidden

" 改行コードの自動認識
" set fileformat=unix
" set fileformats=unix,dos,mac
" 会社用
set fileformat=unix
set fileformats=unix,dos,mac

" テキスト整形のオプション
set formatoptions=tcqlM1

" ファイルブラウザのディレクトリ位置
" last:前回のファイルブラウザ位置 buffer:バッファの位置 current:カレントディレクトリ
" {path}: 指定ディレクトリ
set browsedir=buffer

" ディレクトリ表示をツリー形式に
let g:netrw_liststyle=3

" XMLの閉じタグ補完
augroup MyXML
  autocmd!
  autocmd Filetype xml,html inoremap <buffer> </ </<C-x><C-o>
augroup END

" コマンドライン補完の候補を表示
set nowildmenu
set wildchar=<tab>
set wildmode=list:longest,full
" set wildmode=longest:full,full

" グローバルなマークを使用可にする
set viminfo+=f1

" ***** foldの設定 *****
" foldを有効
set foldenable
" fold情報を表示する幅
" set foldcolumn=2
" 自動で閉じるレベル
set foldlevel=1
" 自動で閉じる基準となる行数の下限値
set foldminlines=1
" foldの自動閉じ
" set foldclose=all
" foldの動作
" set foldmethod=marker
set foldmethod=syntax
" foldの最小行数
set foldminlines=2

" -*-*-*-*-*- ↓ 自作コマンド ↓ -*-*-*-*-*-

" UTF-8で開き直すコマンド
command! -bang -nargs=? Utf8 edit<bang> ++enc=utf-8 <args>

" 保存時に行末の空白を除去
autocmd BufWritePre * :%s/\s\+$//ge

" 保存時にtabをスペースに変換
" autocmd BufWritePre * :%s/\t/    /ge

" シンタックスハイライトの予約語を補完へ流用
autocmd FileType *
\   if &l:omnifunc == ''
\ |     setlocal omnifunc=syntaxcomplete#Complete
\ | endif

" Vim戦闘力測定コマンド
function! Scouter(file, ...)
  let pat = '^\s*$\|^\s*"'
  let lines = readfile(a:file)
  if !a:0 || !a:1
    let lines = split(substitute(join(lines, "\n"), '\n\s*\\', '', 'g'), "\n")
  endif
  return len(filter(lines, 'v:val !~ pat'))
endfunction

command! -bar -bang -nargs=? -complete=file Scouter
\       echo Scouter(empty(<q-args>) ? $MYVIMRC : expand(<q-args>), <bang>0)
command! -bar -bang -nargs=? -complete=file GScouter
\       echo Scouter(empty(<q-args>) ? $MYGVIMRC : expand(<q-args>), <bang>0)

" -*-*-*-*-*- ↑ 自作コマンド ↑ -*-*-*-*-*-

" -*-*-*-*-*- ↓ Key-mappings ↓ -*-*-*-*-*-

let mapleader = ","

" :と;の置き換え
noremap ; :
noremap : ;

" マークやレジスタ
nnoremap    <Space>m    :<C-u>marks
nnoremap    <Space>r    :<C-u>registers

" ESC2回でハイライト消去
nmap <ESC><ESC> ;nohlsearch<CR><ESC>

".vimrcの編集・リロード
nnoremap <Space>.
\   :<C-u>edit $MYVIMRC<CR>
nnoremap <Space>L
\   :<C-u>source $MYVIMRC<CR>

" ヘルプファイルを右分割で開くコマンド
nnoremap <C-h>  :<C-u>vertical belowright help<Space>

" 選択した文字列で検索
vnoremap <silent> // y/<C-r>=escape(@", '\\/.*$^~[]')<CR><CR>
" 選択した文字列で置換
vnoremap /r y:%S/<C-r>=escape(@", '\\/.*$^~[]')<CR>//gc<Left><Left><Left>

" 最後に変更されたテキストを選択
nnoremap    gc          `[v`]

" ***** タブ操作の設定 *****
nnoremap    [Tab]               <Nop>
nmap        <C-t>               [Tab]
nnoremap    <silent> [Tab]n     :<C-u>tabnew<CR>
nnoremap    <silent> [Tab]c     :<C-u>tabclose<CR>
nnoremap    <silent> [Tab]o     :<C-u>tabonly<CR>
nnoremap    [Tab]j              gt
nnoremap    [Tab]k              gT
" <C-Tab>にもタブ切り替えを割り当て
nnoremap    <C-Tab>     gt
nnoremap    <C-S-Tab>   gT
nnoremap    <Tab>       gt

" ***** タグジャンプ操作の設定 *****
nnoremap    [Tag]               <Nop>
nmap        t                   [Tag]
nnoremap    [Tag]t              <C-]>
nnoremap    <silent> [Tag]j     :<C-u>tag<CR>
nnoremap    <silent> [Tag]k     :<C-u>pop<CR>
nnoremap    <silent> [Tag]l     :<C-u>tags<CR>

" ***** ウィンドウ操作の設定 *****
nnoremap    <S-Up>      <C-w>k
nnoremap    <S-Down>    <C-w>j
nnoremap    <S-Left>    <C-w>h
nnoremap    <S-Right>   <C-w>l
nnoremap    <Space>k    <C-w>k
nnoremap    <Space>j    <C-w>j
nnoremap    <Space>h    <C-w>h
nnoremap    <Space>l    <C-w>l
" nnoremap    <C-w>o      <C-w>_

" ***** insert mode でのカーソル移動 *****
inoremap    <M-k>       <Up>
inoremap    <M-j>       <Down>
inoremap    <M-h>       <Left>
inoremap    <M-l>       <Right>

" ***** 折畳(fold)の設定 *****
" foldの先頭へ
nnoremap    zh      [z
" foldの末尾へ
nnoremap    zl      ]z

" ***** text-manip *****
xmap <Space>d <Plug>(textmanip-duplicate-down)
" nmap <Space>d <Plug>(textmanip-duplicate-down)
xmap <Space>D <Plug>(textmanip-duplicate-up)
" nmap <Space>D <Plug>(textmanip-duplicate-up)

xmap <C-j> <Plug>(textmanip-move-down)
xmap <C-k> <Plug>(textmanip-move-up)
xmap <C-h> <Plug>(textmanip-move-left)
xmap <C-l> <Plug>(textmanip-move-right)


" カレントディレクトリ移動用のコマンドの定義
command! -nargs=? -complete=dir -bang CD call s:ChangeCurrentDir('<args>', '<bang>')
function! s:ChangeCurrentDir(directory, bang)
  " if a:directory == ''
      " |cd %:p:h
  " else
      " execute '|cd' . a:directory
  " endif

  " if a:bang ==''
      " pwd
  " endif
endfunction
" コマンドをマッピング
nnoremap    <silent> <Space>cd      :<C-u>CD<CR>

" 年月日の自動入力
inoremap <expr> ,dt strftime('%Y.%m.%d')

" -*-*-*-*-*- ↑ Key-mappings ↑ -*-*-*-*-*-


" -*-*-*-*-*- ↓ Pluginの設定 ↓ -*-*-*-*-*-

" ***** Vimでの表示をHTML出力コマンド→ :TOhtml の設定 *****
" 1=true 0=false
" 行番号表示
let htmljj_number_lines = 1
" XHTMLで出力
let g:use_xhtml = 1
" CSS使用 ※HTMLに直接埋め込まれるので注意
let g:html_use_css = 1
" preタグの禁止
let g:html_no_pre = 1
" メタタグのcharsetの指定
let html_use_encoding = "UTF-8"
" メタタグが指定のものになるだけなので保存前に設定が必要
" 例:
" :TOhtml
" :set fenc=UTF-8
" :w

" CapsLockPlugin
imap <C-a> <C-O><Plug>CapsLockToggle

" sudoPlugin sudoで保存するコマンド :w sudo;%

" %の機能拡張Plugin:matchit.vimの有効化
source $VIMRUNTIME/macros/matchit.vim

" ***** YankRingの設定 *****
" 最大記録数
let g:yankring_max_history = 30
" YRShowの最大桁数
let g:yankring_max_sidplay = 80

let g:yankring_manual_clipboard_check = 0

" ***** MRU(ファイル履歴)の設定 *****
" :MRU でリスト表示i
" 最大記録数
let MRU_Max_Entries = 20
" 除外ファイルを正規表現にて指定
let MRU_Exclude_files = "^/tmp/.*\|^/var/tmp/.*"
" ファイルリストの高さ
let MRU_Window_height = 15
" ファイル決定後のリストの開閉動作 0:閉じない 1:閉じる
let MRU_Auto_Close = 1

" ***** テキスト整形ツール Alignの設定 *****
" 日本語対応
let g:Align_xstrlen = 3

" ***** Allargs 全てのバッファでコマンドを実行 *****
" 全てのバッファで置換
"   :Allargs %s/foo/bar/ge|update
" カレントの *.cpp を置換
"   :ar *.cpp

" ***** NERDTree *****
" NERD treeの表示切替
nnoremap    <f2>    :NERDTreeToggle<CR>
" ファイルオープン後の動作 0:そのまま 1:閉じる
let NERDTreeQuitOnOpen = 1
" 隠しファイルの表示 0:非表示 1:表示
let NERDTreeShowHidden = 1
" ツリーウィンドウの横幅
let NERDTreeWinSize = 30

" ***** bufexplorer *****
" nnoremap    <F3>    :BufExplorerVerticalSplit<CR>
nnoremap    <F3>    :BufExplorer<CR>

" ***** DumbBuf *****
let g:dumbbuf_hotkey='<F4>'

" ***** NERD Commenter *****
" コメント間のスペース幅
let NERDSpaceDelims = 1

" ***** neocomplcache *****
let g:neocomplcache_enable_at_startup = 1
let g:neocomplcache_manual_completion_start_length = 3
let g:neocomplcache_enable_smart_case = 1
let g:neocomplcache_enable_underbar_completion = 1
let g:neocomplcache_min_syntax_length = 3
" let g:neocomplcache_enable_quick_match = 1

" ユーザ定義スニペット補完ファイルのあるディレクトリ,区切りで複数可
"let g:neocomplcache_snippets_dir =

" ***** filtering.vim *****
nnoremap ,F :call Gather(input("Filter on term: "), 0)<CR>
nnoremap ,f :call Gather(@/, 0)<CR>:echo<CR>
nnoremap ,g :call GotoOpenSearchBuffer()<CR>
nnoremap ,d :call CloseAllSearchWindows()<CR>

" ***** gundo.vim *****
nnoremap <F7> :GundoToggle<CR>
nnoremap U :GundoToggle<CR>

" ***** taglist *****
nnoremap <silent> <F8> :TlistToggle<CR>

" ***** SourceExplorer *****
nnoremap <F9> :SrcExplToggle<CR>
" let g:SrcExpl_UpdateTags = 1
" let g:SrcExpl_RefreshMapKey = "<Space>"
" let g:SrcExpl_GoBackMapKey = "<C-b>"

" タグを選択した際にウィンドウを閉じるかどうか 0:そのまま 1:閉じる
let Tlist_Close_On_Select = 1
" タグツリーを自動的に閉じるかどうか 0:そのまま 1:閉じる
let Tlist_File_Fold_Auto_Close = 1
" タグウィンドウをオープン時のフォーカス移動 0:そのまま 1:移動する
let Tlist_GainFocus_On_ToggleOpen = 1
" タグウィンドウの幅
let Tlist_WinWidth = 40

" ***** TwitVim *****
nnoremap <Space>po  :<C-u>PosttoTwitter<CR>
nnoremap <Space>fr  :<C-u>FriendsTwitter<CR>
nnoremap <Space>re  :<C-u>RepliesTwitter<CR>

" -*-*-*-*-*- ↑ Pluginの設定 ↑ -*-*-*-*-*-

" vim: set expandtab: