矢印キー付きのインラインテキストメニューセレクタを表示するコマンドラインパッケージを探しています。

矢印キー付きのインラインテキストメニューセレクタを表示するコマンドラインパッケージを探しています。

矢印キーとEnterを使用してナビゲートできるインラインメニューをシェルに表示するツールを探しています。 「インライン」とは、メニューが標準出力テキストの一般的なフロー内に表示されることを意味します。いいえすべての上にポップアップダイアログがあります。

やっと見つけたその投稿私はこの問題を解決しようとしましたが、カスタムスクリプトやインラインではなく/ポップアップソリューション(またはdialogzenityのみが言及されました。

私が探しているのは、apt-getDockerイメージに使用するか、単にインストールし、npm install -gオプションリストを使用してスクリプトから呼び出して、ユーザーが選択したものをインポートできる強力なパッケージです。

nodeJSで私は使用しています質問者これらのメニューを提供するだけでなく、さまざまな入力も提供します。

これは例ですスクリーンショットそんなインラインメニュー。

このツールはシェルスクリプトで書く必要はありません。apt-get使いやすさが簡単な限り、任意の言語で書かれたバイナリ/スクリプトにすることができますcurl。選択を渡すシェルスクリプトから呼び出すことができる限り、nodeJSツールも可能です。

答え1

前に使ったアイセレクトこのために数年前。

非常に基本例:

$ sel="$(iselect -a 'foo' 'bar')"
$ echo $sel
foo

からman iselect

iSelectは、フルスクリーンのCursesベースのターミナルセッションを介して機能するASCIIファイル用の対話型行選択ツールです。 Bourne-Shell、Perl、または他の種類のスクリプトバックエンドで制御されるユーザーインターフェイスのフロントエンドのラッパーとして使用するか、バルクパイプラインフィルタ(通常はgrepと最終実行コマンドの間)として使用できます。つまり、iSelectはあらゆる種類の行ベースの対話型選択用に設計されています。

入力データ

入力は、各引数がバッファラインに対応するコマンドライン(line1 line2 ...)から読み取られるか、またはバッファラインが改行に基づいて決定されるstdin(引数が指定されていない場合)から読み取ることができます。

"<b>"..."</b>"また、HTMLの構文を使用して、選択できない行の部分文字列を太字で表示することもできます(選択可能な行は常に太字で表示されるため)。

答え2

非常に基本的な方法はbashselect文を使用することです。他のものをインストールする必要はありません。取得した例は次のとおりです。

#!/bin/bash

[...]

sourceBranch=
targetBranch=
# Force one option per line
columnsBackup=${COLUMNS}
COLUMNS=40

echo "Select source and target branch:"
select branches in \
    "testing -> release-candidate" \
    "release-candidate -> stable-release" \
    "stable-release -> stable"
do
    if [ -z "${branches}" ]; then
        echo "Invalid selection"
        continue
    fi

    sourceBranch="${branches%% -> *}"
    targetBranch="${branches##* -> }"
    break
done

COLUMNS=${columnsBackup}
echo "Releasing from ${sourceBranch} to ${targetBranch}"

[...]

出力:

Select source and target branch:
1) testing -> release-candidate
2) release-candidate -> stable-release
3) stable-release -> stable
#? 1   
Releasing from testing to release-candidate

case ... esacブロック単位でいくつかの処理を実行することもできますdo ... done

答え3

bashを使用して問題を解決する方法は次のとおりです。

#!/usr/bin/env bash

# Renders a text based list of options that can be selected by the
# user using up, down and enter keys and returns the chosen option.
#
#   Arguments   : list of options, maximum of 256
#                 "opt1" "opt2" ...
#   Return value: selected index (0 for opt1, 1 for opt2 ...)


figlet -st "$COLUMNS" "Welcome $USER"
printf '\n?%s\n?%s\n?%s\n\n' "What's the name of your website simple-site" "What's the description of your website(optional):" "Please choose lincense":

