viコマンドでファイルを開き直したらカーソルが先頭まで戻っている...?


はじめに

4月から新卒2年目社員となりました。yagaodekawasuです。
普段はVS Codeでファイル編集をしているんですが、最近rootにしかwrite権限がないファイルを編集することが増え、viコマンドをよく使うようになりました。
そんな中、ある環境で任意のファイルをviコマンドで開いて編集し、一度閉じてまた開くとカーソルがファイル先頭まで戻ってしまい、その度ごとにワード検索なり行数指定で元の場所に移動することを強いられたので、「あれviってこんな不便だったっけ?」と思って少し調べてみました。
私のようなエンジニア歴が浅い人を読者として想定しているので、「何を今更当たり前のことを」となる可能性が高いです。予めご了承下さいm(_ _)m

vimrcを見てみる

以前viコマンドで編集した時はファイルポジションが保持されていたという記憶があったので、恐らく設定ファイルの項目が関係しているんだろうと思ってvimrcを見てみました。(現場で使っているのはRHEL7ですが、GWでアクセスできないので自宅のUbuntu18(WSL2)に入っているものを見ています)
コメント部分を除外すると↓こうなってました。

vimrc
runtime! debian.vim

if has("syntax")
  syntax on
endif

if filereadable("/etc/vim/vimrc.local")
  source /etc/vim/vimrc.local
endif

やけにさっぱりしていますね。
runtime!が指定した設定ファイルを読み込む処理だということなので、今度はdebian.vimを見てみると、以下の記述が。

debian.vim
(前略)

" Normally we use vim-extensions. If you want true vi-compatibility
" remove change the following statements
set nocompatible        " Use Vim defaults instead of 100% vi compatibility

(後略)

「100%vi互換ではなくVimデフォルト(の機能)を使う」...?「互換性」...?🤔

viとVimは違う(!)

これ、すっかり盲点でした。

vi(ヴィーアイ)は、Emacsと共にUNIX環境で人気があるテキストエディタ。ビル・ジョイによって開発された。名の由来はVIsual editorないしVisual Interfaceとされる

vi - Wikipedia

Vimはオランダ人のプログラマーBram MoolenaarによってAmiga向けに開発された。のちにWindowsを含むさまざまな環境に移植され、特にUnix系オペレーティングシステム (OS) ではEmacsと並んで広く使用されているテキストエディタとなっている。
Vimという名称は、オリジナルのviエディタに近づくことを目標として、開発当初Vi IMitation(viの模倣)の略とされていた。しかし、やがてviを超えることを目指してVi IMproved(viの改良)とされるようになり、今日ではオリジナルのviを大きく上回る機能を持つに至っている。

Vim - Wikipedia

Vimはviを元に、更に使いやすくしたエディタということなんですね。
ということは、私が現場でviコマンドを叩いた時に起動していたのはVimではなくオリジナルのviだった...?

CentOS7で検証してみる

ということで、DockerでCentOS7のコンテナを立てて検証してみます。
参考:【初心者向け】DockerでCentOS7の環境を構築しよう! | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト

$ docker pull centos:centos7
$ docker run -it -d --name mycentos centos:centos7
$ docker exec -it mycentos /bin/bash
# cd ~
# vim anaconda-ks.cfg
bash: vim: command not found

Vimはインストールされていません。viでファイルを開き、カーソルの位置を動かしてみます。

そして一度閉じて再び開くと、

カーソルが先頭に戻っています。では、Vimをインストールして同じことをしてみます。

# yum -y install vim
# vim anaconda-ks.cfg


シンタクスハイライトが適用され、ファイルポジションが保持されるようになりました。

まとめ

viとVimは「同じもの(ただのエイリアス)」だと思ってると痛い目に遭う(ことが稀にある)よ!!

...vi / Vim(エディタ)とvi(コマンド)があるんだなということを頭の片隅に置いておくと、何かあった時役に立つかもしれません。

補足:そもそもUbuntuだと起こり得ない現象らしい。

上で検証したことをUbuntu 18.04でもやってみようと思ってコンテナを立ててみたんですが、初期状態ではviすら入っておらず、

# apt install vi
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vi

という状態。どうもUbuntu用のパッケージリポジトリには現在オリジナルのviエディタが収録されていないらしいです。
参考:software installation - How to install vi? - Ask Ubuntu

Vimをインストールすると、

# ls -l /usr/bin/vi
lrwxrwxrwx 1 root root 20 May  1 05:27 /usr/bin/vi -> /etc/alternatives/vi
# ls -l /etc/alternatives/vi
lrwxrwxrwx 1 root root 18 May  1 05:27 /etc/alternatives/vi -> /usr/bin/vim.basic

と自動的にviコマンドからVimが起動されるようにシンボリックリンクが張られるようになっています。
初心者にはありがたいかもしれないですね。