コマンド名が完了したらパラメータを追加する

コマンド名が完了したらパラメータを追加する

タブ(または他のキーの組み合わせ)を押したときに端末でいくつかの事前定義された文字列を展開する方法を探しています。これはタブの完成とは異なります。私の端末は私のホームディレクトリに拡張されました(どうやって見つけたのか覚えていませんが、私が探しているものの特別なケースであることは確かです)。

例:

入力cddして Tab キーを押すと に展開され、カーソルcd /your/home/folder/Downloads/はその行の末尾に配置されます。したがって、フォルダ内にフォルダ名を入力しDownloadsてコマンドを実行するだけです。より良い例は、カーソルを展開し、sshuシンボルの後にssh |@a-pre-defined-host.fooカーソルを置いて@ユーザー名を入力することです。

これは多くのIDEのコードスニペット拡張機能と似ています。ファイルのbash関数にパラメータを作成して.bashrc同じ結果が得られるとは言わないでください。

ポイントは何ですか?

それでは、関数呼び出しと比較してこのようなものを使用する点は何ですか?さて、コマンドラインを使用している多くの人とは異なり、私は記憶が悪いです。よく使う命令でもパラメータなどの詳細は覚えていません。私は通常オンラインで「curlを使ってjsonファイルを投稿する方法は何ですか?」のようなものを検索します。まあ、ファイル名、ホスト名、ポート名、その他のパラメータを受け入れ、POSTを実行する関数を作成できます。ただし、パラメータとその順序を覚えているのは、コマンド全体を覚えているよりも簡単ではありません。フラグメント拡張を使用する場合は、フラグメント名(たとえば)を覚えておくだけです。snppostそれ以外の場合、フラグメント名も覚えておく必要はありません。入力snpしてTabを押すと、スニペットのリストが表示され、自分が探しているスニペットが見つかります。フラグメントを展開するには、Tabキーをもう一度押します。 Webを検索してコピー/貼り付ける必要なく、私が探しているコマンドがあります。任意の方法でコマンドをカスタマイズして実行できます。

答え1

好きなだけ簡単ではありません。プログラム可能な補完はコマンドを置き換えることはできません。そして、プログラム可能な完成が始まる前に、命令(つまり末尾の空白)を完成する必要があります。

つまり、エイリアスや関数を作成し、cddそれをcd。これは問題ではありません(改行文字を含むディレクトリ名を除く...)。残りは次のように実行できます。

_cdd () { IFS=$'\n'; if [ 1 -eq "$COMP_CWORD" -a 0 -eq "${#COMP_WORDS[1]}" ]; 
then COMPREPLY=("/your/home/folder/Downloads/"); 
else COMPREPLY=($(compgen -A directory "${COMP_WORDS[1]}"));fi; }

complete -o filenames -F _cdd cdd

単語の中にカーソルを置きます。

私はこれが良いアイデアだとは思わない。しかし、これを考慮してください。カーソルを後ろに移動することは可能ですが、プログラム可能な完成ではこれを実装していません。

back_seq=$'\e[D'
output=""; for((i=0;i<5;i++)); do output+="$back_seq"; done
echo -n 123456789"$output"; sleep 5

答え2

READLINE関数で利用可能なものを見つけることができます。

LESS='+/shell-expand-line' man bash始めましょう。

shell-expand-lineecho $SHELLOPTSあなたの目的に最適ではないかもしれませんが、デフォルトで設定されています(デフォルトのシェルオプションが含まれていると仮定:emacs:)。

を実行すると、他の可能性も表示されますbind -p | grep expand。この「拡張」機能は、何らかの形でユーザーが要求した操作を実行します。

デフォルトではエイリアスを設定します。

alias cdd='cd /your/home/folder/Downloads/'

...あなたのものから.bashrc拡張したいときに入力するとcdd<Esc><C-e>拡張されます。これは上記の設定を使用して行われますshell-expand-line。これは変数だけでなく、エイリアスと履歴の拡張も拡張します。 (入力しl.; echo $SHELLOPTS; !!てを押してみてください<Esc><C-e>。)

alias-expand-lineあなたの目的に合った機能を簡単にバインドするなど、他の機能をバインドできます。

関連情報