2025/04/16 14:53 Show HN: Building Vim as an Portable Executable

ロボ子、今日はVimをAPE形式にするという面白い話があるのじゃ。

APE形式ですか?初めて聞きました。一体何ができるんですか?

APE、つまりActually Portable Executableは、一つの実行ファイルが色々なOSで動くようにする魔法みたいなものなのじゃ!

それはすごいですね!Windows、macOS、Linux全部で動くVimが作れるんですか?

そう!そのためにCosmopolitan toolchainというのを使うのじゃ。`cosmocc`コマンドでx86とARMのコードを生成して、`apelink`で合体させるらしいぞ。

`cosmocc`ですか。初めて聞くコマンドです。Vimをビルドする上で、何か特別な注意点はありますか?

Vimは普通にビルドするだけじゃダメなのじゃ。CosmopolitanはOSのライブラリと互換性がないから、ncursesみたいな依存ライブラリもソースからビルドする必要があるらしいぞ。

なるほど。依存ライブラリも自前で用意する必要があるんですね。あと、`strip`コマンドを無効化する必要があるとのことですが、それはなぜですか?

`strip`は、実行ファイルからデバッグ情報を削除するコマンドじゃ。APE形式では、それが邪魔になるのかもしれないのじゃ。

Vimの設定をポータブルにするために、ランタイムファイルや`.vimrc`もAPEファイルに含めるんですね。どのように実現するんですか?

APEバイナリはzipファイルとしても機能するから、そこにランタイムファイルとかを詰め込むのじゃ!そして、$VIM変数が`/zip/share/vim`を指すようにバイナリエディタで修正するらしいぞ。

なるほど、zipファイルとして扱えるのは便利ですね。Windowsで`:term`コマンドがエラーを吐く問題があるとのことですが、どのように解決するんですか?

それはデフォルトシェルを`conhost.exe`に設定すれば良いのじゃ。あと、フィルタ機能でFileNotFoundエラーが出る場合は、`cmd.exe`の引数を`/c`から`-c`に変更する必要があるらしいぞ。

細かい調整が必要なんですね。一時ファイルパスの生成方法も、Cosmopolitanの`__get_tmpdir()`を使うように変更するとのことですが、なぜですか?

Cosmopolitanの`__get_tmpdir()`は、色々なOSで動くように一時ディレクトリを生成する関数なのじゃ。それをWindows形式に変換する必要があるらしいぞ。

互換性を保つためには、色々な工夫が必要なんですね。公式Vimリポジトリをフォークして変更を追跡しているとのことですが、どのブランチにありますか?

`vimape_master`ブランチに変更があるらしいぞ。オリジナルのソースコードを使いたい場合は、`master`ブランチを使うと良いのじゃ。

よくわかりました。VimをAPE形式にするのは大変そうですが、色々なOSで設定を共有できるのは魅力的ですね。

そうじゃな!これでどこでもVimが使えるぞ!…って、ロボ子、もしかしてVimの設定、全部デフォルトのままだったりするのじゃ?

えへへ…、まだそこまで手が回っていなくて…。

まあ、ロボットだから仕方ないか!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。