i3 키바인딩을 rofi으로 확인하고 실행하기

🗓️ 09 Apr, 2025

i3wm 써서 매일 리눅스 사용.

키보드만 써서 사용하는건 좋은데, 키바인딩이 늘어나서 맨날 i3 키바인딩 까먹음.

그래서 만들어봤다:

  1. 현재 i3 config에 등록된 키바인딩 자동으로 표시 🖥️
  2. rofi에서 선택하면, 그걸 또 실행까지 해줌 🚀

/2025-04apr/i3-bindsyms-rofi-dmenu.png

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/</&lt;/g;
    s/>/&gt;/g;
    s/'"'/&quot;/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으로 처음에 하다가, 그냥 펄로 짜는게 더 가볍고 명확한거 같아서 이렇게 짰음.