次の例では、$
bashプロンプトで⏎
Enterキーを押すことを象徴するようにコマンド/エイリアスをどのように設定しますかfoo
?
$ foo bar⏎
Enterキーを押す前に「bar」を変更できるように、「bar」(またはコマンドに渡す別の文字列)がコマンドラインに入力/入力/事前入力または入力されますか?例えば
$ bar
…
$ barbaz⏎
試しましたが、成功しなかったし、したくecho bar > /dev/pts/123
ありませんxdotool
。可能ですか?
編集:ユースケースの例、「greppyオートコンプリート」:
覚えにくいパラメータを多く含む長いコマンドが必要なことがよくあります。例をファイルに保存します。
コマンド.txt:
ffmpeg -i infile.mp4 -c:v copy -c:a copy -y transcoded.mp4
sox in.wav out.wav remix 1 0
さて、上記のコマンドがあればこれと呼びますinject
。エイリアスを持つことができます。
grepcomplete () {
inject $(grep $0 commands.txt)
}
だから私が覚えているとき、私は必要ですミックスなにか思い出せません。ソックス対応するパラメータを入力し、入力したgrepcomplete remix
ようsox in.wav out.wav remix 1 0
にコマンドラインに座って編集して調整する準備が整ったら、Enterキーを押して実行できます。何も選択、コピー、貼り付ける必要はありません。
Kamilがコメントで提案したように、bashの履歴検索(Ctrl-R)を使用し、history -r commands.txt
bashrcで同様の操作を実行して独自の「記録」を提供できます。
それでも私のアプローチの良いことは、たとえば、構文の強調表示を使用してすべての一致を表示して簡単にハッキングできることです。
私はこの質問に直接答え、このコマンドの実装を提供したことに注意してくださいinject
。
答え1
以下は、以下からインスピレーションを得た小さくて醜いソリューションです。Perlソリューションを介して各プロンプトの後に文字列を挿入する、TIOCSTIの使用Pythonに適応する:
次のbash機能.bashrc
inject () {
(python -c "import fcntl; import termios; import sys
with open('/dev/stdout', 'w') as fd:
for c in ' '.join(sys.argv[1:]): fcntl.ioctl(fd, termios.TIOCSTI, c)" "$@" &)
}
使用法:
inject foo bar
メモ:
- 今はUnicodeを処理できません!
for char in str
犯人が疑われますか? - サブシェルの背景構造
( foo &)
プロンプトの前に文字列の二重エコーを防ぐ - 引数間のスペースを食べます:
inject foo bar
=inject foo bar
。使用inject "foo bar"
。 - タイミングによって異なりますので、競争条件があると思いますか?
- bashサブシェルなしで実行でき、パイプ、xargsなどに適しているPythonスレッド/マルチプロセッシング機能を持つ他のバージョンがあります。これは私のユースケースにとって最もクリーンでシンプルなソリューションです。
答え2
を使用して設定できます~/.inputrc
。ファイルが存在しない場合は、ファイルを作成して次の内容を追加します。
Control-P: "foo "
新しい端末を開いてCtrl+を押すと、カーソルがある場所にP文字列がfoo
入力されます。自分に合ったショートカットを選択して動作する必要があります。
答え3
xdotool
TTYシェルではなくX環境でのみ機能し、Waylandでは機能しない可能性があります。
私はあなたが質問しているような気がします。独自のbash完成スクリプトを作成する。その後、キーを「注入」(通話完了)しますTab
。
デフォルトのアイデアは、ユーザーがキーを押したときにbashが提案する内容をcomplete
示す次のコマンドです。Tab
$ complete -W "now tomorrow never" dothis
その後、入力してください。
$ dothis to<Tab>
充填:
$ dothis tomorrow
あなたの例では、
$ complete -W bar foo
$ foo<Space><Tab>
生産する
$ foo bar
さらに編集できます。
コマンド自体は、対話型シェルの作成中に実行complete
できます。~/.bashrc
答え4
Fishでは、この機能を使用するのと同じですcommandline
。たとえば、
commandline 'echo next command'