Vimでファイルを読み取り専用モードで開く(-R / view)
本番環境の設定ファイルを確認するだけのつもりが、うっかりキー入力してしまい変更してしまいました。閲覧だけのつもりのときは、最初から読み取り専用モードで開いておけば、誤操作による変更を未然に防げます。
目次(11項目)
起動時に読み取り専用で開く
vim -R {ファイルパス}
-RはRead Onlyの略で、これを付けて起動すると読み取り専用モードでファイルが開きます。まったく同じ結果を得られる別コマンドとしてviewもあります。
view {ファイルパス}
gVimでも同じオプションが使えます。
gvim -R {ファイルパス}
すでに開いているバッファを読み取り専用にする
:set readonly
:set ro " 省略形
普通に開いたあとでも、途中から読み取り専用に切り替えられます。逆に解除したい場合はこちらを使います。
:set noreadonly
:set noro " 省略形
読み取り専用でも強制的に保存したいとき
読み取り専用のまま変更を加えてしまった場合、通常の:wでは保存できず警告が出ます。それでも保存したい場合は!を付けて強制します。
:w!
ただし、この強制保存はファイルシステム上の書き込み権限がある場合に限られます。権限が無いファイルであれば、読み取り専用の解除や強制保存を試みても失敗します。ここまで来るとVim側の操作では解決しないので、ls -lで状態を確認したうえで、権限を確認して書き込めるようにする手順を先に踏むことになります。
既存バッファを開いたまま切り替えるコマンドとの違い
-Rオプションは起動時にだけ指定できるオプションで、すでに開いているバッファには使えません。作業の途中で急に読み取り専用にしたくなった場合は:set readonlyを使う、というように役割が分かれている点を覚えておくと迷いません。
権限が無いファイルは自動的に読み取り専用になる
書き込み権限のないファイルを開くと、Vimは自動的に読み取り専用モードで開きます。意図せずこの状態になった場合は、まずファイルの権限を確認すると安全です。
vim -Rやviewで開く習慣をつけると、誤操作による事故を防げます。既存バッファでも:set roでいつでも切り替えられます。
本番サーバーの設定ファイルを確認するだけのつもりで、うっかり1文字入力して保存しかけたことがあります。それ以来、確認だけの目的で開くときは反射的に-Rを付けるようになりました。事故が起きてから対策するより、習慣として先に予防しておくほうが安心だと痛感しました。チームメンバーにもこの癖を勧めるようになりました。
Neovimでの違い
Neovimでも-RはVimと同じように使えます。手元のNeovim 0.12.4で書き込み可能なファイルを開いて確かめると、nvim -Rではreadonlyが1、オプション無しでは0になりました。
nvim -R file.txt " readonly が 1 になる
nvim file.txt " readonly は 0
違うのはviewコマンドのほうです。Vimはviewという名前の実行ファイルを用意していますが、Neovimは用意していません。パッケージによってはviewが旧来のVimを指したままのことがあるので、Neovimで同じことをしたいならalias view='nvim -R'のように自分で作るか、素直にnvim -Rと打つほうが確実です。
読み取り専用と「変更できない」は別物
readonly は保存しようとしたときに止めるだけで、バッファの編集そのものは止めません。うっかりキーを打てば中身は変わり、警告が出るのは :w を打った時点です。
編集自体をさせたくないなら modifiable を切ります。こちらを切ると、キーを打った瞬間に E21 が出て中身が変わりません。
:setlocal nomodifiable " 編集そのものを禁止する
:setlocal modifiable " 解除する
2つを組み合わせれば、打っても変わらず保存もできない、という状態になります。本番の設定ファイルを見るだけの用途なら、こちらまで切っておくほうが確実です。
ページャーとして使う
読むだけなら、ファイルを開くのではなくパイプで流し込む使い方もできます。less の代わりにVimを使う形で、検索や折りたたみがそのまま利く分だけ読みやすくなります。
git log | vim -R -
tail -100 app.log | nvim -R -
末尾の - が標準入力から読むという指定です。保存先のファイルが無い状態なので、そのままでは保存できません。読み終わったら :q! で抜けます。
開いたあと勝手に書き換わらないようにする
読むだけのつもりでも、プラグインが保存時の整形を仕込んでいると、何かの拍子に書き換わることがあります。心配なら、そのバッファだけ自動コマンドの対象から外すという手もあります。
もっと単純なのは、開く前にコピーを取ることです。cp で複製してからそちらを開けば、何をしても元のファイルには届きません。本番環境で確認だけしたい場面では、この物理的な分離がいちばん確実です。ファイルが別プロセスに書き換えられたときの読み直しは再読み込みの記事で扱っています。
まとめ
読み取り専用モードは、誤操作から重要なファイルを守るための簡単で効果的な習慣です。確認だけの作業では積極的に使うとよいでしょう。中身を数えたり確認したりするだけならカーソル位置と文字数の確認と組み合わせると、壊す心配なく作業できます。編集する気が無いファイルを開くときの既定の入り口として使えます。開いている間に別のプロセスがファイルを書き換えた場合の読み直しはファイルの再読み込みで扱っています。