forを使用してrlwrap
複数の単語のオートコンプリートを取得するにはtclsh
?
例:またはのように表示したいサブコマンドを入力file
<space>
してからタップします。<tab>
<tab>
file
exists
isdirectory
isfile
完成ファイルに追加(例:空白エスケープ)を試しましたが、file\ isfile
役に立ちませんでした。ただisfile
別のオートコンプリートコマンドとして表示されます。
私はフィルタを使用して複数の単語のオートコンプリートを実行できると思いますが、参照するrlwrap
明確な例はありません。/usr/share/rlwarp/filters/
答え1
少なくともフィルタディレクトリtclsh_filter
の例があります(そこにあることrlwrap
を確認してください)。chmod +x
#!/usr/bin/env perl
use strict;
use warnings;
use lib $ENV{RLWRAP_FILTERDIR};
use RlwrapFilter;
# log to some other terminal, so rlwrap terminal not cluttered up
# by any debug output - FIXME
my $DEBUG_TERMINAL = '/dev/pts/2';
open my $logfh, '>', $DEBUG_TERMINAL or die "aaaaaarrgh: $!\n";
my $filter = RlwrapFilter->new;
$filter->completion_handler(\&completion);
$filter->run;
sub completion {
my ($input, $prefix, @completions) = @_;
print $logfh "I,$input, P,$prefix, C,@completions\n";
# more complicated would be to use a lex-like scanner or Parser::MGC
# instead of this dumb regex against the input line, and even more
# complicated would be to return "exists" if the user has typed
# "file e" and is mashing tab, but that's more work
if ($input =~ m/file\s+$/) {
@completions = qw/exists isdirectory isfile/;
}
return @completions;
}
次に実行します。rlwrap -z tclsh_filter tclsh
答え2
素晴らしい答えの助けを借りてトリガー私はtclsh用に次のようなマルチワード補完フィルタを作成しましたtclsh
。以下のスクリプトは.remembertclsh_filter
に保存する必要があります。rlwrap -z tclsh_filter tclsh
chmod +x tclsh_filter
#!/usr/bin/env Perl 厳密に使用してください。 使用警告 lib $ENV{RLWRAP_FILTERDIR}を使用してください。 RlwrapFilterを使用してください。 私の @tcl_cmds = qw/encoding if pid tcl_endOfWord eof incr pkg::create tcl_findLibrary after error info pkg_mkIndex tcl_startOfNextWord 追加評価 interp proc tcl_startOfPreviousWord 配列pwd tcl_wordBreakBefore auto_import expr インデックス re _syntax t cltest auto_load fblocked linsert 読み取り tclvars auto_mkindex fconfigure リスト regexp Tell auto_mkindex_old fcopy llength レジストリ時間 auto_qualify ファイルのロード regsub トレース auto_reset ファイルイベント lrange 名前 不明 bgerror ファイル名 lreplace 戻り値 unset バイナリリフレッシュ lsearch スキャン更新割り込み lset ナビゲーション親キャプチャ foreach lsort 設定msgcatソースvwait close glob名前空間分割中の接続グローバルオープン文字列継続履歴パッケージsubst dde http parray switch /; #以下はtcl.tk Webページからコピーして貼り付けたものです。 私の $tcl_txt = <<END; ファイルの時間名?時間? ファイル属性名 ファイル属性名?オプション? ファイル属性名?オプション値オプション値...? ファイルチャンネル?モデル? ファイルのコピー? -力? ? --?ソースターゲット ファイルのコピー? -力? ? --?源泉?源泉…?宛先ディレクトリ ファイルを削除しますか? -力? ? --?パス名?パス名…? ファイルディレクトリ名 ファイル実行可能ファイル名 ファイル存在名 ファイル拡張子 ファイルはディレクトリ名です ファイルはファイル名です ファイル接続名?名前…? ファイルリンク? -リンクの種類?リンク名?ターゲット? ファイルlstat名varName ファイル mkdir dir ?dir ...? ファイルの時間名?時間? ファイルのデフォルト名 ファイル完全修飾名 ファイル名 ファイルパスタイプ名 ファイルを読み取ることができる名前 ファイル読み取りリンク名 ファイル名を変更しますか? -強制されたか。 ? --?ソースターゲット ファイル名を変更しますか? -強制されたか。 ? --?源泉?源泉…?宛先ディレクトリ ファイルのルート名 ファイルの区切り記号?名前? ファイルサイズ名 ファイル分割名 ファイル統計名 varName ファイルシステム名 ファイル姓 ファイル形式名 ファイルボリューム 書き込み可能ファイル名 文字列比較? - いいえ? ? -長さ整数?文字列1文字列2 文字列は?-nocase?-長さint?文字列 1 文字列 2 最初の文字列 NeedleString haystackString ?startIndex? 文字列インデックス文字列charIndex 文字列はalnumですか? -厳しい? ?-failindex 変数名?ひも 文字列は文字です。 文字列はASCIIです。 文字列はブール値です。 文字列は制御です 文字列は数値です 文字列は2倍です。 文字列が偽です 文字列はグラフです 文字列は整数です。 低弦 文字列が印刷されます。 文字列は句読点です。 文字列は空白です。 文字列は真です 上記の文字列 文字列は単語文字です。 文字列はxビットです。 文字列最後のneedleString haystackString?最後のインデックス? 文字列の長さ 文字列マッピング?-nocase? 文字列マッチング? - いいえ?パターン文字列 文字列範囲文字列最初の最後 文字列重複文字列数 文字列を文字列を最初に最後に置き換えますか?ニューストリング? 文字列を下の文字列に連結しますか?最初の? ?最後? 文字列をタイトル文字列として?最初の? ?最後? ストリングトップストリング?最初の? ?最後? ストリングトリミングストリング?性格? 文字列トリム左の文字列?性格? 文字列トリム右文字列?性格? ソート - アスキー lsort - 辞書 lsort - 整数 lsort - 間違い lsort - コマンドコマンド lsortの増加 ソートの削減 lsort -index インデックス lsort - ユニーク 正規表現 - 情報 正規表現の拡張 正規表現インデックス 正規表現行 正規表現 - linestop 正規表現 -lineanchor 正規表現-nocase 正規表現 - すべて 正規表現 - インライン 正規表現 - 開始インデックス 正規表現—— 終わり 私の@マルチ。 foreach my $line (分割 /\n/, $tcl_txt) { $line =~ s/\?//g; $line =~ s/ - -/ --/g; $line =~ s/ \.\.\.//g; $line =~ s/\s{2,}/ /g; $line =~ s/\s+$//; @multi、$ lineプッシュ。 if ($line =~ /^(.*\s)(-\w+)\s(-\w+)(.*)$/) { プッシュ@multi、 "$1$3$2$4"; } } 私の $filter = RlwrapFilter->new; $filter->completion_handler(\&完了); $フィルタ - >実行。 サブコンプリート{ my($input,$prefix,@complete) = @_; $input=~ s/\s+/ /g; #複合式の完成をサポートします。ハッキーで限られた構文サポート。 $input=~s/^[^[]+\[//; $input=~ s/^.*;\s*//; #最後の単語全体がオプションの場合は、オプションを再開できるようにその単語を削除します。 #マッチ。 $input=~ s/(?:\s-\w+)+\s((?:-\w+)?)$/ $1/; 私の $word_cnt = () = $input =~ m/\b\s+/g; if($word_cnt == 0) { @completions = grep /^\Q$input\E/, @tcl_cmds; }その他{ 私の @mmatch = grep /^\Q$input\E/, @multi; @completions = マップ {my @F = 分割 /\s/, $_; $F[$word_cnt]} @mmatch; # rlwrapには、「-」で始まる単語が次のような「機能」を持つようです。 #の前に「-」を付けるとダッシュが削除されます。弱点は # "-"がないオプションが一覧表示されます。 @completions =地図{s/^-// $_} @Completions; } @完了を返します。 }