基本的なvimrcの設定について調べてみた
もろもろの諸事情により、vimを使うことになったので、基本的なvimrcの設定について調べてみた。
なお、確認環境はwindows7であり、gvim(香り屋版)とする。
ベース設定
"------------------------------------------------------------------------------- " ベース設定 "------------------------------------------------------------------------------- scriptencoding cp932 " このファイルのエンコード set nocompatible " vi互換しない
windows環境なので、vimrcのエンコードはcp932にしている。
エンコーディング設定
"------------------------------------------------------------------------------- " 内部エンコーディング設定 "------------------------------------------------------------------------------- set encoding=cp932 " 内部エンコーディング "------------------------------------------------------------------------------- " エンコーディング、ファイルフォーマット設定 "------------------------------------------------------------------------------- set fileencoding=cp932 " 基本文字コード set fileencodings=iso-2022-jp,cp932,sjis,euc-jp,utf-8 " 文字コード自動判別(優先順) set fileformat=dos " 基本ファイルフォーマット set fileformats=dos,unix,mac " ファイルフォーマット自動判別(優先順)
内部エンコーディングや、デフォルトのエンコードもcp932。
ファイルフォーマット(改行コード)は、dos(CRLF)。
システム設定
"------------------------------------------------------------------------------- " システム設定 "------------------------------------------------------------------------------- set nobackup " backupファイルを作らない set writebackup " ファイルの上書きの前にbackupファイルを作る " nobackupの場合は、上書きに成功したら削除される set backupdir=~/vimfiles/backup " backupファイルディレクトリ set swapfile " swapファイルを作る set directory=~/vimfiles/swap " swapファイルディレクトリ set confirm " 保存されていないファイルがあるとき、終了前に保存確認 set hidden " 保存されていないファイルがあるときでも、保存しないで他のファイルを表示 set autoread " 外部でファイルに変更がされた場合は読みなおす set browsedir=buffer " ファイル保存時の場所を、開いているファイルが有る場所に設定 set noerrorbells " エラー音抑止(gvimはgvimrcで指定) set novisualbell " ビジュアルベル抑止(gvimはgvimrcで指定) set visualbell t_vb= " ビープ音抑止(gvimはgvimrcで指定) set history=100 " コマンド、検索履歴数 set infercase " 補完の際の大文字小文字の区別しない set wildmenu " ファイル名補完有効 set wildmode=list:longest,full " 補完モード "補完モード " "" 最初のマッチのみを補完する。 " "full" 次のマッチを完全に補完する。最後のマッチの次には元の文字列が使われ、その次は再び最初のマッチが補完される " "longest" 共通する最長の文字列までが補完される。それ以上長い文字列を補完できないときは、次の候補に移る " "longest:full" "longest" と似ているが、'wildmenu' が有効ならばそれを開始する " "list" 複数のマッチがあるときは、全てのマッチを羅列する。 " "list:full" 複数のマッチがあるときは、全てのマッチを羅列し、最初のマッチを補完する " "list:longest" 複数のマッチがあるときは、全てのマッチを羅列し、共通する最長の文字列までが補完される set shellslash " Windowsで"/"を有効 set virtualedit+=block " 矩形選択でカーソル位置の制限を解除
念のため、swapと上書き前のbackupはとるようにしている。(まぁ、今どきいらない気もしますが。)
その他は、説明の通り。
表示設定
"------------------------------------------------------------------------------- " 表示設定 "------------------------------------------------------------------------------- set number " 行番号の表示 set ruler " 右下に行・列の番号を表示 set title " タイトル表示 set list " 不可視文字を表示 set listchars=eol:\|,tab:>-,trail:-,extends:>,precedes:<,nbsp:% " 不可視文字の置き換え設定 set display=uhex " 表示できない文字を16進数で表示 set matchpairs& matchpairs+=<:> " 対応括弧に<と>のペアを追加 set showmatch " 括弧の対応表示 set matchtime=1 " 括弧の対応表示時間[1/10秒] set laststatus=2 " 常にステータスラインを表示 "ステータスライン表示モード " "0" 一番下のウィンドウはステータスラインを表示しない " "1" ウィンドウが1つの時はステータスラインを表示しない 2つ以上ある場合は、ステータスラインを表示する " "2" 常にステータスラインを表示する set cmdheight=2 " コマンドラインの高さ (gvimはgvimrcで指定) set showcmd " 入力中のコマンドをステータスラインに表示 syntax on " シンタックスハイライト set cursorline " カーソル行をハイライト set cursorcolumn " カーソル位置のカラムのハイライト set colorcolumn=80 " 80行目に色を付ける colorscheme jellybeans " カラースキーマ(gvimはgvimrcで指定) set scrolloff=5 " 上下5行の視界を確保 set sidescrolloff=16 " 左右スクロール時の視界を確保 set sidescroll=1 " 左右スクロールは一文字づつ行う set backspace=indent,eol,start " バックスペースでインデントや改行を削除可能 set whichwrap=b,s,h,l,<,>,[,] " 左右移動で行跨ぎ可能 set nowrap " 折り返さない set textwidth=0 " テキストの最大幅を無効にする set ambiwidth=double " 全角記号(○、□等)の位置ズレ対応
listcharsは、適当な記号に置き換えてもいい。80行目への色付けも好みの問題。
gvimの場合は、colorschemeはgvimrcに記載する必要がある。
検索/置換設定
"------------------------------------------------------------------------------- " 検索/置換設定 "------------------------------------------------------------------------------- set ignorecase " 大/小文字無視 set smartcase " ただし大文字を含む検索の場合は大/小文字有効 set incsearch " インクリメンタルサーチ有効 set hlsearch " 検索結果ハイライト表示 set wrapscan " 検索をファイルの先頭へループする set gdefault " 置換の時 g オプションをデフォルトで有効
編集設定
"------------------------------------------------------------------------------- " 編集設定 "------------------------------------------------------------------------------- set clipboard=unnamed,autoselect " OSクリップボード使用、選択時自動コピー set tabstop=2 " タブ幅 set softtabstop=2 " タブ幅(編集時) set shiftwidth=2 " インデント幅 set smarttab " 行頭の<Tab>は"shiftwidth"、それ以外は"tabstop" set shiftround " インデントをshiftwidthの倍数に丸める set expandtab " タブの代わりにスペース set autoindent " 前行に合わせてインデント set smartindent " 前行の末尾に合わせてインデントを増減
プラグイン設定
"------------------------------------------------------------------------------- " ファイルタイプ設定(off) "------------------------------------------------------------------------------- filetype off " ファイルタイプの自動検出off filetype plugin off " ファイルタイプ別プラグインのロードoff filetype indent off " ファイルタイプ別インデントのロードoff "------------------------------------------------------------------------------- " ランタイムパス設定 "------------------------------------------------------------------------------- if has('vim_starting') set runtimepath+=~/vimfiles/bundle/neobundle.vim/ endif "------------------------------------------------------------------------------- " neobundle(プラグイン管理) "------------------------------------------------------------------------------- call neobundle#rc(expand('~/vimfiles/bundle/')) NeoBundle 'Shougo/neobundle.vim' "NeoBundle 'Shougo/vimproc', { " \ 'build' : { " \ 'windows' : 'make -f make_mingw32.mak', " \ 'cygwin' : 'make -f make_cygwin.mak', " \ 'mac' : 'make -f make_mac.mak', " \ 'unix' : 'make -f make_unix.mak', " \ }, " \ } NeoBundle 'Shougo/unite.vim' NeoBundle 'Shougo/vimfiler' NeoBundle 'Shougo/vimshell' " reST編集 NeoBundle 'Rykka/riv.vim' " zoom in/out NeoBundle 'thinca/vim-fontzoom' " textハイライト NeoBundle 'HybridText' " vim メモ NeoBundle 'glidenote/memolist.vim' NeoBundle 'fuenor/qfixgrep.git' " カッコ付け NeoBundle 'tpope/vim-surround' " This is a selected text. →S[ → This is [a selected text'.] " This is (a surrounded text). →ds( → This is a surrounded text. " This is 'a surrounded text'. →cs'( → This is ( a surrounded text ). " 整形 NeoBundle 'vim-scripts/Align' " ヤンク履歴利用 NeoBundle 'vim-scripts/YankRing.vim' " ステータスラインのハイライト NeoBundle 'itchyny/lightline.vim' " colorscheme NeoBundle 'nanotech/jellybeans.vim' NeoBundle 'altercation/vim-colors-solarized' NeoBundle 'therubymug/vim-pyte' NeoBundle 'w0ng/vim-hybrid' NeoBundle 'vim-scripts/twilight' NeoBundle 'jonathanfilip/vim-lucius' NeoBundle 'jpo/vim-railscasts-theme' NeoBundle 'vim-scripts/Wombat' NeoBundle 'tomasr/molokai' NeoBundle 'vim-scripts/rdark' NeoBundle 'ujihisa/unite-colorscheme' NeoBundleCheck "------------------------------------------------------------------------------- " ファイルタイプ設定(on) "------------------------------------------------------------------------------- filetype on " ファイルタイプの自動検出on filetype plugin on " ファイルタイプ別プラグインのロードon filetype indent on " ファイルタイプ別インデントのロードon
プラグインの設定を反映させるために、ファイルタイプを一旦offにして、プラグインのロード後にonにする。
プラグイン管理には、neobundleを利用。導入するプラグインは適宜読み替える。
gvim(香り屋版)は、vimprocを含んでいるので、別途インストールする必要なし。
各種プラグインの設定
"------------------------------------------------------------------------------- " unite "------------------------------------------------------------------------------- let g:unite_enable_start_insert = 0 " インサートモードで開始しない let g:unite_source_file_mru_filename_format = '' " file_mruの表示フォーマットを指定。 " 空にすると表示スピードが高速化される "------------------------------------------------------------------------------- " vimfiler "------------------------------------------------------------------------------- let g:vimfiler_as_default_explorer = 1 " vimデフォルトのエクスプローラをvimfilerで置き換える let g:vimfiler_safe_mode_by_default = 0 " セーフモードを無効にした状態で起動する "------------------------------------------------------------------------------- " riv(reST編集用) "------------------------------------------------------------------------------- let g:riv_fold_level = 0 "let g:riv_web_browser = '"C:\Program Files\Google\Chrome\Application\chrome.exe"' let g:riv_web_browser = '"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"' let g:riv_temp_path = 1 let g:riv_html_code_hl_style = "friendly" "------------------------------------------------------------------------------- " HybridText(textハイライト用) "------------------------------------------------------------------------------- autocm BufEnter * if &filetype == "" || &filetype == "text" | setlocal ft=hybrid | endif "------------------------------------------------------------------------------- " memolist(メモ管理用) "------------------------------------------------------------------------------- let g:memolist_memo_suffix = "txt" let g:memolist_template_dir_path = '~/vimmemo' let g:memolist_memo_date = "%Y-%m-%d %H:%M" "let g:memolist_memo_date = "epoch" "let g:memolist_memo_date = "%D %T" "let g:memolist_prompt_tags = 1 "let g:memolist_prompt_categories = 1 let g:memolist_qfixgrep = 1 let g:memolist_vimfiler = 1 let g:memolist_vimfiler_option = "-split -winwidth=50 -simple" "let g:memolist_unite = 1 "let g:memolist_unite_source = "file_rec" "let g:memolist_unite_option = "-auto-preview -start-insert" let g:memolist_path = '~/vimmemo' "let g:memolist_filename_prefix_none = 1 "------------------------------------------------------------------------------- " lightline(ステータスラインのハイライト) "------------------------------------------------------------------------------- " ステータスラインの上書くを抑止 let g:unite_force_overwrite_statusline = 0 let g:vimfiler_force_overwrite_statusline = 0 " 以下からのコピペ " http://d.hatena.ne.jp/itchyny/20130828/1377653592 let g:lightline = { \ 'colorscheme': 'wombat', \ 'mode_map': {'c': 'NORMAL'}, \ 'active': { \ 'left': [ [ 'mode', 'paste' ], [ 'fugitive', 'filename' ] ] \ }, \ 'component_function': { \ 'modified': 'MyModified', \ 'readonly': 'MyReadonly', \ 'fugitive': 'MyFugitive', \ 'filename': 'MyFilename', \ 'fileformat': 'MyFileformat', \ 'filetype': 'MyFiletype', \ 'fileencoding': 'MyFileencoding', \ 'mode': 'MyMode' \ } \ } function! MyModified() return &ft =~ 'help\|vimfiler\|gundo' ? '' : &modified ? '+' : &modifiable ? '' : '-' endfunction function! MyReadonly() return &ft !~? 'help\|vimfiler\|gundo' && &readonly ? 'x' : '' endfunction function! MyFilename() return ('' != MyReadonly() ? MyReadonly() . ' ' : '') . \ (&ft == 'vimfiler' ? vimfiler#get_status_string() : \ &ft == 'unite' ? unite#get_status_string() : \ &ft == 'vimshell' ? vimshell#get_status_string() : \ '' != expand('%:t') ? expand('%:t') : '[No Name]') . \ ('' != MyModified() ? ' ' . MyModified() : '') endfunction function! MyFugitive() try if &ft !~? 'vimfiler\|gundo' && exists('*fugitive#head') return fugitive#head() endif catch endtry return '' endfunction function! MyFileformat() return winwidth(0) > 70 ? &fileformat : '' endfunction function! MyFiletype() return winwidth(0) > 70 ? (strlen(&filetype) ? &filetype : 'no ft') : '' endfunction function! MyFileencoding() return winwidth(0) > 70 ? (strlen(&fenc) ? &fenc : &enc) : '' endfunction function! MyMode() return winwidth(0) > 60 ? lightline#mode() : '' endfunction
プラグインごとに適当に。
lightlineを利用する際の注意として、unite/vimfilerのforce_overwrite_statuslineを無効にしておかないと、unite/vimfilerを利用した際、lightlineが有効にならない。(というか、上書かれる。)
(lightline公式の導入方法とかにも、注意として書いておいてくれればいいのに。。。)
マッピング/autocmd
"------------------------------------------------------------------------------- " Mapping "------------------------------------------------------------------------------- " map:キーシーケンスを展開したあと、さらに別のマップを適用 "noremap:一度だけ展開 "------------------------------------------------------------------------------- " コマンド ノーマル インサート コマンドライン ビジュアル " map/noremap @ - - @ " map!/noremap! - @ @ - " nmap/nnoremap @ - - - " imap/inoremap - @ - - " cmap/cnoremap - - @ - " vmap/vnoremap - - - @ "------------------------------------------------------------------------------- "--------------------------------------- " Prefix nnoremap [space] <Nop> nmap <Space> [space] xmap <Space> [space] nnoremap [Window] <Nop> nmap <Space>w [Window] nnoremap [Tag] <Nop> nmap <Space>t [Tag] nnoremap [unite] <Nop> nmap <Space>u [unite] nnoremap [vimfiler] <Nop> nmap <Space>f [vimfiler] "--------------------------------------- " uniteマッピング "現在開いているファイルのディレクトリ下のファイル一覧。 "開いていない場合はカレントディレクトリ nnoremap <silent> [unite]f :<C-u>UniteWithBufferDir -buffer-name=files file<CR> " バッファ一覧 nnoremap <silent> [unite]b :<C-u>Unite buffer<CR> " レジスタ一覧 nnoremap <silent> [unite]r :<C-u>Unite -buffer-name=register register<CR> " 最近使用したファイル一覧 nnoremap <silent> [unite]m :Unite file_mru<CR> " ブックマーク一覧 nnoremap <silent> [unite]c :<C-u>Unite bookmark<CR> " ブックマークに追加 nnoremap <silent> [unite]a :<C-u>UniteBookmarkAdd<CR> augroup vimrc autocmd FileType unite call s:unite_my_settings() augroup END function! s:unite_my_settings() "ESCでuniteを終了 nmap <buffer> <ESC> <Plug>(unite_exit) "入力モードのときjjでノーマルモードに移動 imap <buffer> jj <Plug>(unite_insert_leave) "入力モードのときctrl+wでバックスラッシュも削除 imap <buffer> <C-w> <Plug>(unite_delete_backward_path) "sでsplit nnoremap <silent><buffer><expr> s unite#smart_map('s', unite#do_action('split')) inoremap <silent><buffer><expr> s unite#smart_map('s', unite#do_action('split')) "vでvsplit nnoremap <silent><buffer><expr> v unite#smart_map('v', unite#do_action('vsplit')) inoremap <silent><buffer><expr> v unite#smart_map('v', unite#do_action('vsplit')) "fでvimfiler nnoremap <silent><buffer><expr> f unite#smart_map('f', unite#do_action('vimfiler')) inoremap <silent><buffer><expr> f unite#smart_map('f', unite#do_action('vimfiler')) endfunction "--------------------------------------- " VimFilerマッピング "現在開いているバッファのディレクトリを開く nnoremap <silent> [vimfiler]e :<C-u>VimFilerBufferDir -quit<CR> "現在開いているバッファをIDE風に開く nnoremap <silent> [vimfiler]i :<C-u>VimFilerBufferDir -split -simple -winwidth=35 -no-quit<CR> "デフォルトのキーマッピングを変更 augroup vimrc autocmd FileType vimfiler call s:vimfiler_my_settings() augroup END function! s:vimfiler_my_settings() nmap <buffer> q <Plug>(vimfiler_exit) nmap <buffer> Q <Plug>(vimfiler_hide) endfunction "--------------------------------------- " vimrc編集/反映 nnoremap [space]v :<C-u>tabedit $MYVIMRC<CR> nnoremap [space]g :<C-u>tabedit $MYGVIMRC<CR> nnoremap [space]s :<C-u>source $MYVIMRC<CR> \ :source $MYGVIMRC<CR> "--------------------------------------- " 半透明 autocmd GUIEnter * set transparency=220 autocmd FocusGained * set transparency=220 autocmd FocusLost * set transparency=128 "--------------------------------------- " インサートから抜けたら、IME解除 inoremap <silent> <ESC> <ESC>:set iminsert=0<CR> "--------------------------------------- " 全角スペース表示 function! ZenkakuSpace() highlight ZenkakuSpace cterm=reverse ctermfg=darkgreen gui=reverse guifg=darkgreen endfunction if has('syntax') augroup ZenkakuSpace autocmd! autocmd ColorScheme * call ZenkakuSpace() autocmd VimEnter,WinEnter,BufRead * match ZenkakuSpace / / augroup END endif "--------------------------------------- " タブページ用 " 以下のサイトからの転用 " http://qiita.com/wadako111/items/755e753677dd72d8036d " --- " tp : 前のタブ " tt : 次のタブ " t1, t2,,,t9 : 左からn番目のタブにジャンプ " tn : 新しいタブ " tx : タブを閉じる " --- " ----- 転用ここから(一部変更) ----- " Anywhere SID. function! s:SID_PREFIX() return matchstr(expand('<sfile>'), '<SNR>\d\+_\zeSID_PREFIX$') endfunction " Set tabline. function! s:my_tabline() "{{{ let s = '' for i in range(1, tabpagenr('$')) let bufnrs = tabpagebuflist(i) let bufnr = bufnrs[tabpagewinnr(i) - 1] " first window, first appears let no = i " display 0-origin tabpagenr. let mod = getbufvar(bufnr, '&modified') ? '!' : ' ' let title = fnamemodify(bufname(bufnr), ':t') let title = '[' . title . ']' let s .= '%'.i.'T' let s .= '%#' . (i == tabpagenr() ? 'TabLineSel' : 'TabLine') . '#' let s .= no . ':' . title let s .= mod let s .= '%#TabLineFill# ' endfor let s .= '%#TabLineFill#%T%=%#TabLine#' return s endfunction "}}} let &tabline = '%!'. s:SID_PREFIX() . 'my_tabline()' set showtabline=2 " 常にタブラインを表示 " The prefix key. "nnoremap [Tag] <Nop> "nmap t [Tag] " Tab jump for n in range(1, 9) execute 'nnoremap <silent> [Tag]'.n ':<C-u>tabnext'.n.'<CR>' endfor " t1 で1番左のタブ、t2 で1番左から2番目のタブにジャンプ map <silent> [Tag]n :tablast <bar> tabnew<CR> " tc 新しいタブを一番右に作る map <silent> [Tag]x :tabclose<CR> " tx タブを閉じる map <silent> [Tag]t :tabnext<CR> " tn 次のタブ map <silent> [Tag]p :tabprevious<CR> " tp 前のタブ " ----- 転用ここまで ----- "--------------------------------------- " window操作用 " wn : 垂直分割(新規) " ws : 垂直分割(今のファイル) " wvn : 水平分割(新規) " wvs : 水平分割(今のファイル) " <C-W>w : 次のウィンドウに移動 " <C-W>p : 前のウィンドウに移動 " <C-W>h : 左のウィンドウに移動 " <C-W>j : 下のウィンドウに移動 " <C-W>k : 上のウィンドウに移動 " <C-W>l : 右のウィンドウに移動 " <C-W>q : ウィンドウを閉じる map <silent> [Window]n :new<CR> map <silent> [Window]s :sp<CR> map <silent> [Window]vn :vne<CR> map <silent> [Window]vs :vs<CR> "map <silent> [Window]w <C-W>w<CR> "map <silent> [Window]p <C-W>p<CR> "map <silent> [Window]h <C-W>h<CR> "map <silent> [Window]j <C-W>j<CR> "map <silent> [Window]k <C-W>k<CR> "map <silent> [Window]l <C-W>l<CR> "map <silent> [Window]x <C-W>q<CR> nnoremap <silent> <S-Left> <C-w>h<CR> nnoremap <silent> <S-Down> <C-w>j<CR> nnoremap <silent> <S-Up> <C-w>k<CR> nnoremap <silent> <S-Right> <C-w>l<CR>
ここが、vimで自分らしさを発揮するところ。
上記は、個人的に役立ちそうなものを設定している。
vim初心者は、とりあえずvimrc編集/反映のマッピングだけ設定しておいて、あとは、必要になった段階で試考錯誤しながら、自分で追加するのが良いのではないでしょうか。
まとめ
よければ、ご参考までに。
認識が誤っている箇所、もっと良い方法があれば、コメントいただけると幸いです。