rlwrap:tclshマルチワードオートコンプリート

rlwrap:tclshマルチワードオートコンプリート

forを使用してrlwrap複数の単語のオートコンプリートを取得するにはtclsh

例:またはのように表示したいサブコマンドを入力file <space>してからタップします。<tab> <tab>fileexists isdirectoryisfile

完成ファイルに追加(例:空白エスケープ)を試しましたが、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 tclshchmod +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;
  }

  @完了を返します。
}

関連情報