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. 아래 스크립트는 .remember tclsh_filter에 저장되어야 합니다 .rlwrap -z tclsh_filter tclshchmod +x tclsh_filter

#!/usr/bin/env 펄
엄격하게 사용하십시오.
사용 경고;
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 배열 exec Join put tcl_wordBreakAfter auto_execok 종료 lappend 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 설정 upvar cd 형식 메모리 소켓 변수 시계 get msgcat 소스 vwait close glob 네임스페이스 분할 동안 연결 전역 개방 문자열 계속 기록 패키지 subst dde ​​http parray switch/;

# 다음은 tcl.tk 웹페이지에서 복사하여 붙여넣은 것입니다.
내 $tcl_txt = <<END;
파일 시간 이름? 시간?
파일 속성 이름
파일 속성 이름? 옵션?
파일 속성 이름? 옵션값 옵션값...?
파일 채널? 모델?
파일 복사? -힘? ? --? 소스 대상
파일 복사? -힘? ? --? 원천? 원천...? 대상 디렉토리
파일을 삭제하시겠습니까? -힘? ? --? 경로 이름? 경로명...?
파일 디렉터리 이름
파일 실행 파일 이름
파일 존재 이름
파일 확장자
파일은 디렉토리 이름입니다
파일은 파일 이름입니다
파일 연결 이름? 이름...?
파일 링크? -링크 종류? 링크 이름? 표적?
파일 lstat 이름 varName
파일 mkdir dir ?dir ...?
파일 시간 이름? 시간?
파일 기본 이름 이름
파일 정규화된 이름
파일 이름
파일 경로 유형 이름
파일을 읽을 수 있는 이름
파일 읽기 링크 이름
파일 이름을 바꾸시겠습니까? -강요된? ? --? 소스 대상
파일 이름을 바꾸시겠습니까? -강요된? ? --? 원천? 원천...? 대상 디렉토리
파일 루트 이름
파일 구분 기호? 이름?
파일 크기 이름
파일 분할 이름
파일 통계 이름 varName
파일 시스템 이름
파일 성
파일 형식 이름
파일 볼륨
쓰기 가능한 파일 이름
문자열 비교? -아니요? ? -길이 정수? 문자열1 문자열2
문자열은 ?-nocase?-길이 int? 문자열 1 문자열 2
첫 번째 문자열 NeedleString haystackString ?startIndex?
문자열 인덱스 문자열 charIndex
문자열은 alnum입니까? -엄격한? ?-failindex 변수 이름? 끈
문자열은 문자입니다.
문자열은 ASCII입니다.
문자열은 부울입니다.
문자열은 제어이다
문자열은 숫자입니다
문자열이 두 배입니다.
문자열이 거짓입니다
문자열은 그래프입니다
문자열은 정수입니다.
낮은 현
문자열이 인쇄됩니다.
문자열은 구두점입니다.
문자열은 공백입니다.
문자열은 참입니다
위의 문자열
문자열은 단어 문자입니다.
문자열은 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;
  }

  @완료를 반환;
}

관련 정보