Thread Term::Choose Hotkeys? (3 answers)
Opened by payx at 2022-04-17 19:22

payx
 2022-04-17 19:22
#194322 #194322
User since
2006-05-04
561 articles
BenutzerIn

user image
Hallo allerseits,
hallo Kürbis (ich nutze erfreut aus, dass Du hier mitliest),

ich habe mir mit CPAN:Term::Choose einen universellen Launcher gebaut, der sehr praktisch sein kann, wenn man eine Arbeitsumgebung (oder mehrere) mit vielen Einzeltools und Dateien hat:
more (10.8kb):
Code (perl): (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
#!/usr/bin/perl

use strict;
use warnings;

use 5.010;

use YAML qw( LoadFile );
use Term::Choose qw( choose );

binmode(STDOUT, ":encoding(utf8)");
system('chcp 65001 > nul') if ($^O eq 'MSWin32');

my $configF = (shift @ARGV or "launcher_config.yml");

my $config = LoadFile($configF) or die "Can't load config file '$configF'!";

$config->{term_choose_options}->{index} = 1;
$config->{reset_shell} //= ($^O eq 'MSWin32' ? 'cls' : 'clear');

go($config->{main}) while 1;

#####################################################################
sub go {
    my $aR = shift;
    my $items = [ map { ($config->{item_prefix}//'') . [%{$_}]->[0] . ($config->{item_suffix}//'') } @{$aR} ];
    my $choice = choose(
        $items 
        , $config->{term_choose_options}
    );
    my $command = [%{$aR->[$choice]}]->[1];
    if (ref $command eq 'ARRAY') {
        $aR = $command;
    } elsif (not $command) {
        return;
    } elsif ($command eq 'exit') {
        exit;
    } else {
        system($command);
        system($config->{reset_shell});
    }
    go($aR)
}

Das Config-File (launcher_config.yml), das alle Inhalte enthält:
more (2.7kb):
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
# YAML!
# Here, the appearance of the menue is defined.
# See https://metacpan.org/pod/Term::Choose#OPTIONS for more options
term_choose_options:
# Text to be prompted above the menue items
'prompt': "Bitte mit Pfeiltasten wählen, dann Enter drücken:\n"
# Allow selection of menu items by mouse click (1) or not (0)
'mouse': 1
# How to display the items: floating (0), several columns (1), only one column (2)
'layout': 2
# Alignment: left (0), right (1), centered (2)
'alignment': 2

# Items can be surrounded by some characters defined here
item_prefix: ' ► '
item_suffix: ' ◄ '

# Command or tool which resets the shell after execution of a command
# Defaults to 'cls' on MS Windows or 'clear' on other systems
#reset_shell: 'config\WindowsConsoleSettings.cmd'

# ----------------------------------------------------------------------
# The content of the menue (- caption: command)
# Items can be arbitrarily nested.
main:
- 'Anleitungen öffnen': 'start Anleitungen.odt'
- 'Keepass öffnen': 'KeePass.bat'
- 'Newsletter':
- 'Newsletter Template editieren': 'vi templates\newsletter_template.yml'
- 'Newsletter Verteiler bearbeiten': 'start data\newsletter_verteiler.ods'
- 'Newsletter versenden': 'newsletter.bat'
- 'Zurück': ''
- 'Exit': 'exit'
- 'Webmaster':
- 'md Dateien editieren': 'explorer md'
- 'md_2_html': 'cmd /K md_2_html.bat'
- 'Server starten': 'server_start.bat'
- 'Server stoppen': 'server_stop.bat'
- 'FileZilla starten': 'cd "C:\Program Files\FileZilla FTP Client" && start filezilla.exe'
- 'Zurück': ''
- 'Exit': 'exit'

Den Launcher kann man schön mit den Pfeiltasten und mit der Maus bedienen. Was mir nur fehlt, ist eine Möglichkeit, Items per Tastatur direkt auszuwählen, also z.B. k oder 1 (oder 2) einzutippen für den zweiten Eintrag o.ä. Habe ich etwas übersehen, oder geht das mit CPAN:Term::Choose nicht?

Frohe Ostern bei dieser Gelegenheit!

Grüße
payx

View full thread Term::Choose Hotkeys?