top  Index  Search  Changes  RSS  Login

HowmGrep

高林哲さん が作成した clgrep を howm 用に改良したもの。Rubyで作成。clgrepに対抗してhgrep。

使うためには、ソースの中にある HOWM_DIR という変数(定数)を自分の環境にあわせて書き換えるだけ。オプションに関しては help を見ればわかるようになってます。不要なオプションは取り除きやすいようにしてるので、これまた自分の環境にあわせてソースをいじってください。

利用方法

% hgrep キーワード

これでOKです。そうすると、そのキーワードを含んだメモが表示されます。

これのおいしい使いかたとしては、コマンドラインから予定一覧を表示したり出来ること。

prest:~% alias yotei 'hgrep ]@ | grep ]@ | sort'
prest:~% yotei
[2004-02-13]@ バドミントン&飲み 15:00
[2004-02-17]@ 卒業論文発表会
[2004-02-21]@ ローカルコンテスト 
[2004-02-24]@ 出かける
[2004-03-08]@ 旅行+5
[2004-03-25]@ 卒業式

上のように設定すれば、予定を日付順に一覧表示できる。締切なども同じ原理で。

…と思ったけど、普通に

% grep -h ]@ ~/howm/*/*/*.howm | sort

とやればいいだけのことと判明。そのうちおいしい使いかたは消すかも。普通の検索ツールとしてお使いください。hoge[2004-02-08]@ hoge などのエントリがある場合は、

% grep -h ]@ ~/howm/*/*/*.howm | sed 's/.*\[/\[/' | sort

今日以降を出したい場合は

% grep -h ]@ ~/howm/*/*/*.howm | sort | 
    ruby -ne 'puts $_ if %Q@[#{Time.now.strftime("%Y-%m-%d")}]@ < $_'

でどうでしょう?見やすさ重視で改行が入ってますので使うときは気をつけてください。alias して頑張れば長さだって恐くない…。実は既存のコマンドで出来る?

