カスタムメニューの内容をpecoで選択するためのスクリプトを作成

カスタムメニューの内容をpecoで選択するためのスクリプトを作成

経緯

以前はfluxboxを使用しており、右クリックでメニューが出てきました。そのメニューはファイルを書き換えることでカスタマイズできました。

現在xmonadに移行しており、いくつかのキーにアプリケーションを割り当てています。

割り当てるアプリケーションが多くなると覚えるのが大変なので、カスタマイズできるメニューがないかと探していたのですが見つかりませんでした(探し方が悪いため?)。

そこで自分でスクリプトを書きました。慣れていないので多少時間はかかりました。

内容

Rubyスクリプト

GitHub で公開しています。

#!/usr/bin/env ruby
# coding: utf-8

# peco binary
PECO = File.expand_path "/usr/bin/peco"

# terminal emulator (xterm/urxvt/mlterm)
XTERM = "mlterm"

# menu list
menufile = File.expand_path "~/.mymenu"


require 'tempfile'

class MyMenu
  def initialize(menufile)
    @menufile = menufile
    @appfilepath = Tempfile.new("tmpnew").path
    @hash = Hash.new
  end

  protected

  def set_hash_and_list
    io1 = File.open(@menufile, "r")     # filelist
    io2 = File.open(@appfilepath, "w")  # list of application name

    io1.each {|line|
      line.strip!
      line.chomp!
      next if line == "" || (/^#/ =~ line)

      rows = line.split(/,/)
      rows[1] = rows[0] if rows[1].nil?
      @hash.store(rows[0], rows[1])
      io2.puts rows[0]
    }
    io1.close
    io2.close
  end

  def exec_peco
    out = Tempfile.new("peco-out")
    err = Tempfile.new("peco-err")
    system "#{XTERM} -e sh -c '#{PECO} #{@appfilepath} > #{out.path} 2> #{err.path}'"

    res = `cat #{out.path}`
    if res != ""
      app = @hash[res.chomp!]
      system("#{app} &")
    end
  end

  public

  def exec_MyMenu
    self.set_hash_and_list
    self.exec_peco
  end
end


mymenu = MyMenu.new(menufile)
mymenu.exec_MyMenu

このスクリプトの後半はるびきち様が公開している peco を参考にさせて頂きました。というよりもそのまま使用させて頂きました。

設定

mymenu.rb

XTERM に使用したいターミナルエミュレーターを指定します。

  • xterm/urxvt/mlterm であれば大丈夫でした。
  • gnome-terminal/lxterminal は失敗しました。

~/.mymenu

~/.mymenu を作成し、以下のように記載します。 このファイルが存在しないとエラーが出ます。

FD, gnome-terminal -e fd
R, lxterminal -e R
leafpad

メニューに表示したい内容と実行するコマンドをカンマで区切って記載するだけです。

  • カンマの左側に記載した内容がメニューに表示されます。
  • カンマの右側に記載した内容が実行されます。
    • 省略した場合には左側の内容がそのままコマンドとして実行されます。
    • ターミナルで実行したい場合には “(使用したいターミナル) -e (実行したいコマンド)” のように記載します。

使用法

mymenu.rbを好きなキーに割り当てます。

あとは好きなように絞り込みをするだけです。

Hit-a-Hint の設定をしておけば、「@」を押した後に候補の左端に表示されている文字を打ち込むことで即座に選択できるようになります。

Toshiaki Ara