Bashでは、コマンドラインでCtrl+Rを押すことで、過去に実行したコマンドを検索できます。Nyagosにも同様の機能が実装されており、historyでコマンド履歴を一覧表示し、!コマンド索引番号で指定したインデックス位置のコマンドを再実行できます。しかし、今はもう2025年です。せっかくなら選択方式で素早く実行できるようにしたいところです。

Nyagosには nyagos.box() という配列を選択メニューとして表示する関数があり、履歴選択メニューのショートカットキーはAlt+RCtrl+Rに対応していると思われます)です。以下のコードを実行すると、コマンド履歴の選択メニューが生成されます。

local result = nyagos.box(share.__dump_history())

Alt+Rを押して上下キーで移動し、Enterでコマンドを取得

gh|700

Alt+Rの選択メニューは便利ですが、インクリメンタルフィルタ機能がありません。そこで fzf と統合することで、フィルタリングが可能になり、見た目も美しく、さらに多くの機能を使えるようになります。

fzf統合のため、LuaでAlias hf とショートカットキー Ctrl+W を作成しました。

fzfは fzf GitHub から、awk.exeは Gow (Gnu On Windows) からダウンロードできます。

1. Alias hf

  • hf はコマンドのインデックス番号と実行時間を逆順で表示し、フィルタ文字列を入力できます。hf フィルタ文字列 のように実行時に文字列を指定することも可能です。
  • fzf内では上下キーで再実行したいコマンドを選び、Enterでコマンドラインに戻せます。

gh|700

nyagos.alias.hf = function(args)
  local _sQuery = ""
  if args[1] then _sQuery = args[1] end
  local _sResult = ""
  local _sCmd = 'history | fzf --cycle --tac --layout=reverse '
  if string.len(_sQuery) > 0 then _sCmd = _sCmd .. '--query=' .. _sQuery end
  _sCmd = _sCmd .. ' | awk "{match($0, /\\] (.*) \\(/, arr); print arr[1]}" '
  _sResult = nyagos.eval(_sCmd)
  if (_sResult ~= "") then
    print('Exec: ' .. _sResult .. '\n')
    nyagos.setnextline(_sResult)  -- v4.4.19で利用可能
  end
end
  • historyの出力をfzfに渡して選択し、Enterで選んだ行を awk に渡して]の右側を抽出し、nyagos.setnextline()でコマンドラインに戻します。
  • nyagos.setnextline()は未リリースのv4.4.19から利用可能な機能で、最新ビルドからテスト版を入手できます。

2. ショートカットキー Ctrl+W

hfとほぼ同じですが、キーボード操作用です。Aliasは args で引数が取得できますが、キーの場合は this:lastword() でコマンドライン上の最後の単語を取得できます。これにより .docxCtrl+W のようにフィルタ文字列を使えます。

nyagos.key.C_w = function(this)
  local _sQuery = this:lastword()
  local _sCmd = 'history | fzf --cycle --tac --layout=reverse '
  if string.len(_sQuery) > 0 then 
    _sCmd = _sCmd .. '--query=' .. _sQuery 
  end
  _sCmd = _sCmd .. ' | awk "{match($0, /\\] (.*) \\(/, arr); print arr[1]}"'

  local _sResult = ""
  _sResult = nyagos.eval(_sCmd)
  if (_sResult ~= "") then
    print('Exec: ' .. _sResult .. '\n')
    return _sResult
  end
end

3. 💡 関連リンク

✅ 解説記事(繁体字中国語):https://jdev.tw/blog/9154/
Explanation article (English)
解説記事(日本語)

bmatzelle/gow: Unix command line utilities installer for Windows.
junegunn/fzf: :cherry_blossom: A command-line fuzzy finder