" 改行コードの自動判別 " 入力改行コードの手動指定は、 " :e ++ff=dos " らしい。 " 出力改行コードの手動指定は、 " :set ff=dos " らしい。 set fileformats=unix,dos,mac " 漢字コード自動判別マクロ(augroup vimrc_fencs とセット) " 起動と同時に手動指定する場合は、 " vim "+e ++enc=utf8" filename " らしい。 " 入力文字コードの手動指定は、 " :e ++enc=euc-jp " らしい。 " 出力文字コードの手動指定は、 " :set fenc=cp932 " らしい。 " 画面表示文字コードの手動指定は、 " :set tenc=japanese " とか " :set tenc=utf-8 " とか " :set tenc=euc-jisx0213 " とか " :set tenc=euc-jp-ms " らしい。 " モードラインで指定する場合は、 " vim:set fencs=euc-jp nomodified: " らしい。 let g:initial_enc = &enc let g:initial_tenc = &tenc if &encoding !~? 'utf-8' set encoding=japan " デフォルトの言語の設定 "set encoding=utf-8 let &tenc = g:initial_tenc endif set fileencoding=japan " デフォルトの言語の設定 if has('iconv') " let s:enc_euc = '2byte-euc-jp' let s:enc_jis = 'iso-2022-jp' " 非標準の文字コードへの対応状況を判定 if iconv("\x87\x64\x87\x6a", 'cp932', 'euc-jisx0213') ==# "\xad\xc5\xad\xcb" let s:enc_eucx = '2byte-euc-jisx0213' endif if iconv("\x87\x64\x87\x6a", 'cp932', 'euc-jp-ms') ==# "\xad\xc5\xad\xcb" let s:enc_eucm = '2byte-euc-jp-ms' endif " " fileencodingsを構築 let s:fileencodings_default = &fileencodings if &encoding =~? 'euc\%(\|-\)j' " 内部コードが日本語EUC の時 set fileencodings-=euc-jp set fileencodings-=2byte-euc-jp set fileencodings-=euc-jisx0213 set fileencodings-=2byte-euc-jisx0213 set fileencodings+=ucs-4le,ucs-4 set fileencodings+=ucs-2le,ucs-2 "set fileencodings+=iso-8859-1 " latin1 を追加すると、EUC とか CP932 とかよりも優先してしまう let &fileencodings = &fileencodings .','. s:enc_jis set fileencodings+=cp932,sjis set fileencodings+=utf-8 if &encoding =~? 'euc\%(\|-\)jp' " 内部コードが eucJP-JISX0212の時 set fileencodings+=2byte-euc-jisx0213 elseif &encoding =~? 'euc-jisx0213' " 内部コードが eucJP-JISX0213の時 set fileencodings+=2byte-euc-jp endif elseif &encoding =~? 'utf-8' " 内部コードが UTF-8の時 " ucs2, ucs2le は自動判定できない。 let &fileencodings = s:enc_jis let &fileencodings = &fileencodings .','. s:enc_euc if exists("s:enc_eucx") let &fileencodings = &fileencodings .','. s:enc_eucx endif set fileencodings+=cp932,sjis set fileencodings-=utf-8 let &fileencodings = &fileencodings .','. s:fileencodings_default elseif &encoding =~? '\%(932\|sjis\|shift\|ms_kanji\)' " 内部コードが ShiftJISか CP932の時 set fileencodings-=euc-jp set fileencodings-=2byte-euc-jp set fileencodings-=cp932 set fileencodings-=sjis set fileencodings+=ucs-4le,ucs-4 set fileencodings+=ucs-2le,ucs-2 "set fileencodings+=iso-8859-1 " latin1 を追加すると、EUC とか CP932 とかよりも優先してしまう let &fileencodings = &fileencodings .','. s:enc_jis if exists("s:enc_eucm") let &fileencodings = &fileencodings .','. s:enc_eucm else let &fileencodings = &fileencodings .','. s:enc_euc endif if exists("s:enc_eucx") let &fileencodings = &fileencodings .','. s:enc_eucx endif set fileencodings+=utf-8 if &tenc =~? 'euc\%(\|-\)jp' if exists("s:enc_eucm") let &tenc = s:enc_eucm endif endif else " 内部コードがそれ以外の時 set fileencodings+=ucs-4le,ucs-4 set fileencodings+=ucs-2le,ucs-2 "set fileencodings+=iso-8859-1 " latin1 を追加すると、EUC とか CP932 とかよりも優先してしまう let &fileencodings = &fileencodings .','. s:enc_jis let &fileencodings = &fileencodings .','. s:enc_euc if exists("s:enc_eucx") let &fileencodings = &fileencodings .','. s:enc_eucx endif set fileencodings+=cp932,sjis set fileencodings+=utf-8 endif "unlet s:enc_euc "unlet s:enc_eucx "unlet s:enc_eucm "unlet s:enc_jis "unlet s:fileencodings_default let s:initial_encoding = &encoding let s:initial_fencs = &fencs " if &encoding =~? 'euc\%(\|-\)jp$' let s:encstr = "EUC-JP" elseif &encoding =~? 'euc-jisx' let s:encstr = "EUC-JX" elseif &encoding =~? 'euc\%(\|-\)jp\%(ms\|-ms\|-win\)' let s:encstr = "EUC-JM" elseif &encoding =~? 'iso\%(\|-\)2022\%(\|-\)jp' let s:encstr = "2022JP" else let s:encstr = &encoding endif " if has("autocmd") augroup vimrc_fencs " 内部コードに euc-jp かつファイルの文字コードに CP932 を使う場合は、内部コードを euc-jp-ms に変えないとこける。 function s:EncAdjust() if (&fileencoding !~? '\%(932\|sjis\|shift\|ms_kanji\)') && (&fencs !~? '^\%(CP932\|MS932\|sjis\|shift\|ms_kanji\)$') if exists("s:assigned_encoding") let &encoding=s:initial_encoding unlet s:assigned_encoding endif elseif (&encoding =~? 'euc\%(\|-\)jp$') && exists("s:enc_eucm") let &encoding=s:enc_eucm if (&fencs =~? ',') && (&fileencoding !~? '932') :e ++enc=cp932 endif let s:assigned_encoding=1 endif endfunction au BufWinEnter,BufEnter * nested call EncAdjust() " モードラインで文字コードを指定した時は再読み込みしないと反映されない au BufWinEnter * nested if exists("s:assigned_fencs") | elseif s:initial_fencs !=? &fencs | let s:assigned_fencs=1 | :e | endif " 強制指定した文字コード判定を元に戻す。 au BufLeave * if exists("s:assigned_fencs") | let &fencs=s:initial_fencs | unlet s:assigned_fencs | endif " 現在の vim7.0 + iconv2.0 の場合、 " asciiなファイルを扱う場合は " fencs内での iso-8859, jis, euc, cp932, sjis の " 最も優先度が高い物を適用し、 " サイズ 0 のファイルを扱う場合は " fencs内の先頭の物を適用してしまうので、 " 内部文字コード優先に変更。 if 700 <= version au BufRead * nested if exists("s:assigned_fencs") | elseif (0 == getfsize(expand("%"))) || ((&fenc =~? 'iso\%(\|-\)2022') && (0 == search('[^\x00-\x1a\x1c-\x7f]','cnw'))) | let &fencs=g:initial_enc | let s:assigned_fencs=1 | :e | endif else " vim6 は search() で \x00 や c flag が使えない。 au BufRead * nested if exists("s:assigned_fencs") | elseif (0 == getfsize(expand("%"))) || ((&fenc =~? 'iso\%(\|-\)2022') && (0 == search('[^\t -~]','nw'))) | let &fencs=&enc | let s:assigned_fencs=1 | :e | endif endif augroup END " " ステータスラインに表示する表示文字列を生成 " &fenc や &enc をそのまま表示すると長いので、短縮する。 augroup vimrc_statusline function s:Fenc2slstr() if &fileencoding =~? 'euc\%(\|-\)jp$' let b:fencstr = "eucJP" elseif &fileencoding =~? 'euc-jisx' let b:fencstr = "eucJX" elseif &fileencoding =~? 'euc\%(\|-\)jp\%(ms\|-ms\|-win\)' let b:fencstr = "eucJM" elseif &fileencoding =~? 'iso\%(\|-\)2022\%(\|-\)jp' let b:fencstr = "2022jp" elseif &fileencoding != '' let b:fencstr = &fileencoding elseif s:encstr != '' let b:fencstr = s:encstr else let b:fencstr = '???' endif if &bomb let b:fencstr = (b:fencstr).'(BOM)' endif if &ff ==? 'unix' let b:ffstr = "LF" elseif &ff ==? 'dos' let b:ffstr = "CL" elseif &ff ==? 'mac' let b:ffstr = "CR" elseif &ff != '' let b:ffstr = &fileencoding else let b:ffstr = "??" endif let b:statusstr = '['.(b:fencstr).':'.(b:ffstr).']' endfunction if 700 <= version au SessionLoadPost,BufWinEnter,User,BufRead,BufWrite,CursorHold,InsertEnter * nested call Fenc2slstr() else au VimEnter,BufWinEnter,User,BufRead,BufWrite,CursorHold * nested call Fenc2slstr() endif augroup END " " ファイルサイズ取得で " (line2byte(line('$')+1)-1) すると、リアルタイムでサイズ取得できるが、 " iconv変換後のサイズになり、ディスク上のサイズとずれる。 " getfsize(expand('%')) すると、ディスク上のサイズを得られるが、 " セーブした後しか正しいサイズを得られない。 set statusline=%<%f\ %m%r%h%w%=%l/%L,%3v\ %3p%%\ %7{(getfsize(expand('%')))}\ %{exists('b:statusstr')?\ b:statusstr\ :'[-----:--]'} else set statusline=%<%f\ %m%r%h%w%=%l/%L,%3v\ %3p%%\ %{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'} "set statusline=%<%f\ %m%r%h%w%=%l/%L,%3v\ %7{getfsize(expand('%'))}\ %3p%%\ %{'['.(&fenc=~?'euc\%(\|-\)jp'?'eucJP':&fenc=~?'euc-jisx'?'eucJX':&fenc=~?'iso\%(\|-\)2022\%(\|-\)jp'?'2022jp':&fenc!=''?&fenc:encstr).']['.&ff.']'} "set statusline=%<%f\ %m%r%h%w%=%l/%L,%3c%4p%%\ %{'['.&tenc.']['.&enc.']['.&fenc.']['.&ff.']'} endif " else " if has('iconv') else set statusline=%<%f\ %m%r%h%w%=%l/%L,%3v\ %3p%%\ %7{(getfsize(expand('%')))} endif " " End of File