エイリアスと関数の説明を取得するには?

エイリアスと関数の説明を取得するには?

oh-my-zshを使うのに覚えていないエイリアスと関数が多く、エイリアスがどのようなalias ag="alias | grep"役割を果たしているのかを調べるためにこれを利用しました。私も使うエイリアスプロンプト。しかし、エイリアスのコマンドだけを受け取りたくない方法をしたいと思います。grep エイリアスとエイリアスの関数とコマンドの説明。しかし、すべての機能が表示されたら、より良いようです。

前の行を取得するためにgrepを使用し、それがコメントであれば表示できると思いました。しかし、エイリアスが長すぎない限り、私は通常コメントを同じ行に入れます。したがって、説明を得るには、前の行と同じ行のコメントを確認する必要があります。

また、すべてのエイリアスと関数とその説明を特定の文字で区切られたファイルに入れ、そのファイルを使用することを検討しました。しかし、その後、多くのコードを繰り返す必要があります。

ベストアンサー1

私は関数を見つけるためにfzfを使います。エイリアスを含めるように拡張できますか?

バラよりhttps://gist.github.com/tg0h/e301584f435023fae66c77675bdb6e4d完全にコメントアウトされたコードです。

ここに画像の説明を入力してください。

左側には、fzfインタラクティブファインダーが関数の簡単な説明とともに、私のすべての関数をリストします。右側のfzfプレビューウィンドウには、私の機能のプレビューが表示されます。

残念ながら、リファクタリングを進めているため、現在の関数検索機能が破損しています。

レシピ

富士

  • fzfを使用してあいまいな機能を見つけるfzfのインタラクティブファインダーはすべての機能を表示し、fzfのプレビューウィンドウを使用して機能を詳細に表示できます。

バット

  • batを使用して構文で関数を強調表示します。

機能定義

  • 関数は、関数が実行する操作を記述する特定の形式とコメント行を使用して定義されます。これは後でripgrepを使用して関数を見つけるのに役立ちます。

リップグレップ

  • ripgrepを使用して2つのタスクを実行する
  1. の各機能に対応する<function folder>aを提供します。ファイル名、b。関数名、c。 fzfの一行で。これは、fzfのインタラクティブファイルの検索(マイスクリーンショットの左側)に表示されます。

  2. 各関数について、対応するファイル名と開始行と終了行番号を見つけて、batに供給できます。その後、batを使用してファイルの機能をプレビューできます。 (マイスクリーンショットの右側に示すように)

これには正規表現ウィザードが必要ですが、関数を一様に定義すると簡単になります。詳しくは下記をご覧ください。

詳細

1. 標準形式を使用した関数の作成

この形式で関数を作成すると、抽出が簡単になります。

# I do not omit the function keyword
function hello(){
# this function says hello (only the first comment line after the function will be used to be shown in fzf)
# this comment will not be shown in fzf's interactive finder (left of screenshot) later
echo hello world
}

2. すべての機能を見つける方法(後でfzfで提供)

私の関数は上記の形式に従うと仮定し、ripgrepを使用して関数フォルダ内のすべてのファイルを解析して抽出します。

  • ファイル名
  • 機能名
  • 機能説明

これを使用してください:

_fzf_home_getFunctions(){

  # -e '^\s*function\s+(?P<fname>[^\s(]+)'
  # [^\s(] - anything that is not a space or a (
  # the regex searches for function, whitespace, and then uses a named capturing
  # group of a word character
  # exclude commented functions

  rg \
    --follow \
    --type zsh \
    --color always \
    --field-context-separator '' \
    --no-context-separator \
    --only-matching -e '^\s*function\s+(?P<fname>([^\s(]+))' -r '$fname' -A 1 \
    --field-match-separator ' ' \
    $_fzf_homeFn_dir \
    | gsed -E 's!(\s*)(#)!\2!' \
    | gsed "s!$_fzf_homeFn_dir!!" \
    | gsed 'N;s/\n/ /' \
    | gawk '{$3="-"; print}' 
}

注:私はsedとawkの代わりにgsedとgawkを使います。

3. fzf関数プレビューの設定方法

_fzf_home_displayFunction(){
  # given inputFile and inputFunc, use bat to display function body
  #
  # reads file and func
  # outputs file funcStartLineNumber funcEndLineNumber

  local inputFile=$1
  local inputFunc=$2

  local file=$_fzf_homeFn_dir$inputFile

  rg --only-matching \
     --multiline \
     -nH \
     -e '\s*function\s+'$inputFunc'\s*\(''(?s:.)*?(^\s*}$)' $file \
     | gsed '1b;$!d' | gsed 'N;s/\n/ /' \
     | rg '(?::)(\d+)(?::)' -or '$1' | join-lines | read -r funcStart funcEnd _

  bat --color=always $_fzf_homeFn_dir$inputFile -r $funcStart:$funcEnd
}

4. 最後に、fzf に機能を提供し、プレビューを設定します。

ボーナスでnvimで直接機能を編集できるキーマップも設定しました。詳しくは、私の箇条書きをご覧ください。


fzf-search-home-function-widget(){
  local result=$(
  _fzf_home_getFunctions | fzf --ansi \
    --preview="_fzf_home_displayFunction {1} {2}" \
    --bind "ctrl-e:execute(_fzf_home-function_nvim_edit {1} {2} < /dev/tty > /dev/tty 2>&1)"
)
zle reset-prompt;
LBUFFER+=$result
}

おすすめ記事