Font
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]4625[/thread]

Autovervollständigung bei Pfadeingaben: (wie in der Shell von Linux [bash,...])



<< >> 3 entries, 1 page
Crian
 2003-08-09 01:41
#46294 #46294
User since
2003-08-04
5826 articles
ModeratorIn
[Homepage]
user image
Im alten Forum stellte Math55 folgende Frage:

Quote
Math55 (08 Aug, 2003 16:03):
alles klar. ich möchte praktisch eine autocompletion in einem entry widget machen. so wie bei del unix konsole. ich geben ein:

/v

und er macht mir draus:

/var oder so ähnlich.

ich wollte es nun so machen:

Code: (dl )
$input=$eingabefeld->get;


in input steht dann sowas wie /v.  nun möchte ich der konsole eben dieses /v übergeben und dann einen tab hinterherschicken. so wie als würde ich /v + tab in der konsole eingeben.

wie geht das?

DANKE:-)



Ich hab eine Weile darüber nachgedacht und nun ein kleines Programm geschrieben, das diese Autovervollständigung vornimmt. Falls nun die anderen Daten bald verloren gehen sollten, poste ich das auch mal hier, zumal ich noch ein kleines Problem hab, siehe mein Zitat:

Quote
Crian (08 Aug, 2003 23:37):
So, ich hab mal ein entsprechendes Programm geschrieben:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/usr/bin/perl
use diagnostics;
use strict;
use warnings;

use Tk;

my $mw = new MainWindow;
$mw->title('Button mit geteiltem Text?');


my $e = $mw->Entry(-text    => '',
                  -width   => 80,
                 )
           ->pack(
                  -expand  => 1,
                  -fill    => 'x',
                 );

$mw->bind ('<Tab>', \&vervollstaendige );


$e->focus();
MainLoop();

sub vervollstaendige {
   my $text = $e->get();
   print $text, "\n";
   my @treffer;

   my ($pfad, $trenner, $anf) = $text =~ m~^(.*)([/\\])([^/\\]*)$~;
   print "pfad='$pfad', Anfang='$anf'\n";

   if (! -d $pfad) {
       print "'$pfad' ist kein Verzeichnis, Abbruch\n";
   }
   else {
       opendir PFAD, "$pfad/" or die "Kann Verzeichnis '$pfad' nicht öffnen: $!";
       my @verzeichnisse = grep -d "$pfad/$_", readdir PFAD;
       closedir PFAD;

       for my $v (@verzeichnisse) {
           print "Verzeichnis '$v'\n";
           if ($v =~ /^\Q$anf/i) { # bei Linux/Unix das i entfernen!
               print "Anfang '$anf' passt auf '$v'\n";
               push @treffer, $v;
           }
       }
   }

   if (scalar(@treffer) == 1) {
       $e->delete(0, 'end');
       $e->insert('end', "$pfad$trenner$treffer[0]");
       $e->selectionClear();
       $e->icursor('end');
   }
   else {
       $e->delete(0, 'end');
       $e->insert('end', "$pfad$trenner$anf");
       $e->selectionClear();
       $e->icursor('end');
   }
} # sub vervollstaendige


Das einzige Problem ist, dass beim Tab-drücken alles selektiert wird, und ich das auch nicht wegbekomme durch Selektion löschen, ganzen Text löschen, neuen Text einfügen... sieht jemand einen Fehler dabei oder weiß einen anderen Rat?

Ansonsten tuts das aber schon, mann muss halt immer tab und dann end drücken, um die Selektion los zu werden.
\n\n

<!--EDIT|Crian|1060378924-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Math55
 2003-08-19 20:09
#46295 #46295
User since
2003-08-19
44 articles
BenutzerIn
[default_avatar]
ich glaub, das ist doch recht kompliziert...:-(...hab jetzt eine ähnliche variante genommen, wie deine!
danke nochmals!

gruß
Crian
 2003-08-20 12:52
#46296 #46296
User since
2003-08-04
5826 articles
ModeratorIn
[Homepage]
user image
Ich hab das Problem behoben, jetzt kann man einfach weitertippen nach der Autovervollständigung:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/usr/bin/perl
use diagnostics;
use strict;
use warnings;

use Tk;

my $mw = new MainWindow;
$mw->title('Button mit geteiltem Text?');


my $e = $mw->Entry(-text    => '',
                   -width   => 80,
                  )
            ->pack(
                   -expand  => 1,
                   -fill    => 'x',
                  );

$mw->bind ('<Tab>', \&vervollstaendige );


$e->focus();
MainLoop();

sub vervollstaendige {
    my $text = $e->get();
    print $text, "\n";
    my @treffer;

    my ($pfad, $trenner, $anf) = $text =~ m~^(.*)([/\\])([^/\\]*)$~;
    print "pfad='$pfad', Anfang='$anf'\n";

    if (! -d $pfad) {
        print "'$pfad' ist kein Verzeichnis, Abbruch\n";
    }
    else {
        opendir PFAD, "$pfad/"
            or die "Kann Verzeichnis '$pfad' nicht öffnen: $!";
        my @verzeichnisse = grep -d "$pfad/$_", readdir PFAD;
        closedir PFAD;

        for my $v (@verzeichnisse) {
            print "Verzeichnis '$v'\n";
            if ($v =~ /^\Q$anf/i) { # bei Linux/Unix das i entfernen!
                print "Anfang '$anf' passt auf '$v'\n";
                push @treffer, $v;
            }
        }
    }

    $e->delete(0, 'end');

    if (scalar(@treffer) == 1) {
        $e->insert('end', "$pfad$trenner$treffer[0]");
    }
    else {
        $e->insert('end', "$pfad$trenner$anf");
    }

    $e->selectionClear();
    $e->icursor('end');

    $e->configure(state => 'disable');
    $e->configure(state => 'enable');
    $e->focus();
} # sub vervollstaendige
\n\n

<!--EDIT|Crian|1061369714-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< >> 3 entries, 1 page



View all threads created 2003-08-09 01:41.