i3wm 써서 매일 리눅스 사용.
키보드만 써서 사용하는건 좋은데, 키바인딩이 늘어나서 맨날 i3 키바인딩
까먹음.
그래서 만들어봤다:
- 현재 i3 config에 등록된 키바인딩 자동으로 표시 🖥️
- rofi에서 선택하면, 그걸 또 실행까지 해줌 🚀

gist: https://gist.github.com/ageldama/377d00159cfe0cb387f20297ca6a5e6b
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
68
69
70
71
72
73
|
#!/usr/bin/env perl
use strict;
use warnings;
use Carp;
use IPC::Open2;
sub escape_html {
$_ = shift;
s/&/&/g;
s/</</g;
s/>/>/g;
s/'"'/"/g;
return $_;
}
my @bindsyms =
grep(/^bindsym/, # only `bindsym`-s.
grep(!/(^#)|(^\s*$)/, # omit comment or empty lines.
qx<i3-msg -t get_config>));
chomp @bindsyms;
map { s/^bindsym //g } @bindsyms;
my @key_to_cmd = map {
my @m = $_ =~ /^(?<key>\S+)\s+(?<cmd>.+)$/;
\@m;
} @bindsyms;
my @dmenu_items = map {
my ($key, $cmd) = ($_->[0], $_->[1]);
$key = escape_html($key);
$key = "<span size='large' weight='heavy'>$key</span>";
$cmd = escape_html($cmd);
$cmd = "\t\t$cmd";
my $result = join "\n", $key, $cmd;
$result .= "\0";
$result;
} @key_to_cmd;
# p @dmenu_items;
my $pid = open2(
my $stdout, my $stdin,
"rofi -dmenu -p 'i3 keybindings' -sep '\\0' -eh 2 -markup-rows -format i"
) or confess;
foreach (@dmenu_items) {
print $stdin $_;
# print $_;
}
close($stdin);
my $stdout_ = do { local($/); <$stdout> };
close($stdout);
waitpid($pid, 0);
my $exit_code = $? >> 8;
# print STDERR "exit_code: $exit_code\n";
if ($exit_code == 0) {
chomp $stdout_;
my $cmd = $key_to_cmd[$stdout_]->[1];
print STDERR "STDOUT: [$stdout_] => [$cmd]\n";
`i3-msg '$cmd'`;
} else {
print STDERR "EXIT: $exit_code\n";
}
|
요걸 저장하고, $HOME/.config/i3/config
에 다음을 추가하여 ⌨️ Super+F1
으로 등록:
bindsym $mod+F1 exec ~/.config/i3/helpers/i3-keys-rofi.pl
…추가 CPAN모듈 의존성 적게 만드는데, shell oneliner으로 처음에
하다가, 그냥 펄로 짜는게 더 가볍고 명확한거 같아서 이렇게 짰음.