👻

【Vim】いろいろなエラーに対処できるように①

に公開

はじめに

最近Vimを触れる機会が増え、慣れていないこともあり様々な「壁」に当たっています。HJKLを使用した操作や、ノーマルモードのコマンドなど慣れないことばかりですが、今個人的に一番当たりたくない壁があります。それは 「直し方が分からないエラー」 です!

エラーの直し方が分からず、困った経験を何度もしました。
今回は、各エラーに対する対処方法についてまとめてみようと思います!

E37: No write since last change


このエラーは英語が苦手な方でも多少理解できる内容ではないでしょうか。
恐らく遭遇率が一番高いエラーです。

「保存していない変更があるけど、いいの?」 って聞かれています。

これはファイルに何か変更を加えた状態で、以下のような操作をしようとしたときに出るエラーです。ユーザーが意図せず変更内容を失ってしまうことを防ぐために、このメッセージを表示しているようです。優しいですね。

  • :wq 現在のファイルの変更を保存し、Vimを終了する
  • :q! 変更を保存せずにVimを終了する
  • :e! 現在のファイルの変更を破棄して元に戻す

などで対処してあげましょう。ちなみに、:lsというコマンドで、編集中のファイル一覧(バッファリスト)を表示することができます。

この機能は最近まで知りませんでした。便利ですね。

E45: 'readonly' option is set


このエラーは、読み取り専用ファイル、または書き込み権限がないファイルを編集しようとしたときに出るエラーです。

大半の方は、
Vimでread-onlyのファイルを開いた際、上のような画像のエラーが出ていることを確認するため、出会いそうで出会わないエラーですね。

  • :w! 現在のファイルの変更を強制上書きする。
  • :w <新しいファイルパス> 新しいファイルを作成し、現在の内容をそのファイルへ保存する。
  • :q! 変更を保存せずにVimを終了する

などで対処してあげましょう。特に真ん中の:w /home/user/test.txtはかなり便利だと思います。実践してみてください。

E212: Can't open file for writing


これもE45: 'readonly' option is setと同じような原因で発生するエラーになります。「ファイルが置かれているディレクトリへの書き込み権限がない」 ということですね。

  • :w <新しいファイルパス> 新しいファイルを作成し、現在の内容をそのファイルへ保存する。
  • :q! で一度終了し、chmodを使用して権限変更を行う。
  • :w !sudo tee % Vimを離れることなく、rootでファイルを強制的に上書き保存する

などで対処してあげましょう。最後の:w !sudo tee %に関して、コマンドがどのように動いているのか詳しく解説します。

teeコマンド

tee は、標準入力から受け取ったデータを、コマンドの結果を標準出力と指定されたファイルへの書き出しを同時に行うコマンドです。

これで、保護されたファイルにも内容を書き込むことができます。
そのあとについている % について、これはVimにおける「現在編集中のファイル名」を表す特殊なショートカットです。これを使うことで、長いパスをわざわざ入力する必要がなくなります。Vimが自動的に%を現在のファイル名に置き換え、コマンドを実行してくれます。

たとえば、tee test.txtというコマンドを打ち出力した場合...

入力した内容が標準出力されて、test.txtにも出力されています。これがteeコマンドです。

E492: Not an editor command


存在しないコマンドを打ってしまっていますね。実行したコマンドが正しいか見直しましょう。

最後に

今回は、遭遇しやすいエラーを4つ紹介しました。もう遭遇しないように気を付けます!

Discussion