An image to describe post

An image to describe post

Windowsのコマンドプロンプト(cmd.exe)でWindowsコマンドを頻繁に操作する際、clinkをインストールすれば、コマンド編集機能を拡張してLinux BASHと同様の操作感を得られます。しかし、clinkはcmd.exeに「インジェクト」する方式で拡張を行うため、システムにいくつかのDLLをインストールし、レジストリ(Registry)も変更します。そのため、個人的にはあまり好みません。

最近、日本製のnyagosを見つけました。clinkと機能が似ているだけでなく、DLLのインストールが不要でレジストリも変更せず、Luaを使ってカスタム機能を拡張することも可能です。非常に手軽に使え、既存の内部コマンドやバッチファイルもそのまま利用できます。コマンドライン操作に慣れている方には、nyagosを試してみることを強くお勧めします。

What is 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. 起動実行順序

  1. nyagosインストールフォルダ\.nyagos (lua-script)
  2. nyagosインストールフォルダ\nyagos.d\*.lua (lua-script)
  3. %USERPROFILE%\.nyagos (lua-script)
  4. %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`
  • lsllインストールフォルダ\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のワーキングディレクトリの場合、ブランチ名も表示します

gh|700

-- 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

gh|700

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

gh|700

3. 問題点

3.1. bindkey

<span class='keybs'>Ctrl+End</span> をカーソル右側のテキスト削除(<span class='keybs'>Ctrl+K</span> のような)に割り当てたいのですが、できないようです。

3.2. コントロールパネル項目 (.cpl)

例えば main.cplncpa.cpl といったコントロールパネル項目ファイルは openstart では開けません。最終的にバッチファイルで対応しました:

@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.mscstart 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

5. チュートリアル動画

https://youtu.be/WsfIrBWwAh0