ソースはページ末尾にあります。


  • 2004-02-08 (日) 00:21:23 名無しさん : 空のrescue節はよくないかも。なにか意図があるのでしょうか?
  • 2004-02-08 (日) 00:26:50 作った人 : lessに食わすとEPIPEを吐く、Optionが無いとうるさい等です。即席だったもので…。偉い人にお願いしちゃいます。すみませんが、適切に直してください。
  • 2004-02-08 (日) 00:37:30 作った人 : 例外出すようにしました。報告ありがとうございます。あからさまに怪しいところがあったら適当に直しちゃってください。
  • 2004-02-08 (日) 01:32:03 名無しさん : そらのレスキューぶし
  • 2004-02-08 (日) 02:03:13 名無しさん : 最初何を言ってるのかと思った(笑。どんな節なんだろう…。
  • 2004-02-08 (日) 03:10:03 名無しさん : 旬度順の hsort もあるといい?
  • 2004-02-08 (日) 03:11:18 名無しさん : あと、@[2004-02-08]より前の部分は無視してソートするとか
  • 2004-02-08 (日) 09:30:58 作った人 : 旬度順と言うと sort -r ってことでしょうか?その日以降とかは、なるほど、確かに必要ですね。とりあえず今日以降というワンライナーを書いてみました。日付指定は、、、どうましょう。
  • 2004-02-08 (日) 10:46:40 名無しさん : しまった。「前」が double meaning だった。「前の行」って意味と、「その行内でそこより左」って意味と。後者はみなさん困ってないのかな。
  • 2004-02-08 (日) 11:01:31 名無しさん : そういう理由でしたか。参考になります。自分の場合はバグのエラーメッセージまで食われた苦い思い出が^^;.
  • 2004-02-08 (日) 11:05:47 名無しさん : あの書き方はちょっと変かなと思ったものの、まあいいかと(笑)なにわぶしぶしかつおぶしー。 日付は行頭に置くのが一般的だからかもしれません。でも日付ソートはhgrep内でしたほうがよさそうですね。
  • 2004-02-08 (日) 11:17:02 作った人 : 「前」の捉え方が(笑)。なるほど。一応それ用のやつも用意してみました。
  • 2004-02-08 (日) 11:18:41 作った人 : いえいえ、例外のご指摘ありがとうございます。でも、もっとスマートに書けますかね?誰か綺麗に直してください;-(。
  • 2004-02-08 (日) 11:21:23 作った人 : 日付ソートはコマンドの組み合わせより素直にhgrep内でやったほうが確かに嬉しいですね(笑。参考にしたclgrepが内容を検索するものだったので、それをhowm用にしただけでした。こだわって組み合わせで解決しようとしたんですが、todo一覧表示のニーズが結構あるならば、素直にhgrep内でやれるようにしてみようかと思います。うーん、悩み。
(Please LogIn to post comments.)

hgrep

#!/usr/bin/env ruby
#
# 高林哲さんが紹介した ChangeLogメモ で利用される clgrep を参考にしてます
# URL:http://www.namazu.org/~satoru/unimag/1/clgrep

require 'getoptlong'

HOWM_DIR = "/home/takashi/misc/howm"

def show_usage
  puts [
    "usage: hgrep [OPTIONS] <PATTERN> [FILE]...",
    "    -d,  日付を表示する",
    "    -e,  検索文字を強調する",
    "    -h,  このメッセージを表示する",
    "    -i,  大文字・小文字を区別しない",
    "    -r,  検索結果を逆順に表示する",
    "    -s,  検索結果単位を\"---\"で区切る",
    "    -t,  タイトルを強調する"
  ]
end

# コマンドラインオプションを解析してハッシュとして返す
def parse_options
  parser = GetoptLong.new
  parser.set_options(['--day', '-d',         GetoptLong::NO_ARGUMENT],
                     ['--emphasis', '-e',    GetoptLong::NO_ARGUMENT],
                     ['--ignore-case', '-i', GetoptLong::NO_ARGUMENT],
                     ['--help', '-h',        GetoptLong::NO_ARGUMENT],
                     ['--reverse', '-r',     GetoptLong::NO_ARGUMENT],
                     ['--separate', '-s',    GetoptLong::NO_ARGUMENT],
                     ['--title', '-t',       GetoptLong::NO_ARGUMENT])
  options = Hash.new
  parser.each_option { |name, arg| options[name.sub(/^--/, "")] = arg}
  (show_usage; exit(1)) if ARGV.empty? || options['help']
  return options
end

def main
  options = parse_options
  pattern = ARGV.shift
  regexp_option = Regexp::IGNORECASE if options['ignore-case']
  regexp = Regexp.new(pattern, regexp_option)
  results = Array.new 

  # howm のデータファイルを files に突っ込む
  files = Dir.glob(HOWM_DIR + "/**/*.howm")
  files.sort! {|a, b| b <=> a}

  files.each do |file|
    File.open(file){|f| f.read}.split(/^=/).each do |chunk|
      if regexp.match(chunk)
        header = "" 
        # -s ならひとかたまりごとに区切る
        header << "-" * 70 + "\n\n" if options['separate']

        # -d なら日付を挿入する
        header << File.basename(file, ".howm").gsub!(/[_|-]/, '/') + "\n\n" if options['day']
        chunk = header + '=' + chunk

        # -e ならマッチした文字を強調
        chunk.gsub!(regexp,"\e[1m#{regexp.source}\e[0m") if options['emphasis']

        # -t ならタイトルを強調
        chunk.gsub!(/(^=.*?)\n/, "\e[1m" +'\1'+ "\e[0m\n") if options['title']

        results.push(chunk) #マッチしたメモを溜め込む
      end
    end
  end
  
  # -r なら検索結果を逆順にする
  results.reverse! if options['reverse'] 
  puts results
end

begin
  main
rescue => ex
  puts ex.message
end

Last modified:2008/03/09 14:08:36
Keyword(s):
References:[併用ツール]