コマンドライン・インストーラの Scoop を使用し、コンソール・エミュレータの Cmder と、JavaScript 環境の Node.js をインストールした際のメモ。
Scoop のインストールにはバージョン 3 以上の PowerShell が必要なので、PowerShell を起動して確認します。
$psversiontable.psversion.major
普通にインストールを始めると、ユーザー・フォルダ(All Users 用は ProgramData)内の scoop フォルダに Scoop 本体や管理するアプリケーションが入りますが、起動ドライブに入れずに済むものはなるべく入れたくないので、Scoop のインストール先を変更します。
PowerShell で環境変数に SCOOP(All Users 用は SCOOP_GLOBAL)を登録します。
[environment]::setEnvironmentVariable('SCOOP','Scoop のインストール先のパス','User')
$env:SCOOP='Scoop のインストール先のパス'
All Users 用の環境変数登録には管理者権限が必要なので、管理者権限で PowerShell を起動します。
[environment]::setEnvironmentVariable('SCOOP_GLOBAL','All Users 用の Scoop のインストール先のパス','Machine')
$env:SCOOP_GLOBAL='All Users 用の Scoop のインストール先のパス'
PowerShell でローカル・スクリプトを実行出来るよう、実行ポリシーを変更します。
set-executionpolicy remotesigned -scope currentuser
PowerShell で Scoop のインストール・スクリプトを実行します。
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
インストールが終了したら、動作確認を兼ねてヘルプを表示してみます。
scoop help
インストール出来るアプリケーションのコレクションを bucket と呼び、Scoop のインストールと同時に利用出来る main bucket に目的の Cmder と Node.js はありますが、更にインストールしたいアプリケーションを増やすため、extras bucket も導入します。
scoop bucket add extras
目的のアプリケーションが見つからない場合は、awesome-scoop で探してみましょう。
jfut bucket や iyokan-jp bucket のように、日本語版アプリケーション用の bucket を公開している方もいらっしゃるようです。
scoop bucket add jfut https://github.com/jfut/scoop-jfut.git
scoop bucket add iyokan-jp https://github.com/tetradice/scoop-iyokan-jp
Scoop は最新バージョンしかインストール出来ませんが、過去のバージョンもインストール出来るよう versions bucket を導入します。
scoop bucket add versions
PowerShell やコマンドプロンプトでは味気ないので、Cmder をインストールします。
まずは Cmder を検索してみます。
scoop search cmder
main bucket に Cmder(cmder)があると確認出来たのでインストールします。
scoop install cmder
スタートメニューの Scoop Apps フォルダ内にショートカットが作成され、起動出来るようになります。
環境変数の Path に登録されている Scoop のインストール先の shims フォルダに cmder.exe の shim が作成され、コマンドラインからも起動出来るようになります。
cmder
コンテキストメニューから Cmder を起動出来る、Cmder Here
をコマンドラインで追加します。
cmder.exe /REGISTER USER
All Users 用の Cmder Here
は管理者権限で追加します。
cmder.exe /REGISTER ALL
ls コマンドを実行すると日本語のフォルダ名やファイル名が文字化けするので、Cmder の起動時に文字コードの設定をします。
Settings
> Startup
> Environment
の Set up environment variables, cmd.exe aliases, codepage
に、set LANG=ja_JP.UTF-8
を追記します。
Settings
> General
> Fonts
の Main console font
と Alternative font (pseudographics, CJK, etc.)
を変更します。
コピーは文字列を選択するだけで出来るし、Ctrl
+ C
は割り込みに使用したいので変更します。
Settings
> Keys & Macro
の右上にある検索ボックスに Ctrl+C
と入力し、表示されたホットキーを選択、Choose hotkey
の C
を削除します。
ペーストは右クリックで出来るので変更します。
Settings
> Keys & Macro
の右上にある検索ボックスに Ctrl+V
と入力し、表示されたホットキーを選択、Choose hotkey
の V
を削除します。
デフォルトのプロンプト(λ)では、カーソルキーの上下でコマンドヒストリを表示させるときに表示が崩れる場合があるようなので、Cmder の Prompt を修正する方法 — 適当に だらだらと 楽しくを参考に変更します。
Scoop のインストール先のパス\apps\cmder\current\vendor\clink.lua をエディタで開き、21 行目の local function set_prompt_filter()
から 49 行目の end
までをコピーします。
Scoop のインストール先のパス\persist\cmder\config フォルダ内に prompt.lua を作成し、ペーストします。
1 行目の local function set_prompt_filter()
を local function set_my_prompt_filter()
に変更します。
23 行目の local lambda = "λ"
を local lambda = ">"
に変更します。
最終行の後に clink.prompt.register_filter(set_my_prompt_filter, 1)
を追記します。
local function set_my_prompt_filter() -- get_cwd() is differently encoded than the clink.prompt.value, so everything other than
-- pure ASCII will get garbled. So try to parse the current directory from the original prompt
-- and only if that doesn't work, use get_cwd() directly.
-- The matching relies on the default prompt which ends in X:\PATH\PATH>
-- (no network path possible here!)
local old_prompt = clink.prompt.value
local cwd = old_prompt:match('.*(.:[^>]*)>')
if cwd == nil then cwd = clink.get_cwd() end
-- environment systems like pythons virtualenv change the PROMPT and usually
-- set some variable. But the variables are differently named and we would never
-- get them all, so try to parse the env name out of the PROMPT.
-- envs are usually put in round or square parentheses and before the old prompt
local env = old_prompt:match('.*%(([^%)]+)%).+:')
-- also check for square brackets
if env == nil then env = old_prompt:match('.*%[([^%]]+)%].+:') end
-- build our own prompt
-- orig: $E[1;32;40m$P$S{git}{hg}$S$_$E[1;30;40m{lamb}$S$E[0m
-- color codes: "\x1b[1;37;40m"
local cmder_prompt = "\x1b[1;32;40m{cwd} {git}{hg}{svn} \n\x1b[1;39;40m{lamb} \x1b[0m"
local lambda = ">" cmder_prompt = string.gsub(cmder_prompt, "{cwd}", cwd)
if env ~= nil then
lambda = "("..env..") "..lambda
end
clink.prompt.value = string.gsub(cmder_prompt, "{lamb}", lambda)
end
clink.prompt.register_filter(set_my_prompt_filter, 1)
scoop search nodejs
main bucket に最新版(nodejs)があると確認出来たのでインストールします。
scoop install nodejs
環境変数の Path に登録された Scoop のインストール先のパス\apps\nodejs\current\bin と Scoop のインストール先のパス\apps\nodejs\current が反映されるよう Cmder を再起動し、Node.js, npm, npx のバージョンを確認します。
node -v
npm -v
npx -v
main bucket に推奨版(nodejs-lts)があるのでインストールします。
scoop install nodejs-lts
環境変数の Path に登録された Scoop のインストール先のパス\apps\nodejs-lts\current\bin と Scoop のインストール先のパス\apps\nodejs-lts\current が反映されるよう Cmder を再起動し、Node.js, npm, npx のバージョンを確認します。
node -v
npm -v
npx -v
最新版(nodejs)の後に推奨版(nodejs-lts)をインストールしたら、推奨版(nodejs-lts)に切り替わっていたので、最新版(nodejs)に切り替えてみます。
scoop reset nodejs
環境変数の Path が書き換えられ、Scoop のインストール先のパス\apps\nodejs\current\bin と Scoop のインストール先のパス\apps\nodejs\current が先頭に移動し、最新版(nodejs)に切り替わります。
最新版(nodejs)から推奨版(nodejs-lts)に切り替えてみます。
scoop reset nodejs-lts
環境変数の Path が書き換えられ、Scoop のインストール先のパス\apps\nodejs-lts\current\bin と Scoop のインストール先のパス\apps\nodejs-lts\current が先頭に移動し、推奨版(nodejs-lts)に切り替わります。
パッケージをグローバル・インストールしたら、コマンドが見つからずにエラーになってしまったので、npm config
で設定を確認したら、ユーザー・フォルダ内の .npmrc に、過去にインストールしていた nodist 用の prefix
が設定されたまま残っていました。
npm config ls
; userconfig ユーザー・フォルダのパス\.npmrc
prefix = "nodist のインストール・フォルダのパス\\bin"
; builtin config undefined
cache = "scoop のインストール・フォルダのパス\\persist\\nodejs-lts\\cache"
このままパスを通して使用出来るようにすると、Node.js を推奨版(nodejs-lts)から最新版(nodejs)に切り替えても、同じフォルダ内にパッケージがインストールされてしまうので、.npmrc から prefix
を削除します。
再び npm config
で設定を確認すると、prefix
が Node.js の推奨版(nodejs-lts)用に変わりました。
npm config ls
; builtin config undefined
cache = "scoop のインストール・フォルダのパス\\persist\\nodejs-lts\\cache"
prefix = "scoop のインストール・フォルダのパス\\persist\\nodejs-lts\\bin"
Node.js を最新版(nodejs)に切り替えてから npm config
で設定を確認すると、prefix
(と cache
)が Node.js の最新版(nodejs)用に変わりました。
npm config ls
; builtin config undefined
cache = "scoop のインストール・フォルダのパス\\persist\\nodejs\\cache"
prefix = "scoop のインストール・フォルダのパス\\persist\\nodejs\\bin"
これで、グローバル・インストールしたパッケージが同じフォルダ内にインストールされてしまう問題や、コマンドが見つからずにエラーになる問題が解消されました。
scoop update
scoop status
scoop update アプリケーション名
scoop cleanup アプリケーション名
scoop install アプリケーション名
scoop uninstall アプリケーション名
scoop uninstall scoop