# Change the value of options to whatever you want to use.
options=("MIT" "Apache-2.0" "GPL-3.0" "Others")

select_option (){
  # little helpers for terminal print control and key input
  ESC=$(printf '%b' "\033")

  cursor_blink_on() {
    printf '%s' "$ESC[?25h"
  }

  cursor_blink_off() {
    printf '%s' "$ESC[?25l"
  }

  cursor_to() {
    printf '%s' "$ESC[$1;${2:-1}H"
  }

  print_option() {
    printf '   %s ' "$1"
  }

  print_selected() {
    printf '  %s' "$ESC[7m $1 $ESC[27m"
  }

  get_cursor_row() {
    IFS=';' read -sdR -p $'\E[6n' ROW COL; printf '%s' ${ROW#*[}
  }

  key_input() {
    read -s -n3 key 2>/dev/null >&2
    if [[ $key = $ESC[A ]]; then
      echo up
    fi
    if [[ $key = $ESC[B ]]; then
      echo down
    fi
    if [[ $key = ""  ]]; then
      echo enter
    fi
  }

   # initially print empty new lines (scroll down if at bottom of screen)
   for opt; do
     printf "\n"
   done

   # determine current screen position for overwriting the options
   local lastrow=$(get_cursor_row)
   local startrow=$(($lastrow - $#))

   # ensure cursor and input echoing back on upon a ctrl+c during read -s
   trap "cursor_blink_on; stty echo; printf '\n'; exit" 2
   cursor_blink_off

   local selected=0
   while true; do
     # print options by overwriting the last lines
     local idx=0
     for opt; do
       cursor_to $((startrow + idx))
       if [[ $idx == $selected ]]; then
         print_selected "$opt"
       else
         print_option "$opt"
       fi
       ((idx++))
     done

     # user key control
     case $(key_input) in
       enter) break;;
       up)    ((selected--));
         if (( $selected < 0 )); then selected=$(($# - 1)); fi;;
         down)  ((selected++));
           if (( selected > $# )); then selected=0; fi;;
         esac
       done

       # cursor position back to normal
       cursor_to $lastrow
       printf "\n"
       cursor_blink_on

       return "$selected"
}


select_option "${options[@]}"
choice=$?

index=$choice
value=${options[$choice]}

case $value in 
  MIT)  ## User selected MIT
   read -rp "Really use? $value [Y/N] " answer
   [[ $answer ]] || { echo "No answer!" >&2; exit 1; }
   if [[ $answer == [Yy] ]]; then
     : ## User selected Y or y, what are you going to do about it?
   elif [[ $answer == [Nn] ]]; then
     : ## User selected N or n what are you going to do about it?
   fi
   printf '%s\n' "You have choosen $answer";;
  Apache-2.0)
   read -rp "Really use? $value [Y/N] " answer
   [[ $answer ]] || { echo "No answer!" >&2; exit 1; }
   if [[ $answer == [Yy] ]]; then
     :
   elif [[ $answer == [Nn] ]]; then
     :
   fi
   ;;
  GPL-3.0)
   read -rp "Really use? $value [Y/N] " answer
   [[ $answer ]] || { echo "No answer!" >&2; exit 1; }
   if [[ $answer == [Yy] ]]; then
     :
   elif [[ $answer == [Nn] ]]; then
     :
   fi
   ;;
  Others)
   read -rp "Really use? $value [Y/N] " answer
   [[ $answer ]] || { echo "No answer!" >&2; exit 1; }
   if [[ $answer == [Yy] ]]; then
     :
   elif [[ $answer == [Nn] ]]; then
     :
   fi
   ;;
esac

出力は次のとおりです。https://i.stack.imgur.com/RO9E5.png:ifステートメント内では何もしません。コード/プロセスまたは答えが次のような場合は、やりたいことに置き換えてください。これ:であれば、始めるのに十分です。ところで、どこかにモーションキャプチャコードが公開されていることを発見し、いくつかの構文を拡張/再作成しました。[Yy][Nn]

関連情報