3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Neovimのapt版とAppImage版で迷走したので、もう一度入れ直して理解してみた

3
Posted at

こんにちは、たかやまです。

普段はVSCodeを使っているプログラミング初学者ですが、周りでVimを使っている方を見て「自分も使ってみたい!」と思い、Neovimを導入しました。

その後、同じスクールの受講生が使っていたLazyVimの画面を見て「こっちにしたい!」と思い、教えてもらいながら導入しました。

なんとか起動できたものの、後から振り返ると、

「あれ、結局Neovimってどうやって入れたんだ?」

という状態に(笑)

調べてみると、apt版やAppImage版などが混在していて、自分が何をしていたのかよく分かっていませんでした。

そこで今回は、ChatGPTに伴走してもらいながら、Neovimを一度入れ直し、apt版とAppImage版の違いや、nvimコマンドがどのNeovimを実行しているのかを確認していきます。

同じように迷子になった方の参考になれば幸いです。

環境

  • Windows 11 Pro
  • WSL(Ubuntu 24.04)

NeovimとLazyVimはすでに導入済みで、LazyVimも起動できる状態です。

ただし、導入時は教えてもらったコマンドを十分理解しないまま実行していたため、今回はこの状態からNeovimを入れ直して確認していきます。

※LazyVimを本格的に使う前にこの実験を始めたので、現時点での使用感はまだ分かりません(笑)

【実験スタート】

まず、今使われているNeovimがどこにあるのか確認をしました。

最初に、現在のNeovimがどこにあり、どのバージョンが使われているのかを確認しました。

# nvimがどこから実行されているのか、候補をすべて表示
$ type -a nvim

nvim is /usr/local/bin/nvim

# コマンドの実行ファイルがどこにあるのか確認
$ which nvim

/usr/local/bin/nvim

# Neovimのバージョンを先頭1行だけ表示
$ nvim --version | head -1

NVIM v0.13.0-dev-1630+g6d15a3c5b4

# apt(dpkg)で管理されているNeovimがあるか確認
$ dpkg -l | grep neovim

# 何も表示されない

nvimは/usr/local/bin/nvimにあり、aptで管理されているNeovimは現在入っていないことが分かりました。

右往左往していたときにはapt版のNeovimも入れていましたが、この時点ではすでに削除済みだったようです。(消した覚えはあります)

次に、~/.config/nvim も確認します。
※~ は、自分のホームディレクトリ

# ディレクトリ内のファイル・ディレクトリを詳細表示(隠しファイルも含め)
$ ls -la ~/.config/nvim

# 結果: ここにLazyVimの設定が入っていると考えられる状態
init.lua
lazy-lock.json
lazyvim.json
lua/
README.md
...

ここで分かったのが、Neovim本体とLazyVimの設定は別の場所にあるということでした。

/
├── home/
│   └── tomat/              ← 私のホームディレクトリ(なぜかtomatなのかは不明)
│       └── .config/
│           └── nvim/       ← LazyVimの設定
│
└── usr/
    └── local/
        └── bin/
            └── nvim        ← Neovim本体

私はなんとなく 「Neovim = LazyVim」 のように感じていたのですが、実際には別物でした。

【Neovim本体】
/usr/local/bin/nvim
        ↓
     実行する
        ↓
【設定】
/home/tomat/.config/nvim
        ↓
     LazyVim

つまり、Neovimというエディタ本体があり、そのNeovimをどういう構成で使うかをLazyVim側で設定している、というイメージです。

今回はLazyVimの設定はそのまま残し、Neovim本体だけを入れ替えて、同じLazyVimを動かしてみることにします。

apt版とAppImage版の違いも整理しておきます。

apt版 AppImage版
入れ方 apt install AppImageファイルを配置
管理 aptが管理 自分で管理
バージョン Ubuntu側の提供状況に左右される 新しいものを入れやすい

Neovim本体だけを削除する

まず、/usr/local/bin/nvimにNeovim本体が存在することを確認してから削除します。

$ ls -l /usr/local/bin/nvim

-rwxr-xr-x 1 tomat tomat 20478456 Sep 13 21:09 /usr/local/bin/nvim

# Neovimを削除
$ sudo rm /usr/local/bin/nvim

# 念のためnvimがなくなったか確認
$ ls -l /usr/local/bin/nvim

ls: cannot access '/usr/local/bin/nvim': No such file or directory

sudo を付けるのは、/usr/local/bin がシステム側のディレクトリなので、通常のユーザー権限では変更できない場合があるためです。

apt版のNeovimを入れてみる

まず、aptが参照するパッケージ情報を更新します。

$ sudo apt update

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
28 packages can be upgraded.

続いて、apt版のNeovimをインストールします。

