完璧な.vimrc
文字コードの自動認識 †
以下を .vimrc に書いておけば日本語の文字コード識別は多分完璧
" 文字コードの自動認識
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
endfunction
autocmd BufReadPost * call AU_ReCheck_FENC()
endif
" 改行コードの自動認識
set fileformats=unix,dos,mac
" □とか○の文字があってもカーソル位置がずれないようにする
if exists('&ambiwidth')
set ambiwidth=double
endif
vim の文字コード判定の仕組みは以下の通りです。
- fileencodings の設定を前から順に試してはじめにマッチしたものが採用される
- encoding や fileencoding の設定値が途中に発見されるとそこで判定を止めてしまい後の設定は無視される
- この動作により、UNIX環境(euc-jpの場合)では euc-jp が fileencodings の前の方に設定されていると、cp932 や utf-8 で書いたファイルが文字化けてしまうので気をつける必要がある。
- encoding に設定される文字コードは fileencodings に見つからなかったときのデフォルト値に使われるので fileencodings に設定する必要は無い。
上記の設定では実行環境に合わせてそれらが吸収できるので windows 環境でも unix 環境でも上手く判定できる。
■追記
- EUC-JPで「〜(波線)」が文字化ける問題を修正(eucjp-msが使える場合はそれを使うように)した。 2006-10-06 (金) 02:24
- fileencoding=utf-8で編集中、□や○があるとその行でカーソル位置がずれる問題があったのだが、解決する設定(ambiwidth=double)を追加した。 2006-11-17 (金) 21:48
- 日本語を含まないファイルを開いたときにfileencodingがiso-2022-jpになってしまう問題があったが、日本語の有無を再チェックしてより望ましい値(encodingの値)をfileencodingに設定するようにした。 2007-01-10 (水) 11:38
文字コードを指定してファイルを開きなおす †
普通は上記の自動認識で問題ないと思うが、それでも文字化けする場合や、わざと違う文字コードで開いてみたい場合に使う。
例えば以下のようにするとeuc-jpでファイルを開き直せる。
:e ++enc=euc-jp
文字コードを変更して保存する †
cp932 (Shift-JIS) にするには以下のようにする。
:set fileencoding=cp932
この状態だとまだ保存してないので :w してやれば文字コードを変更して保存になる。
改行コードの自動認識 †
以下を .vimrc に書いておけばよい。
set fileformats=unix,dos,mac
新規ファイルの場合 fileformats の最初の改行コードが使われるようなので好みにより順番を変えます。
順番を変えても自動判定が失敗することは経験上無いようです。
改行コードを変更する †
:set fileformat=改行コードの種類
ff は fileformat の短い形式なので ff でも良い。
改行コードの種類で指定できるのは dos, max, unix の3つです。
例)Windows形式の改行コードに変更するには以下のようにします。
:set fileformat=dos
改行コードの見分け方(UNIX環境前提) †
改行コードが unix でない場合、^M という文字が大量に表示されることがあります。これは mac で使われる改行文字です。 これを見たらきっと改行コードが違うんだなと思ってください。
見分け方は以下の通りです。
- 普通に改行されていて特に問題を感じない → 改行コードは unix
- 全ての行末に ^M がくっついている → 改行コードは dos
- ^M が沢山表示されるうえに全てが1行に表示されてしまう → 改行コードは mac
改行コードが分かったら以下を実行すれば正常に表示されるようになります。(dosと分かった場合)
:e ++ff=dos
検索語が画面の真ん中に来るようにする †
.vimrc に以下のようなキーマッピングを書いておきます。
nmap n nzz nmap N Nzz nmap * *zz nmap # #zz nmap g* g*zz nmap g# g#zz
解説:zz はカレント行を画面の中心にします。 (つまり n で検索語にカーソル移動したら勝手に zz でカレント行が画面の真ん中なるようにスクロールされるようになる)
暗号化 †
vim は単体で PKZIP とかと同じ暗号化アルゴリズムでファイルを暗号化することが出来ます。
- ファイルを暗号化する
- 暗号化したいファイルを以下のように -x オプションを付けて起動します。
vim -x secret.txt
- 起動すると暗号化に使うパスワードの入力を求められます。確認の為2回聞かれます。
- 開いたら今まで通り普通にファイルの編集画面になります。
- このまま普通に :w などで保存すればファイルは暗号化して保存されます。
- 暗号化したいファイルを以下のように -x オプションを付けて起動します。
- 暗号化されたファイルを編集する
- vim によって暗号化されたファイルを開くには普通に vim で開くだけです。
vim secret.txt
- 起動時にパスワードを要求するプロンプトが出るので正しいパスワードを入れれば普通に開いて編集できます。
- 間違ったパスワードを入れても復号化されますがそれは意味の無い只のバイナリデータに見えるはずです。
- vim によって暗号化されたファイルを開くには普通に vim で開くだけです。
- 暗号化を解除する、もしくはパスワードを変更する。
- まずは普通に起動してパスワードを入力してファイルを開きます。
- 以下のコマンドを実行すると新しいパスワードを要求されます。
:X
- パスワードの変更後は普通に保存すれば新しいパスワードで暗号化されて保存されます。
- 暗号化を解除したい場合は :X でパスワードを空(何も入力せずにEnter)にして保存するだけです。
- 注意点
- 保存されたファイルは暗号化されますが、スワップファイルは暗号化されません。それを読むことが出来る人はパスワードを知らなくても内容を見ることが出来ます。
- vim の起動時に -n を付けて起動すればスワップファイルは作成されません。
- 保存されたファイルは暗号化されますが、スワップファイルは暗号化されません。それを読むことが出来る人はパスワードを知らなくても内容を見ることが出来ます。
バイナリ編集 †
vim でバイナリを編集したい場合ですが、よくある16進ダンプとそれのテキスト表示があると便利です。
探してみたところこのサイトで xxd を使ってバイナリ編集をする方法を紹介していたので試してみたところ便利そうなのでメモ。
但しそのままだと少し問題があった*1
のでそれを修正した版が以下の設定です。
"バイナリ編集(xxd)モード(vim -b での起動、もしくは *.bin ファイルを開くと発動します) augroup BinaryXXD autocmd! autocmd BufReadPre *.bin let &binary =1 autocmd BufReadPost * if &binary | silent %!xxd -g 1 autocmd BufReadPost * set ft=xxd | endif autocmd BufWritePre * if &binary | %!xxd -r | endif autocmd BufWritePost * if &binary | silent %!xxd -g 1 autocmd BufWritePost * set nomod | endif augroup END