koturnの日記

普通の人です.ブログ上のコードはコピペ自由です.

Vimのあまり使われない機能について~暗号化と印刷~

はじめに

この記事はVim Advent Calendar 2016の15日目の記事です.

今回はVimであまり知られていない,使われていない機能であると思われる暗号化機能について書きたいと思います.

暗号化機能

Vimテキストエディタですが,単なるテキストエディットだけに留まらず,テキストファイルを暗号化する機能も備わっています. 編集したテキストファイルを保存するとき,ユーザが指定したキーによって暗号化し,再度そのファイルオープンするときにキーの入力を求めます.

f:id:koturn:20161214012205g:plain

そして,オープン時に入力されたキーによって復号化を行うので,正しいキーであれば元のテキストが表示され,異なったキーであればデタラメなテキストが表示されるようになっています.

利用可能な暗号化方式

VIm 8.0の時点では,以下の表に示す3つの暗号化方式が利用可能となっています. 各暗号化方式についての詳細は :h cryptmethod を参照しましょう.

暗号化方式 強度 バージョン
zip 7.2 以前
blowfish 中強度(脆弱性あり) 7.3 以降
blowfish2 中強度 7.4.401 以降

cryptmethod オプションに上記のいずれかの値をセットすることで,暗号化方式を指定することができます.

デフォルトでは zip の指定となっているのですが,最新のVimを利用しており,古いバージョンのVimで開き直すことを考えないのであれば, blowfish2 を指定するべきでしょう. 利用できる最新の暗号化方式を指定していない場合,暗号化するときにVimからワーニングメッセージが出て邪魔になります.

あらゆる環境を想定していて,その環境のVimで利用可能な最新の暗号化方式を利用したいという奇特な方は,以下の設定を.vimrcに記述するとよいでしょう.

if has('cryptv')
  if v:version > 704 || v:version == 704 && has('patch401')
    set cryptmethod=blowfish2
  elseif v:version >= 703
    set cryptmethod=blowfish
  else
    set cryptmethod=zip
  endif
endif

blowfish2blowfish が利用可能かどうかはそれぞれ has('crypt-blowfish2')has('crypt-blowfish') で確認することもできるのですが,これらの条件が利用できるようになったのは Vim7.4.1009 以降でおり,blowfish2 が利用可能になったバージョンよりも後です. したがって,Vimのバージョンによって分岐する方がより古いVimに対応しているといえるでしょう.

暗号化を行う

さて,実際に暗号化を行ってみましょう.

コマンド経由

現在のファイルを暗号化したい場合,ファイル保存前に :X コマンドを実行し,暗号化キーを指定してください. よくあるパスワード入力のように,確認のため2回同じキーを入力する必要があります.

f:id:koturn:20161214012209g:plain

オプション経由

オプション key の値に暗号化に用いるキーを設定し,その後にファイルを保存することでも暗号化できます. ただし, .vimrc に記述すると,暗号化キーが筒抜けなので,通常は記述するべきではないでしょう. (.vimrcに記述した場合は,何もしなくても常に暗号化ができるというメリットはあります) 利用する場合は,保存前に :set key=hogehoge といった感じで,手動でオプションに値を設定しましょう.

オプション key は扱いがやや特殊であり, set keyecho &key としても,設定値を確認することはできません. また,ヒストリにも set key= までしか残らず,暗号化キーが分からないように細工されています.

key オプションに値を設定する場合は,暗号化キーの入力が一度で済みますが,その分typoに気付かなかった場合,ファイルの復号化が難しくなるでしょう. 僕としては, :X コマンドを利用して暗号化キーを設定するとよいと思います.

暗号化を解除する

一度暗号化したファイルは,再度オープンし,保存し直しても,暗号化されたままです. 暗号化を解除したくなった場合は,空のキーを設定し直すとよいです.

:X コマンドを用いる場合は,キーを何も入力せずに <CR> だけを2回,key オプションを利用する場合は, set key= としましょう.

印刷機能

実はVimには印刷機能が備わっています. 印刷は簡単で, :hardcopy コマンドを実行するだけです.

印刷設定

印刷設定に関するオプションは7種類あり,以下の通りです.

オプション 機能
printdevice :hardcopy! のようにbang付きで実行されたときのプリンタを指定
printencoding 印刷に用いるエンコーディングを設定
pritfont Ascii文字の印刷に用いるフォントを設定
printheader 印刷のヘッダを設定. statusline と同じ書式で指定する
printmbcharset マルチバイトの文字セットを指定
printmbfont マルチバイトの印刷に用いるフォントを設定
printoptions 余白,行番号の有無,折り返しの有無等を設定

上記7つの内,基本的に設定しておくべきなのは以下の3つでしょう.

  1. printfont
  2. printmbfont
  3. printoptions

あとは,自動設定に任せる or 用いない等で設定しなくても大丈夫でしょう.

僕はWindowsユーザなのですが,以下のように設定しています.

set printoptions=number:y,header:0,syntax:y,left:5pt,right:5pt,top:10pt,bottom:10pt
set printfont=Consolas:h8
set printmbfont=r:MS_Gothic:h8,a:yes

標準では行番号の印刷がoffになっているので, number:y を入れておくとよいでしょう. また,僕はヘッダ行を必要としないため header:0 を付与しています.

上記の設定にはありませんが,縦向きor横向き,印刷する用紙の大きさ等を設定することもできます.

印刷設定

印刷には,設定中のカラースキームが一部反映されます. そのため,実際に印刷してみると,悲惨な結果になっていることがあります.

f:id:koturn:20161214012216p:plain

f:id:koturn:20161214012223p:plain

仮想プリンタ等を導入し,実際に出力してみて,どうなっているかを確認してから,紙に出力するとよいでしょう.

まとめ

この記事ではVimの暗号化機能と印刷機能について紹介しました. 暗号化機能の利用シーンとしては,ギョームでちょっと秘密にしておくべきファイルを扱うとき,などが考えられるでしょうか. 印刷機能は何かの用事があってコードを印刷したいときに利用できると思います.

なお,neovimでは暗号化機能は削除されているため,利用することはできません. この点には気を付けましょう.