$ sudo apt install -y neovim

# ログは長いので省略
Setting up neovim (0.9.5-6ubuntu2) ...

インストールされたNeovimを確認してみます。

$ nvim --version | head -1

NVIM v0.9.5

$ which nvim

/usr/bin/nvim

今回aptからインストールされたNeovimは v0.9.5 で、場所は/usr/bin/nvimでした。

最初に確認したNeovimは/usr/local/bin/nvimにあったので、先ほど削除したものはapt版ではなかったことも分かります。

ここで、/usr/binと/usr/local/binの違いも整理できました。

場所 今回の意味
/usr/bin aptなど、OSのパッケージ管理で入ったプログラムが置かれる場所
/usr/local/bin ユーザーが手動でインストールしたプログラムなどを置く場所

今の理解を図にすると、こんな感じです。

/
├── usr/
│   ├── bin/
│   │   └── nvim        ← apt版がいるところ
│   │
│   └── local/
│       └── bin/        
│           └── nvim    ← AppImage版を置いていた場所
│
└── home/
    └── tomat/
        └── .config/
            └── nvim/  ← LazyVimの設定

apt版のNeovimでLazyVimを起動してみる

ここで、apt版のNeovimを起動してみます。

image.png

エラー発生
image1.png

はい、出ました!!

これが迷子の始まりだったのを覚えています(笑)

表示されたエラーを確認すると、LazyVimを起動するには必要なNeovimのバージョンを満たす必要がありました。

しかし、今回aptからインストールされたNeovimはv0.9.5。

つまり、今回aptから入ったNeovimではLazyVimを起動するために必要なバージョンを満たしていなかったということでした。

先日はapt版とAppImage版があることを理解していなかったので、apt版を残したままAppImage版もインストールしていました。

その結果、Neovimが複数存在し、

「nvimと入力したとき、結局どのNeovimが動いているの?」

という状態になってしまったわけです。

apt版を削除してAppImage版を入れてみる

まず、現在のNeovimを確認します。

$ type -a nvim

nvim is /usr/bin/nvim
nvim is /bin/nvim

「2つある?」と思いましたが、/binを確認してみると、

$ ls -ld /bin

lrwxrwxrwx 1 root root 7 Apr 22  2024 /bin -> usr/bin

/bin自体が/usr/binへのシンボリックリンクになっていました。
そのため、Neovim本体が2つ存在しているわけではありません。

では、apt版を削除します。

aptで入れたものなので、削除するときもaptを使います。

$ sudo apt remove -y neovim

# 実際に削除されたのはneovimパッケージ。関連パッケージの一部はまだ残っている
The following packages were automatically installed and are no longer required:
...
neovim-runtime
...
Use 'sudo apt autoremove' to remove them.

The following packages will be REMOVED:
  neovim

関連する不要なパッケージも削除します。

$ sudo apt autoremove -y

# ログは省略。18個の不要なパッケージを削除
The following packages will be REMOVED:
...
neovim-runtime
...
0 upgraded, 0 newly installed, 18 to remove

Neovimが見つからなくなったことも確認できました。

$ type -a nvim

-bash: type: nvim: not found

これで一旦、WSL側で実行できるNeovimがない状態になりました。

改めてAppImage版を入れてみる

前回はスクールの受講生や卒業生にAppImageの場所を教えてもらいましたが、今回は自分で公式サイトから探してみます。

Neovim https://neovim.io/
※日本語変換にしてます。

image2.png

「今すぐインストール」からインストール方法を確認しました。

image3.png

先日は最初にWindows x86_64版をインストールしていました。
しかし、私がNeovimを使いたかった場所はWSL(Ubuntu)上です。

WindowsとWSLは別の実行環境なので、今回はWSL側で使うLinux版のNeovimを導入します。

image4.png

公式に記載されているコマンドでホームディレクトリにダウンロードします。

$ curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.appimage

ダウンロードされたファイルを確認します。

$ ls -lh ~/nvim-linux-x86_64.appimage

-rw-r--r-- 1 tomat tomat 11M Sep 14 18:49 /home/tomat/nvim-linux-x86_64.appimage

この時点では実行権限を表すxが付いていません。
そこで、所有者(u)に実行権限(x)を追加します。

$ chmod u+x nvim-linux-x86_64.appimage

$ ls -lh ~/nvim-linux-x86_64.appimage

-rwxr--r-- 1 tomat tomat 11M Sep 14 18:49 /home/tomat/nvim-linux-x86_64.appimage

今回初めて知ったオプションも整理しておきます。

