Hi,
den Perl/Tk-Editor "ptked", den wohl fast jeder unter "/usr/bin" liegen hat, hab' ich mal so verändert,
daß der Code besser lesbar ist und er auch besser, das heißt schon fast richtig gut benutzbar ist (ich hatte keine Lust, bei schlankem WM (WindowMaker) extra "kate" oder "gedit" zu starten, wenn ich etwas in Webseiten posten, bzw. einfügen wollte (ich benutze sonst den Konsolen-vim)).
Schrift ist jetzt "SuSE Sans 16" (best viewed in 1024x768).
"STRG + a" ist jetzt "select all",
"STRG + s" "save text" und
"STRG + q" "sofort beenden".
Was diese "IO::"-Module (aus dem Originalcode) machen, weiß ich aber nicht so recht. Weiß das jemand ?
Edit: Funktion "saveIt()" hinzugefügt für schnelleres Speichern mit "STRG+s".
Vielleicht bau ich noch 'ne Statusbar. Mal sehen ...
Viele Grüße
den Perl/Tk-Editor "ptked", den wohl fast jeder unter "/usr/bin" liegen hat, hab' ich mal so verändert,
daß der Code besser lesbar ist und er auch besser, das heißt schon fast richtig gut benutzbar ist (ich hatte keine Lust, bei schlankem WM (WindowMaker) extra "kate" oder "gedit" zu starten, wenn ich etwas in Webseiten posten, bzw. einfügen wollte (ich benutze sonst den Konsolen-vim)).
Schrift ist jetzt "SuSE Sans 16" (best viewed in 1024x768).
"STRG + a" ist jetzt "select all",
"STRG + s" "save text" und
"STRG + q" "sofort beenden".
Was diese "IO::"-Module (aus dem Originalcode) machen, weiß ich aber nicht so recht. Weiß das jemand ?
Code:
#!/usr/bin/perl -w
# tkedit.pl
if($#ARGV == -1)
{
$ARGV[0] = "Newfile.txt";
}
use strict;
# use IO::Handle;
# use IO::Seekable;
# use IO::File;
# use IO::Pipe;
# use IO::Dir;
# use IO;
use Socket;
use IO::Socket;
use Cwd;
use vars qw($VERSION $portfile);
$VERSION = '3.5';
my %opt;
INIT
{
my $home = $ENV{'HOME'} || $ENV{'HOMEDRIVE'}.$ENV{'HOMEPATH'};
$portfile = "$home/.ptkedsn";
my $port = $ENV{'PTKEDPORT'};
return if $^C;
getopts("s",\%opt);
unless (defined $port)
{
if (open(SN,"$portfile"))
{
$port = <SN>;
close(SN);
}
}
if (defined $port)
{
my $sock = IO::Socket::INET->new(PeerAddr => 'localhost',
PeerPort => $port, Proto => 'tcp');
if ($sock)
{
binmode($sock);
$sock->autoflush;
foreach my $file (@ARGV)
{
unless (print $sock "$file\n")
{
die "Cannot print $file to socket:$!";
}
print "Requested '$file'\n";
}
$sock->close || die "Cannot close socket:$!";
exit(0);
}
else
{
warn "Cannot connect to server on $port:$!";
}
}
}
use Tk;
use Tk::DropSite qw(XDND KDE Sun);
use Tk::DragDrop qw(XDND KDE Sun);
use Tk::widgets qw(TextUndo Scrollbar Menu);
use Getopt::Std;
# use Tk::ErrorDialog;
my $top = MainWindow->new();
if ($opt{'s'})
{
my $sock = IO::Socket::INET->new(Listen => 5, Proto => 'tcp');
die "Cannot open listen socket:$!" unless defined $sock;
binmode($sock);
my $port = $sock->sockport;
$ENV{'PTKEDPORT'} = $port;
open(SN,">$portfile") || die "Cannot open $portfile:$!";
print SN $port;
close(SN);
print "Accepting connections on $port\n";
$top->fileevent($sock,'readable',
sub
{
print "accepting $sock\n";
my $client = $sock->accept;
if (defined $client)
{
binmode($client);
print "Connection $client\n";
$top->fileevent($client,'readable',[\&EditRequest,$client]);
}
});
}
Tk::Event::HandleSignals();
$SIG{'INT'} = sub { $top->WmDeleteWindow };
$top->iconify;
# $top->fontCreate('ptked',
# -family => 'courier',
# -size => 16,
# -weight => 'normal',
# -slant => 'roman');
# $top->optionAdd('*TextUndo.Font' => 'ptked');
$top->optionAdd("*font", "{Suse Sans} 16 {normal}");
$top->optionAdd('*TextUndo.Background' => '#fff5e1');
$top->optionAdd("*tearOff", "false");
$top->geometry("+48+87");
foreach my $file (@ARGV)
{
Create_Edit($file);
}
sub EditRequest
{
my ($client) = @_;
local $_;
while (<$client>)
{
chomp($_);
print "'$_'\n",
Create_Edit($_);
}
warn "Odd $!" unless eof($client);
$top->fileevent($client,'readable','');
print "Close $client\n";
$client->close;
}
MainLoop;
unlink("$portfile");
exit(0);
sub Create_Edit
{
my $path = shift;
my $ed = $top->Toplevel(-title => $path);
$ed->withdraw;
$ed->geometry("+64+99");
$top->{'Edits'}++;
$ed->OnDestroy([\&RemoveEdit, $top]);
my $t = $ed->Scrolled('TextUndo',
-wrap => 'word',
-scrollbars => 'osre');
$t->pack(-expand => 1, -fill => 'both');
$t = $t->Subwidget('textundo');
my $menu = $t->menu;
$menu->cascade(-label => '~Help',
-menuitems => [[Button => '~About...',
-command => [\&About,$ed]],]);
$ed->configure(-menu => $menu);
my $dd = $t->DragDrop(-event => '<Meta-B1-Motion>');
$t->bind(ref($t),'<Meta-B1-Motion>',\&Ouch);
$t->bind(ref($t),'<Meta-ButtonPress>',\&Ouch);
$t->bind(ref($t),'<Meta-ButtonRelease>',\&Ouch);
$dd->configure(-startcommand => sub { return 1 unless (eval { $t->tagNextrange(sel => '1.0','end')}); $dd->configure(-text => $t->get('sel.first','sel.last')); });
$t->DropSite(-motioncommand => sub { my ($x,$y) = @_; $t->markSet(insert => "\@$x,$y"); }, -dropcommand => [\&HandleDrop,$t],);
$ed->protocol('WM_DELETE_WINDOW', [ConfirmExit => $t]);
$t->bind('<F3>',\&DoFind);
# There you go:
$t->bind(ref($t),'<Control-q>', sub { $t -> ConfirmExit() } );
$t->bind(ref($t),'<Control-a>', sub { $t -> selectAll() });
$t->bind(ref($t),'<Control-s>', sub { &saveIt($t, $path) });
$ed->idletasks;
if (-e $path)
{
$t->Load($path);
}
else
{
$t->FileName($path);
}
$ed->deiconify;
$t->update;
$t->focus;
}
sub saveIt
{
my $t = shift;
my $file = shift;
my $text = $t -> get("1.0", "end");
my @path = split("/", $file);
$file = getcwd()."/".pop(@path);
open(OUT, ">".$file) or die "Error opening file.";
print OUT $text;
close(OUT);
$t -> ResetUndo();
}
sub Ouch
{
warn join(',','Ouch',@_);
}
sub RemoveEdit
{
my $top = shift;
if (--$top->{'Edits'} == 0)
{
$top->destroy unless $opt{'s'};
}
}
sub HandleDrop
{
my ($t,$seln,$x,$y) = @_;
# warn join(',',Drop => @_);
my $string;
Tk::catch { $string = $t->SelectionGet(-selection => $seln,'FILE_NAME') };
if ($@)
{
Tk::catch { $string = $t->SelectionGet(-selection => $seln) };
if ($@)
{
my @targets = $t->SelectionGet(-selection => $seln, 'TARGETS');
$t->messageBox(-text => "Targets : ".join(' ',@targets));
}
else
{
$t->markSet(insert => "\@$x,$y");
$t->insert(insert => $string);
}
}
else
{
Create_Edit($string);
}
}
my $str;
sub DoFind
{
my $t = shift;
$str = shift if (@_);
my $posn = $t->index('insert+1c');
$t->tag('remove','sel','1.0','end');
local $_;
while ($t->compare($posn,'<','end'))
{
my ($line,$col) = split(/\./,$posn);
$_ = $t->get("$line.0","$posn lineend");
pos($_) = $col;
if (/\G(.*)$str/g)
{
$col += length($1);
$posn = "$line.$col";
$t->SetCursor($posn);
$t->tag('add','sel',$posn,"$line.".pos($_));
$t->focus;
return;
}
$posn = $t->index("$posn lineend + 1c");
}
}
sub AskFind
{
my ($t) = @_;
unless (exists $t->{'AskFind'})
{
my $d = $t->{'AskFind'} = $t->Toplevel(-popover => 'cursor',
-popanchor => 'nw');
$d->title('Find...');
$d->withdraw;
$d->transient($t->toplevel);
my $e = $d->Entry->pack;
$e->bind('<Return>', sub { $d->withdraw; DoFind($t,$e->get); });
$d->protocol(WM_DELETE_WINDOW =>[withdraw => $d]);
}
$t->{'AskFind'}->Popup;
$t->update;
$t->{'AskFind'}->focusNext;
}
sub About
{
my $mw = shift;
$mw->Dialog(-text => <<"END", -popover => $mw)->Show;
tkedit.pl version $VERSION
Based on ptked (Part of perl-tk...rpm) by Nick Ing-Simmons, 2000.
Modified by abgdf at gmx.net in 2008.
END
}
__END__
=head1 NAME
tkedit.pl - an editor in Perl/Tk
=head1 SYNOPSIS
S< >B<tkedit.pl> [I<file-to-edit>]
=head1 DESCRIPTION
B<tkedit.pl> is a simple text editor based on perl/Tk's TextUndo widget.
=cut
Vielleicht bau ich noch 'ne Statusbar. Mal sehen ...
Viele Grüße