

Windowsのコマンドプロンプト(cmd.exe)でWindowsコマンドを頻繁に操作する際、clinkをインストールすれば、コマンド編集機能を拡張してLinux BASHと同様の操作感を得られます。しかし、clinkはcmd.exeに「インジェクト」する方式で拡張を行うため、システムにいくつかのDLLをインストールし、レジストリ(Registry)も変更します。そのため、個人的にはあまり好みません。
最近、日本製のnyagosを見つけました。clinkと機能が似ているだけでなく、DLLのインストールが不要でレジストリも変更せず、Luaを使ってカスタム機能を拡張することも可能です。非常に手軽に使え、既存の内部コマンドやバッチファイルもそのまま利用できます。コマンドライン操作に慣れている方には、nyagosを試してみることを強くお勧めします。
- nyagosは Nihongo Yet Another GOing Shell の略です
- "NYAGOS - The hybrid Commandline Shell between UNIX & DOS"
- 最初のリリース日は2014/09/27、現在のバージョンは4.4.15_0です
- 1.0から3.xまではC++で記述 (NAYOS、「にゃおす」と発音)、4.0からはGo言語で記述 (NYAGOS、Gが1つ追加)
1. インストール
- https://github.com/nyaosorg/nyagos/releases から.zipファイルをダウンロードして解凍します
インストールフォルダ\makeicon.cmdを実行すると、PowerShellによってデスクトップにアイコンが作成され、起動ホットキー <span class='keybs'>Ctrl+Alt+N</span> が設定されます- デフォルト設定ファイル:
C:\Users\ユーザー\.nyagos(Luaスクリプトファイル) C:\Users\ユーザー\.nyagosを削除し、インストールフォルダ内の .nyagos ファイルを直接使用することを推奨します。変更前にバックアップしてください (ポータビリティのため)
1.1. 起動実行順序
nyagosインストールフォルダ\.nyagos(lua-script)nyagosインストールフォルダ\nyagos.d\*.lua(lua-script)%USERPROFILE%\.nyagos(lua-script)%APPDATA%\NYAOS_ORG\nyagos.d\*.lua(lua-script)
2. 使用例
2.1. ls (list)
ls test*
ls -a -ltr
c:\util\npp\notepad++ $(ls test*)
c:\util\npp\notepad++ `ls test*`
emeditor $(ls test* | fzf -m)
cd `ls -d | box`
lsとllはインストールフォルダ\nyagos\nyagos.d\aliases.luaで定義されています- Luaを書いたことがなければ、
インストールフォルダ\nyagos\nyagos.d\*.luaを読んで試してみてください boxはnyagosの組み込みコマンドで、選択メニューを作成できます
2.2. カスタムエイリアス
- スクリプトファイル
インストールフォルダ\nyagos\nyagos.d\my_aliases.luaを作成し、内容は以下のようにします:
nyagos.alias.cat="type"
nyagos.alias["cd.."]="cd .."
nyagos.alias["cd..."]="cd ../.."
nyagos.alias["cd2"]="cd ../.."
nyagos.alias["cd3"]="cd ../../.."
nyagos.alias["cd?"]="cd ?"
if nyagos.env.OS == "Windows_NT" then
-- 古い順にソート
nyagos.alias.ll="__ls__ -olFh -ltr $*"
end
2.3. プロンプト文字列の変更
- スクリプトファイル
インストールフォルダ\nyagos\nyagos.d\my_prompt.luaを作成し、内容は以下のようにします - Gitのワーキングディレクトリの場合、ブランチ名も表示します
-- Source: https://qiita.com/suisui/items/b6469ce91f01a83b599b
-- Reference: [【NYAGOS】プロンプトで使える特殊文字と ANSI エスケープシーケンスを Lua でラップする - Tumbling Dice](https://outofmem.hatenablog.com/entry/2016/01/27/014920)
share.org_prompter = nyagos.prompt
nyagos.prompt = function(this)
local oPrompt = share.prompt
local oEsc = share.escape_sequence
-- add dir name (with drive letter)
-- bg.default (=49) だけでいい気もしますが、追加で bg.trans (=60) も足してます
local sEscStart = oEsc.create_sequence(oEsc.bg.default, oEsc.bg.trans)
local sEscEnd = oEsc.create_sequence(oEsc.fg.white, oEsc.bg.trans)
--print("sEscStart=" .. sEscStart)
--print("sEscEnd=" .. sEscEnd)
local prompt_message = string.format('%s[%s]%s', sEscStart, oPrompt.path, sEscEnd)
-- check git branch
local sGitBranchName = nyagos.eval('git rev-parse --abbrev-ref HEAD 2>nul')
--print("branch=" .. sGitBranchName)
if (sGitBranchName ~= '') then
-- add git branch name
sEscStart = oEsc.create_sequence(oEsc.fg.red, oEsc.bg.trans)
sEscEnd = oEsc.create_sequence(oEsc.fg.default, oEsc.bg.trans)
--print("sEscStart=" .. sEscStart)
--print("sEscEnd=" .. sEscEnd)
prompt_message = string.format(prompt_message .. ' [%s%s%s]', sEscStart, sGitBranchName, sEscEnd)
end
-- add line break
prompt_message = prompt_message .. " " -- oPrompt.crlf
-- add dollar
prompt_message = prompt_message .. oPrompt.dollar .. ' '
return share.org_prompter(prompt_message)
end
share.prompt = {
eq = '$q', -- equal '='
dollar = '$$', -- dollar '$'
time = '$t', -- current time
date = '$d', -- current date
path = '$p', -- current path (with drive letter)
ver = '$v', -- windows version
drive = '$n', -- current drive letter
gt = '$g', -- greater than '>'
lt = '$l', -- less than '<'
pipe = '$b', -- pipe '|'
crlf = '$_', -- line break
esc = '$e', -- escape
bs = '$h', -- backspace
amp = '$a', -- ampersand '&'
l_par = '$c', -- left parenthesis '('
r_par = '$f', -- right parenthesis ')'
space = '$s' -- space
}
share.escape_sequence = {
-- attribute
attr = {
off = '0',
bold = '1',
bold_off = '21',
underline = '4',
underline_off = '24',
blink = '5',
blink_off = '25'
},
-- foreground
fg = {
black = '30',
red = '31',
green = '32',
yellow = '33',
blue = '34',
magenta = '35',
cyan = '36',
white = '37',
default = '39',
-- prefix 'l' is 'Light'
l_gray = '90',
l_red = '91',
l_green = '92',
l_yellow = '93',
l_blue = '94',
l_magenta = '95',
l_cyan = '96',
l_white = '97'
},
-- background
bg = {
black = '40',
red = '41',
green = '42',
yellow = '43',
blue = '44',
magenta = '45',
cyan = '46',
white = '47',
default = '49',
trans = '60',
-- prefix 'l' is 'Light'
l_gray = '100',
l_red = '101',
l_green = '102',
l_yellow = '103',
l_blue = '104',
l_magenta = '105',
l_cyan = '106',
l_white = '107'
},
-- create_sequence(fg, bg, attr) 引数の順序は任意
create_sequence = function(...)
local prompt = share.prompt
local attrs = {...}
local joined_attrs = ''
for n, v in pairs(attrs) do
local val = tostring(v)
if val ~= nil then
joined_attrs = joined_attrs ~= '' and joined_attrs .. ';' .. val or val
end
end
return string.format('%s[%sm', prompt.esc, joined_attrs)
end
}
2.4. ディレクトリの高速切り替え
z フォルダの部分文字列でディレクトリを素早く切り替えます (ジャンプ)- zoxide をインストールします
- ディレクトリ変更履歴は、
cdコマンド実行時にnyagos.postexechook()を介して zoxide に書き込まれます。さらにzエイリアスを追加し、問い合わせ後に素早く切り替えられるようにします。 - スクリプトファイル
インストールフォルダ\nyagos\nyagos.d\my_z.luaを作成し、内容は以下のようにします:
-- source: [nyagos增加zoxide的支持 – wentao's blog](https://wentao.org/post/2023-04-27-zoxide-with-nyagos/)
-- 2024/04/09 Jerry modified no args handling.
-- [ajeetdsouza/zoxide: A smarter cd command. Supports all major shells.](https://github.com/ajeetdsouza/zoxide)
nyagos.alias.z = function (args)
local path
if (#args >= 1) then
local rest = args[1]
path = rest
path = nyagos.eval("zoxide query --exclude '".. (nyagos.getwd()) .."' -- " .. rest)
else
path = nyagos.eval("zoxide query -i")
end
nyagos.chdir(path)
end
nyagos.alias.zi=function(args)
if (#args == 0) then
print("zi need a path.")
return
end
local rest = args[1]
path = nyagos.eval("zoxide query -- " .. rest .. "| fzf" )
nyagos.chdir(path)
end
-- postexechook 機能を利用し、zoxide データを自動更新します。
-- nyagos.preexechook もあります。
nyagos.postexechook = function(args)
if "cd" == args[1] then
nyagos.eval("zoxide add -- " .. nyagos.getwd())
end
end
▼ z の使用例
rem z でディレクトリ履歴メニューを表示。上下キーで移動、文字入力で絞り込みも可能
z
z test
2.5. コマンド履歴の実行
rem 直近10件のコマンドを表示
history
rem 123番目のコマンドを実行
!123
スクリプトファイル インストールフォルダ\nyagos\nyagos.d\my_aliases.lua を変更し、カスタムエイリアス hist を追加します。引数がない場合はデフォルトで20件表示します:
nyagos.alias.hist=function(args)
if (#args <= 0) then
iCount = 20
else
-- print("args=" .. args[1])
iCount = args[1]
end
nyagos.exec("history " .. iCount)
end
2.6. 自動補完
インストールフォルダ\nyagos\nyagos.d\catalog\git.luaをインストールフォルダ\nyagos\nyagos.d\にコピーしますインストールフォルダ\nyagos\nyagos.d\catalog\subcomplete.luaをインストールフォルダ\nyagos\にコピーします- コマンドラインで
git reと入力して <span class='keybs'>Tab</span> キーを押すと、reで始まるGitコマンドの候補が表示されます
2.7. メニューホットキー
インストールフォルダ\nyagos\nyagos.d\box.luaは以下のホットキーを提供します:
| キー | 機能 |
|---|---|
| Ctrl+O | カレントフォルダのファイル選択メニュー |
| Ctrl+X | r: コマンド履歴メニュー<br>h: cd 履歴メニュー<br>g: Git log メニュー |
| Alt+R | コマンド履歴メニュー。コマンドにスペースが含まれる場合はダブルクォートで囲む |
| Alt+H | cd 履歴メニュー |
| Alt+G | Git log メニュー |
| Alt+O | .lnk ショートカットの元のパスを取得 |
- ショートカットの作成
lnk ディレクトリまたはパスを含むファイル名 保存先の.lnkファイル
lnk c:/util/nyagos\nyagos.d j:/test/nyad.lnk
cd j:/test/nyad.lnk
2.8. foreach
cd /d j:/test/nyagos
foreach f *.txt ; echo move %f% %f:txt=ttt% ; end
3. 問題点
3.1. bindkey
<span class='keybs'>Ctrl+End</span> をカーソル右側のテキスト削除(<span class='keybs'>Ctrl+K</span> のような)に割り当てたいのですが、できないようです。
3.2. コントロールパネル項目 (.cpl)
例えば main.cpl や ncpa.cpl といったコントロールパネル項目ファイルは open や start では開けません。最終的にバッチファイルで対応しました:
@echo off
if "%1"=="net" ncpa.cpl
if "%1"=="fire" Firewall.cpl
if not "%1"=="" %1.cpl
if "%1"=="" dir /w c:\windows\system32\*.cpl
3.2.1. 2025/03/07
cmd.exe を使って解決することも可能です:
nyagos.alias["appwiz.cpl"]="cmd /c appwiz.cpl"
3.3. Microsoft 管理コンソール (.msc)
services.msc のような .msc ファイルは直接起動できず、open services.msc や start services.msc と入力する必要があります。
.msc は実質的に Windows の実行可能ファイルであり、.msc なしなら直接実行できますが、.msc を付けると nyagos からは起動できません。
cmd.exe と同様に実行できるよう、以下のエイリアスを追加します:
nyagos.alias.svc="start services.msc"
nyagos.alias["appwiz.cpl"]="cpl appwiz"
nyagos.alias["services.msc"]="start services.msc"
あるいは、インストールフォルダ\nyagos\nyagos.d\suffix.lua を変更して、nyagos に .msc ファイルの実行方法を教えることもできます:
for key,val in pairs{
awk={"gawk","-f"},
js={"cscript","//nologo"},
lua={"nyagos.exe","--norc","--lua-file"},
pl={"perl"},
ps1={"powershell","-ExecutionPolicy","RemoteSigned","-file"},
rb={"ruby"},
vbs={"cscript","//nologo"},
wsf={"cscript","//nologo"},
py={"python"},
msc={"open"},
} do
share._setsuffix( key , val )
end
4. 💡 関連リンク
💡 解説記事: https://jdev.tw/blog/8420/
✅ nyaosorg/nyagos: NYAGOS - The hybrid Commandline Shell between UNIX & DOS
✅ zoxide マニュアル: zoxide man | Linux Command Library
✅ 参考: clink:擴充cmd.exe成為Bash readline命令行的強大編輯功能 – 簡睿隨筆
✅ 参考: 【NYAGOS】プロンプトで使える特殊文字と ANSI エスケープシーケンスを Lua でラップする - Tumbling Dice
✅ 参考:nyagos增加zoxide的支持 – wentao's blog