📚

homebrewでneovimを--HEADでインストールできない時

2024/10/22に公開

結論

結論だけ知りたい方用

brew install utf8proc --HEAD && brew install neovim --HEAD

あとがき

使っているプラグインなどが理由でneovimのnightlyパージョンを使いたいことはあると思います
今回自分もneovimのnightlyをつかいたい!となりました
自分はパッケージマネージャにhomebrewを使っているので

brew uninstall neovim
brew install neovim --HEAD

とした所以下のようなエラーに出会しました

Last 15 lines from /Users/a/Library/Logs/Homebrew/neovim/20.cmake:
| ~~~~ ^
/tmp/neovim-20241022-65154-c3oibl/src/nvim/mbyte.c:488:41: error: no member named 'ambiguous_width' in 'struct
utf8proc_property_struct'
488 | if (p_emoji && c >= 0x1f000 && !prop->ambiguous_width && prop_is_emojilike(prop)) {
| ~~~~ ^
/tmp/neovim-20241022-65154-c3oibl/src/nvim/mbyte.c:1352:15: error: no member named 'ambiguous_width' in 'struct
utf8proc_property_struct'
1352 | if (prop->ambiguous_width || prop_is_emojilike(prop)) {
| ~~~~ ^
3 errors generated.

🫠

エラーメッセージを読んでみる

エラーメッセージの最後にこのような記述があります

3 errors generated

どうやら3つエラーが発生したようですが,それぞれどんなエラーが発生しているのでしょうか

Last 15 lines from /Users/a/Library/Logs/Homebrew/neovim/20.cmake:
| ~~~~ ^

cmakeを実行中にエラーが発生したようです

/tmp/neovim-20241022-65154-c3oibl/src/nvim/mbyte.c:488:41: error: no member named 'ambiguous_width' in 'struct
utf8proc_property_struct'
488 | if (p_emoji && c >= 0x1f000 && !prop->ambiguous_width && prop_is_emojilike(prop)) {
| ~~~~ ^

utf8proc_property_structという構造体にambiguous_widthが定義されてないよとのこと

/tmp/neovim-20241022-65154-c3oibl/src/nvim/mbyte.c:1352:15: error: no member named 'ambiguous_width' in 'struct
utf8proc_property_struct'
1352 | if (prop->ambiguous_width || prop_is_emojilike(prop)) {
| ~~~~ ^

2番目と同じですね

上記の3つのエラーを読んでみると,どうやらneovimリポジトリのsrc/nvim/mbyte.cファイルに原因がありそうです

github上のneovimリポジトリ を覗いてみる

では,ソースコードを見てみましょう

https://github.com/neovim/neovim/blob/573bcb2aaf3e2421e0d2593b048f684ee05251a6/src/nvim/mbyte.c#L34-L36

utf8proc.hというファイルが読み込まれています
エラーの原因となっていたutf8proc_property_structはutf8procというライブラリで定義されているっぽいですね
utf8procとネットで検索してみるとgithubでソースコード
が公開されています

utf8procのリポジトリまで行くと分かるのですが,最新のコミットメッセージは以下のようになっています

properties: add "ambiguous_width" property for ambiguous East Asian Width

Some characters have their width defined as "Ambiguous" in UAX#11.
These are typically rendered as single-width by modern monospace fonts,
and utf8proc correctly returns charwidth==1 for these.

However some applications might need to support older CJK fonts where
characters which where two-byte in legacy encodings were rendered as
double-width. An example of this is the 'ambiwidth' option of vim
and neovim which supports rendering in terminals using such wideness
rules.

Add an 'ambiguous_width' property to utf8proc_property_t for such characters.

このコミットがされたのは今年の8/31でした 一方utf8proc安定版の最新リリースはちょうど一年前の昨日になっています

段々と問題の輪郭が見えてきました そもそもhomebrewは依存関係を自動で解決してくれるツールでした ユーザが何も指定しなかった場合,homebrewは安定版をインストールします
一方で,依存するパッケージに関しては,ユーザがバージョンを指定する方法は提供されていません 常に最新の安定版がインストールされます
つまり今回の場合,utf8procを事前に--HEAD指定して入れておけば問題解決となります

おわり

GitHubで編集を提案

Discussion