概要
ランチャーソフトのCraftLaunchから起動したアプリと、Win+Rで起動したアプリではPATH設定が異なっているため、動かないものがありました。それを(泥臭く)解決する方法です。
追記:
ここに書いてある方法は不要で、CraftLaunchを再起動をするだけで治りました。CraftLaunchを起動してからPATHが変わったとしても、変更後のPATHを使うわけじゃなくて、起動時点のPATHを使います。あとから入れたnodejsとか見つからないのは当たり前なんですよね、、、初歩的なことでした。
まとめと解決策
CraftLaunchからnvimを起動したときに、nodeが見つからないといわれました。調べるとnodeだけでなく、Rubyやnvmも動かず、PATHが通っていませんでした。そこでconfig.py
で次のような関数を定義、呼び出すことでパスを設定、解決できました。
def set_path():
paths = os.environ['PATH'].split(';')
paths_append = [
r'C:\Ruby-on-Windows\rbenv\bin',
r'C:\Ruby-on-Windows\shims',
r'C:\Users\ユーザー名\scoop\apps\pwsh\current',
r'C:\Users\ユーザー名\scoop\apps\nvm\current',
r'C:\Users\ユーザー名\scoop\apps\nvm\current\nodejs\nodejs'
]
os.environ['PATH'] = ';'.join(list(set(paths + paths_append)))
set_path()
ちょっと詳しく
CraftLaunchとは
CraftLaunchはキーボードだけで操作できるランチャーアプリです。
アプリの説明をはこのサイトがわかりやすいと思います。→ 【PC作業効率化】おすすめフリーソフト「CraftLaunch」 – 微風 on the web…
公式ページ:craftware - CraftLaunch
アプリ起動だけでなく、VMの操作(起動・停止・スナップショット作成)、特定のサイズ指定で画面のスクショ、よく変更するファイルを開く、などなどに使いまくってます、、、が、今回、困ったことがおきました。
なにが起きたか
僕はnvimを使ってます。で、CraftLaunchにnvimを登録して起動したら[coc.nvim] *node* is not executable, checkout https://nodejs.org/en/download/
というエラーが出ました。あらー、と思って:checkhealth
するとなんだかよくわからんエラーがでます。
Running healthchecks...
E5009:無効な 'runtimepath' です Error executing lua: function health#coc#check[3]..<SNR>55_checkInitialize, line 5: Vim(call):E118: 関数の引数が多過ぎます: <SNR>55_report_error stack traceback: [C]: in function 'call' ...pps/neovim/current/share/nvim/runtime/lua/vim/health.lua:429: in function '_check' [string "<nvim>"]:1: in main chunk
では、とCraftLaunchから登録したpwsh.exeを起動して、そこからnvimを立ち上げても同様。nvimを閉じてnode -v
したところアプリが見つからないというエラー。nvmも同様。pythonは見つかる、、
PATHを確認するとこんなでした。nodejsがPATHにないです。
> $env:path
C:\Users\(ユーザー名)\OneDrive\デスクトップ\PortableApps\CraftLaunch/lib;C:\Windows\system32; C:\Windows; C:\Windows\System32\Wbem; C:\Windows\System32\WindowsPowerShell\v1.0\; C:\Windows\System32\OpenSSH\; C:\Users\(ユーザー名)\scoop\apps\python\current\Scripts; C:\Users\(ユーザー名)\scoop\apps\python\current; C:\Users\(ユーザー名)\scoop\shims; C:\Users\(ユーザー名)\AppData\Local\Microsoft\WindowsApps;
Win+Rでcmd.exeを起動してPATHを確認するとあります
> echo %PATH%
C:¥Users¥(ユーザー名)¥OneDrive¥デスクトップ¥PortableApps¥CraftLaunch/lib;C:¥Windows¥system32;C:¥Windows;C:¥Windows¥System32¥Wbem;C:¥Windows¥System32¥WindowsPowerShell¥v1.0¥;C:¥Windows¥System32¥OpenSSH¥;C:¥Users¥(ユーザー名)¥scoop¥apps¥nvm¥current;C:¥Users¥(ユーザー名)¥scoop¥apps¥nvm¥current¥nodejs¥nodejs;C:¥Users¥(ユーザー名)¥scoop¥apps¥python¥current¥Scripts;C:¥Users¥(ユーザー名)¥scoop¥apps¥python¥current;C:¥Users¥(ユーザー名)¥scoop¥shims;C:¥Users¥(ユーザー名)¥AppData¥Local¥Microsoft¥WindowsApps;
CraftLaunchにprint(os.environ['PATH'])する関数を登録して呼び出すと、nodejsのは入ってません。
きっとCraftLaunchは何かの理由でPATHに入れてくれないんだ、と想像しました。
(→ じつはこれは間違いで、単にCraftLaunchの起動時期が問題だっただけでした。)
PATHを登録する関数の追加
登録されないなら自分で登録してしまえばいい、ということでconfig.pyのなかでPATHをセットするようにしました。手順で考えたのは
- 今のPATHをos.environ['PATH']でとってきてlistにする
- 追加したいパスのlistを作る
- 二つのlistをつないで、重複を省く
- listの各要素を「;」でつないでい一つの文字列にする
- os.environ['PATH']に登録する
で、できたのが最初のまとめと解決策の関数です。nodejsだけでなくRubyも抜けていたので追加してあります。
解決した!けどこれは根本的にいろいろ違っていた
追記に書いた通り、こんな関数使わずともCraftLaunchの再起動で解決します。いろいろ知ることができてよかったけど、なんだか視野が狭くなってたなーと反省です。
ところで、nvmとrbenvもWindowsで使えます!(全然関係ない)
nvm : scoop install nvm
rbenv : RubyMetric/rbenv-for-windows: rbenv for Windows - Manage your app's Ruby environment on Windows (scoop install vcredist
が必須)