有馬総一郎のブログ

(彼氏の事情)

2023年06月10日 17:09:36 JST - 7 minute read - Comments - Linux

FlatpakでインストールしたNeovimをコマンドでも便利に使おうと試みる(update-alternativesに登録したり、PATH通したり…

最新のnvimが使いたければflatpakでインストールするのが簡単である。flatpak install flathub io.neovim.nvimとすればディストリビューション問わず最新のnvimがここに!


追記 2023-06-14
以下のパスはユーザflatpak install --userでインストールした場合となる。設定ファイルのパスは変らないが--userを付けずシステムでインストールした場合、バイナリーのパスはシステムだと/var/lib/flatpak/exports/となるのに対して、ユーザでは~/.local/share/flatpak/exports/となる。

追記ここまで


追記 2023-06-12

やるべきコマンドまとめ

$ ln -v -s /home/$USER/.config/nvim /home/$USER/.var/app/io.neovim.nvim/config/
$ mkdir  ~/.var/app/io.neovim.nvim/data/nvim/site/
$ ln -s /home/$USER/git/dotfiles/.vim/autoload /home/$USER/.var/app/io.neovim.nvim/data/nvim/site/autoload
$ mkdir -p $HOME/.local/share/flatpak/app/io.neovim.nvim/x86_64/stable/active/files/tools
$ ln -v -s /home/$USER/.deno /home/$USER/.local/share/flatpak/app/io.neovim.nvim/current/active/files/tools/deno
$ ln -v -s /home/$USER/.local /home/$USER/.local/share/flatpak/app/io.neovim.nvim/current/active/files/tools/local
$ sudo update-alternatives --install /usr/bin/editor editor /home/$USER/.local/share/flatpak/exports/bin/io.neovim.nvim 50

~/.local/share/flatpak/exports/share/applications/io.neovim.nvim.desktop

- Exec=/usr/bin/flatpak run --branch=stable --arch=x86_64 --command=nvim-wrapper io.neovim.nvim
- Terminal=true
+ Exec=kitty -e /usr/bin/flatpak run --branch=stable --arch=x86_64 --command=nvim-wrapper io.neovim.nvim %F
+ Terminal=false

追記ここまで


設定ファイル(init.vim)を読み込ませる

ではあるのだが、GUI上はともかく、CLI上で使うとなるとそのままでは色々不便である。まず、そのままでは~/.config/nvim/init.vimなど読み込んでくれない。

Config file isn’t read from the XDG_CONFIG_HOME · Issue #2 · flathub/io.neovim.nvim · GitHub

ln -v -s /home/$USER/.config/nvim /home/$USER/.var/app/io.neovim.nvim/config/とシンボリックリンクを貼る。

autoloadディレクトリ作成

plung.vimなどはどこに?/home/arimasou16/.var/app/io.neovim.nvim/data/nvim/site/autoloadに置くらしい。

$ mkdir  ~/.var/app/io.neovim.nvim/data/nvim/site/
$ ln -s /home/$USER/git/dotfiles/.vim/autoload /home/$USER/.var/app/io.neovim.nvim/data/nvim/site/autoload

デスクトップファイルを修正する

ランチャー起動でnvimと打つと起動するけど、ベースとなるターミナルがgnome-terminalなので、経由ターミナルを変更する。

~/.local/share/flatpak/exports/share/applications/io.neovim.nvim.desktop

- Exec=/usr/bin/flatpak run --branch=stable --arch=x86_64 --command=nvim-wrapper io.neovim.nvim
- Terminal=true
+ Exec=kitty -e /usr/bin/flatpak run --branch=stable --arch=x86_64 --command=nvim-wrapper io.neovim.nvim %F
+ Terminal=false

CLIの標準エディター(EDITOR)として登録したい

当然ながらsudo update-alternatives --install /usr/bin/editor editor "/usr/bin/flatpak run io.neovim.nvim" 50なんてやり方では登録できないのでaliasか、ラッパークラスを作成するしかない。

update-alternatives: エラー: alternative path /usr/bin/flatpak run io.neovim.nvim doesn't exist

Adding Flatpak program to Debian alternatives - Super User

~/.local/share/flatpak/exports/bin/io.neovim.nvim1にラッパーファイルがあるのでそれを登録すれば良い。

sudo update-alternatives --install /usr/bin/editor editor /home/$USER/.local/share/flatpak/app/io.neovim.nvim/current/active/export/bin/io.neovim.nvim 50

io.neovim.nvim

#!/bin/sh
exec /usr/bin/flatpak run --branch=stable --arch=x86_64 io.neovim.nvim "$@"

nvimとして使いたい

alias nvim="flatpak run io.neovim.nvim"として別名登録してみたが、これだと補完が効かないので、 io.neovim.nvim と全く同じラッパーファイルを nvim としてパスの通ってるディレクトリ配下に作成した。

$ touch ~/.local/bin/nvim
$ chmod 775 ~/.local/bin/nvim

~/.local/bin/nvim

#!/bin/sh
exec /usr/bin/flatpak run --branch=stable --arch=x86_64 io.neovim.nvim "$@"

いや、中身一緒ならln -s -v /home/$USER/.local/share/flatpak/app/io.neovim.nvim/current/active/export/bin/io.neovim.nvim /home/$USER/.local/bin/nvimとシンボリックリンク貼る方が良いか。chmodの手間もない。

flatpak runで叩いてる実物(command)を調べる

しかし、これでもまた不完全で、flatpak経由では、PATHがクリーン?されているようで、denoやら、他のツール(パッケージ)を使えるようにしたい。

flatpak: $PATH environment variable overriden · Issue #137 · daa84/neovim-gtk · GitHubにあるようにflatpak run --env=PATH="$HOME/.deno/bin:$PATH" io.neovim.nvimとやるも駄目。

$ flatpak run --env=PATH="$HOME/.deno/bin:$PATH" io.neovim.nvim 
bwrap: execvp nvim-wrapper: No such file or directory

でもって、flatpak run io.neovim.nvimで、何を叩いてるのか調べる。flatpak infoを使うとflatpak情報が調べられる。

$ flatpak info --show-metadata io.neovim.nvim
[Application]
name=io.neovim.nvim
runtime=org.freedesktop.Sdk/x86_64/22.08
sdk=org.freedesktop.Sdk/x86_64/22.08
command=nvim-wrapper

[Context]
shared=network;ipc;
sockets=x11;wayland;fallback-x11;
filesystems=/var/tmp;/tmp;host;

[Extension io.neovim.nvim.tool]
directory=tools
no-autodownload=true
subdirectories=true
add-ld-path=lib

[Extension io.neovim.nvim.Locale]
directory=share/runtime/locale
autodelete=true
locale-subset=true

[Extension io.neovim.nvim.Debug]
directory=lib/debug
autodelete=true
no-autodownload=true

[Build]
built-extensions=io.neovim.nvim.Locale;io.neovim.nvim.Debug;io.neovim.nvim.Sources;

長いが必要なのはcommandだけなのでflatpak info --show-metadata io.neovim.nvim | grep commandとグレップする。

command=nvim-wrapper

flatpak上でしばしば/app/bin/hogehogeと見かけることがある。/appは大体~/.local/share/flatpak/app/io.neovim.nvim/x86_64/stable/active/filesなのでnvim-wrapperは、~/.local/share/flatpak/app/io.neovim.nvim/x86_64/stable/active/files/bin/nvim-wrapperにある。

サンドボックス化されたPATHに他のツールを通す

試しに直で~/.local/share/flatpak/app/io.neovim.nvim/x86_64/stable/active/files/bin/nvim-wrapper叩くと

./.local/share/flatpak/app/io.neovim.nvim/x86_64/stable/active/files/bin/nvim-wrapper: 行 99: /npmrc: 許可がありません

とそれまで出なかったエラーも出て、更にPATHが通ってない状態になる。

nvim-wrapper の中身を見る。

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
declare -A PATH_SUBDIRS
PATH_SUBDIRS[PATH]="bin"
PATH_SUBDIRS[PYTHONPATH]="lib/python3.10/site-packages"
PATH_SUBDIRS[PKG_CONFIG_PATH]="lib/pkgconfig"
PATH_SUBDIRS[GI_TYPELIB_PATH]="lib/girepository-1.0"

function export_path_vars() {
  base_dir="$1"
  for var_name in "${!PATH_SUBDIRS[@]}"; do
    abs_dir="$base_dir/${PATH_SUBDIRS[$var_name]}"
    if [ -d "$abs_dir" ]; then
      msg "Adding $abs_dir to $var_name"
      if [ -z "${!var_name}" ]; then
        export "$var_name"="$abs_dir"
      else
        export "$var_name"="${!var_name}:$abs_dir"
      fi
    fi
  done
}

for tool_dir in /app/tools/*; do
  export_path_vars "$tool_dir"
done

どうやら、 GitHub - flathub/ide-flatpak-wrapper: Wrapper for setting up development environment in flatpak sandbox というflatpak開発の為にIDEなど他のツールが必要とするアプリで環境設定を上手くセットしてくれるラッパーが組込まれているっぽい。

/app/tools/配下に上手くシンボリックリンクを貼れば上手くやれそう。

$ mkdir -p $HOME/.local/share/flatpak/app/io.neovim.nvim/x86_64/stable/active/files/tools
$ ln -v -s /home/$USER/.deno /home/$USER/.local/share/flatpak/app/io.neovim.nvim/current/active/files/tools/deno
$ ln -v -s /home/$USER/.local /home/$USER/.local/share/flatpak/app/io.neovim.nvim/current/active/files/tools/local

で、flatpak run --env=FLATPAK_IDE_LOGLEVEL=1 io.neovim.nvimとして、ログを有効にして起動。

nvim-wrapper-wrapper: Adding /app/tools/deno/bin to PATH
nvim-wrapper-wrapper: Adding /app/tools/local/lib/python3.10/site-packages to PYTHONPATH
nvim-wrapper-wrapper: Adding /app/tools/local/bin to PATH
nvim-wrapper-wrapper: Setting up NPM packages
nvim-wrapper-wrapper: Setting up Cargo packages
nvim-wrapper-wrapper: Setting up Python packages
nvim-wrapper-wrapper: Setting up Ruby packages

app/tools/deno/binapp/tools/local/binのPATHが通ってdenoが必要なプラグインとか動くようになった!

残りの課題

大分良い感じになって、殆どaptなどでパッケージをインストールした時と同じような感じになったのだけど…

flatpakのサンドボックス化された箇所を開こうとすると、当然というか読めない。例えば、~/.local/share/flatpak/exports/share/applications/io.neovim.nvim.desktopといったデスクトップファイルや~/.local/share/flatpak/app/io.neovim.nvim/current/active/export/bin/io.neovim.nvimといったラッパーファイルなどである。

それから、自作ファンクションで!firefox URLみたいにブラウザを起動させようとしたら、firefoxPATHが通ってなかった。

ln -v -s /usr /home/arimasou16/.local/share/flatpak/app/io.neovim.nvim/current/active/files/tools/usrサンドボックスの意味とは?なんて言われそうなことしてみたけど、駄目だった…(後で勿論消した)

:!firefox
/app/tools/local/bin/firefox: 行 2: /usr/bin/firefox: そのようなファイルやディレクトリはありません

となってしまうんだな…/usr/bin/配下のツールはどうしたらいいんだろうか…これをラッパーしても結果は同じ。

ripgrepも動かない…まあ実行ファイル落してきてユーザ(HOME配下の実行ファイル)として、置いちゃえ2Releases · BurntSushi/ripgrep · GitHubから ripgrep-13.0.0-x86_64-unknown-linux-musl.tar.gz ダウンロードして~/.local/bin/配下に置いたら動いたので良し!/usr/bin/rgapt removeした。

まあ、ブラウザは iamcco/markdown-preview.nvim<Plug>(openbrowser-smart-search)3では開けるので、 tyru/open-browser.vimプラグイン導入しての:OpenBrowser URLな書き方で対応した。

他にも色々ありそうだけど、とりあえず本物?本家と同じように動くようにはなった。まあ Releases · neovim/neovimからTarball落としてPATH通す方が全然楽だと思う。


  1. ~/.local/share/flatpak/app/io.neovim.nvim/current/active/export/bin/io.neovim.nvimのシンボリックリンク。 ↩︎

  2. firefoxXPCOMGlueLoad error for file /home/arimasou16/.local/firefox/libxul.soなエラーが出て単純にHOME配下に置いただけは駄目だった。 ↩︎

  3. call rpcnotify経由?ってこと。よく仕組みが分かってない。 ↩︎