部分 意味
curl URLからデータを取得するコマンド
-L リダイレクトされた場合、その移動先まで追いかける
-O URLと同じファイル名で保存する
URL Neovimの最新Linux x86_64 AppImage
-l 権限・所有者・サイズなどを詳しく表示
-h ファイルサイズを 11432123 のようなバイト数ではなく、11M など人間が読みやすい形で表示

AppImageを直接起動してみる

$ ./nvim-linux-x86_64.appimage

image6.png

起動しましたね!
やっとスタート地点に立てました。

しかし
$ nvim
だけでは起動しません。

ここで関係してくるのがPATHでした。

PATHって何者?

nvimのようにコマンド名だけを入力すると、BashはPATHに登録されているディレクトリを順番に探して、そのコマンドを見つけます。

PATHは、簡単に言えば 「コマンドを探す場所のリスト」 のようなものです。

今回確認したPATHには、次のような場所が含まれていました。

PATH 
├── /usr/local/bin ← 探す
├── /usr/bin       ← 探す
├── /bin           ← 探す
└── ...

/home/tomat        ← PATHに入っていなければ探さない

しかし、ダウンロードしたAppImageはこの時点では、
/home/tomat/nvim-linux-x86_64.appimage
にあります。

ホームディレクトリは今回のPATHに含まれていないため、Bashはnvimと入力しただけではこのAppImageを見つけられません。
AppImageをPATHに含まれている/usr/local/binへ移動し、ファイル名もnvimにします。

AppImageを/usr/local/bin/nvim に移動する

$ sudo mv ~/nvim-linux-x86_64.appimage /usr/local/bin/nvim

移動できたことを確認します。

$ ls -l /usr/local/bin/nvim

-rwxr--r-- 1 tomat tomat 11442680 Sep 14 18:49 /usr/local/bin/nvim

$ type -a nvim

nvim is /usr/local/bin/nvim

これで、

「nvimと入力すればAppImage版が起動する!」

……と思ったのですが。

しかし、起動しない!!

ここで、先日「なぜか時間が経ったら起動した」と思っていた謎の現象につながりました。

image9.png

type -a nvimでは /usr/local/bin/nvim が見つかっているのに、
nvimを実行すると /usr/bin/nvim を見に行ってしまいました。

「/usr/local/bin/nvimにあるって言ってるのに、なんで/usr/bin/nvimを見に行くの?」

となりました(笑)

調べてみると、Bashが以前使っていた/usr/bin/nvimの場所を記憶している可能性がありました。

Bashには hash table(ハッシュテーブル) という仕組みがあり、一度実行した外部コマンドの場所を覚えておくことがあります。

実際に確認してみます。

$ hash

hits    command
   3    /usr/bin/nvim

いました。

apt版のNeovimがあった/usr/bin/nvimを、Bashがまだ覚えています。
そのため、実際にはapt版を削除してAppImage版を/usr/local/bin/nvimに置いたにもかかわらず、Bashは古い/usr/bin/nvimを実行しようとして失敗していたようです。

そこで使うのが、これです。

$ hash -r

hash -rは、Bashが覚えているコマンドの場所をリセットします。

実行後、もう一度nvimを起動すると……

image6.png

成功しました!!

最後に、バージョンと場所を確認します。

$ nvim --version

NVIM v0.12.5
Build type: Release
LuaJIT 2.1.1774638290

$ which nvim

/usr/local/bin/nvim

無事に/usr/local/bin/nvimに置いたAppImage版が使われています。

ちなみに、最初に入っていたNeovimは0.13.0-devでしたが、今回導入したものは0.12.5でした。

最初に教えていただいて導入したものは開発版(nightly)だったため0.13.0-dev、今回は公式のlatestから取得したため安定版が入った、という違いでした。

LazyVimを使うために必要なバージョンを満たしているので、今回はこのまま安定版を使おうと思います。

まとめ

今回の迷走をまとめると、こんな流れでした。

apt版(0.9.5) /usr/bin/nvim
   ↓ 
LazyVimに必要なNeovimのバージョンを満たせない
   ↓ 
apt版を削除
   ↓ 
AppImage版(0.12.5) /usr/local/bin/nvim 
   ↓ 
Bashが古い /usr/bin/nvim を記憶していた
   ↓
hash -r
   ↓
AppImage版で起動成功!

今回、自分で入れ直してみたことで、

  • Neovim本体とLazyVimの設定は別物
  • apt版とAppImage版では管理方法や配置場所が違う
  • nvimと入力すると、BashはPATHからコマンドを探す
  • Bashが以前のコマンドの場所を記憶していることがある
  • WindowsとWSLは別の実行環境

ということが整理できました。

最初は「LazyVimを使いたい!」というところから始まっただけなのに、気づけばPATHやBashのhashまで調べることになりました(笑)

いや〜長かったです。

ここまで読んでくださり、ありがとうございました!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?