タグ

ブックマーク / rubikitch.hatenadiary.org (36)

  • all-ext.el:対象行を絞り込んでからまとめて編集するM-x allを超強化!occurと融合&anything・helmと連携 - http://rubikitch.com/に移転しました

    お久しぶりです。 みなさん、M-x allって知ってますか? M-x package-install all でインストールできるのですが、これはM-x occurのように正規表現にマッチする行を表示します。 occurとの違いは表示結果を書き換えれば、該当部分が自動的に書き変わることです。 ユースケースとしては、編集対象行を絞り込んでから、置換やrectangle系コマンドで一気に編集するって感じです。 便利なので以前から重宝しています。 ただ、occurより劣る点としては、対象行の行番号が出ていない点と、M-g M-n (next-error)とM-g M-p (previous-error)で移動できない点です。 (union all occur) occurで絞り込んだはいいけれど、その結果をやっぱり編集したいという場合に改めてM-x allを実行するのは面倒ですね。 そこで、拙作

  • 2009-09-29

    俺はEmacs23になってもいまだにgnuserv/gnuclientを使っている。しかし、なにかのひょうしでgnuservが落ちて「Gnuserv process exited; restart with `M-x gnuserv-start'」と出てきてしまい、落ちたままになっている。そうなると、gnuclientが動かなくなり、とても困ってしまう。 メッセージを表示している関数がgnuserv-sentinelだと判明し、読んでみたところ、「以前は落ちたら自動的に再起動していたが、下手すると無限ループする可能性がある」と書いてあった。 かといって、落ちたまま放置しているといろいろ困るので、せめて「gnuservが落ちているなら立ち上げる」関数を1分毎に動かすことにした。 (defun gnuserv-start-maybe () (interactive) (or gnuserv-p

    2009-09-29
  • 保存時に自動でRuby 1.9のmagic commentをつける〜Ruby 1.8ユーザーも用意を - http://rubikitch.com/に移転しました

    Ruby 1.9で実行するスクリプトに日語を書く場合、スクリプトの文字コードを表すmagic commentは事実上必須となる。しかし、いちいち手で書くのは面倒臭い。Emacsは編集中のバッファの文字コードを知っているんだから、Emacsに書かせればいい。誰かがやってそうな気がするけど、見つからなかったので速攻で書いた。 別の文字コードで保存した場合には、magic commentも追随する。narrowingにも対応している。 Ruby 1.8を使っている人も将来Ruby 1.9に移行することになるので今のうちにやっておくといい。Ruby 1.8ではmagic commentは無視されるだけなのでつけていても問題ない。 (defun ruby-insert-magic-comment-if-needed () "バッファのcoding-systemをもとにmagic commentをつ

    保存時に自動でRuby 1.9のmagic commentをつける〜Ruby 1.8ユーザーも用意を - http://rubikitch.com/に移転しました
    kitokitoki
    kitokitoki 2012/06/01
    マジックコメントの挿入
  • Rubyでwebにアクセスするならhttpclientが手軽 - http://rubikitch.com/に移転しました

    http://d.hatena.ne.jp/willnet/20080626/1214487378 httpclientはopen-uriの手軽さと、Net::HTTPの機能を両立させてる使い勝手のいいライブラリだ。クッキーやkeep-aliveもサポートしている。ただし、Ruby 1.9未対応。Ruby 1.9だとParseDateなんてないぞーってエラーがでてしまう。→最新版でRuby 1.9対応 POSTの場合はpost_contentを使う。串、User-Agent、FromヘッダはHTTPClient.newの引数で。 require 'rubygems' require 'httpclient' require 'kconv' hc = HTTPClient.new query = "ruby" html = hc.get_content("http://www.google.

    Rubyでwebにアクセスするならhttpclientが手軽 - http://rubikitch.com/に移転しました
  • auto-async-byte-compile.elリリース - バイトコンパイル問題の終焉 - http://rubikitch.com/に移転しました

    自動バイトコンパイルを行う auto-async-byte-compile.el をリリースしました。以前のバージョンではRubyが必要でしたが、auto-async-byte-compile.elはEmacs Lispで完結しています。 リンク先のbyte-compileスクリプトも持っておくとコマンドラインからload-pathを気にせずにバイトコンパイルできます。 その発想はなかった! 新しい自動バイトコンパイルでEmacsを高速化する - http://rubikitch.com/に移転しましたより。 Emacs Lispをバイトコンパイルすると動作が高速化するのは常識である。しかし、バイトコンパイルには致命的な欠点があって、Lispファイルの方がバイトコンパイルファイルよりも新しい場合は、古いバイトコンパイルファイルが読み込まれてしまうのだ!!そのため、Lispファイルを更新した

    auto-async-byte-compile.elリリース - バイトコンパイル問題の終焉 - http://rubikitch.com/に移転しました
  • 特定のキーに強制的にコマンドを割り当てる方法 - http://rubikitch.com/に移転しました

    Emacsにて、グローバルなキーマップ(global-map)を変更しても、すべてのバッファで有効にはなりません。 なぜなら、メジャーモードやマイナーモードでのマップがglobal-mapより優先するからです。 しかし、メジャーモードの特定のキー割り当てが気に入らず、自分用のコマンドを適用したいことがあります。 たとえば、僕の場合、C-tにother-window-or-spritというコマンドを割り当てています。そろそろEmacsのウィンドウについて一言いっとくか - http://rubikitch.com/に移転しました 参照。 C-tはdired-modeではimage-dired用のプレフィクスになっていてother-window-or-spritが使えません。 この場合は、キーマップ上書き専用マイナーモードを用意するのが手軽です。 こうすることでoverriding-minor

    特定のキーに強制的にコマンドを割り当てる方法 - http://rubikitch.com/に移転しました
  • 趣味でRubyしててもいいじゃないか - http://rubikitch.com/に移転しました

    http://d.hatena.ne.jp/scinfaxi/20080425/1209108271 趣味RubyPythonPHPPerl なんかをやる 奴の気がしれない。それ、趣味じゃなくて仕事じゃん。給料もでないのに Ruby を書く奴の気 がしれない(作者でさえ、それで生活しているのに)。 Ruby仕事という時代がとうとう来たんだなと実感した。 Rubyはまつもとさんが趣味で作った言語だ。Perlのようなテキスト処理ができて純粋オブジェクト指向なスクリプト言語ってないかな〜って話がきっかけで開発に至った。もともと金儲けは考えていなかったし、細々とやっていこうと思ってたんじゃないかな。まさかここまでブレイクしてRubyで生活できるなんて思ってもみなかった…というのが正直なところだろう。 俺ははるか昔、趣味でC言語やPerlをかじっていた。当時はPerl3だか4

    趣味でRubyしててもいいじゃないか - http://rubikitch.com/に移転しました
  • デバッグの第一歩!Emacs Lisp関数をトレースする方法 - http://rubikitch.com/に移転しました

    Emacs Lispのデバッグをしているとき、特定の関数呼び出しをトレースしたいことがあります。 関数呼び出しのトレースとは、呼び出した関数の引数の値と、返り値をチェックすることです。 もちろん、関数が呼び出されたかどうかもわかります。 トレースの実現にはadvice機能を使っています。 M-x trace-functionでトレースするM-x trace-functionは、特定の関数をトレースします。 このコマンドは、トレース対象関数と出力バッファを聞いてきます。 出力バッファはデフォルトで*trace-output*なので、そのままにしておくのが無難です。 複数の関数をトレースする際に出力がごちゃごちゃになるのが嫌ならば別のバッファ名にしておけばいいです。 その後でトレース対象関数を呼び出したら、トレース結果を表示します。 M-x trace-function-backgroundで

    デバッグの第一歩!Emacs Lisp関数をトレースする方法 - http://rubikitch.com/に移転しました
  • Emacsでマウスを有効活用する方法 - http://rubikitch.com/に移転しました

    Emacs使いというと、どうしてもキーボード操作に偏ってしまい、マウス操作がないがしろにされている気がします。 Emacsでもマウス操作はそこそこできるのです。 マウスを有効に使っていますか? Emacsはインクリメンタルサーチが強力なので、目についた場所へ一瞬でジャンプできます。 しかし、文章を読む場合に目についた単語や範囲についてコマンドを実行する場合はマウスが優勢です。 そこで、マウスにコマンドを割り当てる方法ついて少し解説してみます。 マウスイベントのシンボルマウスイベントは「接頭辞-mouse-番号」という形のシンボルで表されます。 接頭辞はないこともあります。 たとえば、mouse-1は左クリックを、double-mouse-3は右ダブルクリックです。 マウスボタンの番号マウスボタンと番号は以下のような対応になっています。 3以降は環境に依存するかもしれませんが、僕のところでは

    Emacsでマウスを有効活用する方法 - http://rubikitch.com/に移転しました
  • 委譲といえばForwardable - http://rubikitch.com/に移転しました

    method_missingとfind_by_xxx - LukeSilvia’s diary method_missingは多くの場合デバッグが困難になるので乱用厳禁。あくまで最終手段にすべき。DRbのように相手が得体の知れないオブジェクトならばmethod_missingは有効だが、よくわかってるオブジェクト相手には基的にmethod_missingは使用すべきではない。 Userクラスを読んだときに、取り得るメソッドの集合が一目でわからないところが気持ち悪い。 俺ならForwardableで明示的に転送する。 require 'forwardable' class User attr_reader :name,:age,:type,:profile def initialize(args) @name = args[:name] @age = args[:age] @type =

    委譲といえばForwardable - http://rubikitch.com/に移転しました
    kitokitoki
    kitokitoki 2010/10/31
    Forwardable, method_missing
  • aliasによるメソッドの再定義は危険なのでUnboundMethodかextendを使おう - http://rubikitch.com/に移転しました

    Jay Fields' Thoughts: Alternatives for redefining methods メソッドの再定義の技法はいろいろあるが、どれも欠点があるというお話。状況に応じて使い分けるべき。 aliasで再定義 メソッドを再定義するときにこんな感じでaliasで元のメソッドをコピーするのは常套手段だ。 class Gateway def process(document) p "gateway processed document: #{document}" end end class Gateway alias old_process process def process(document) p "do something else" old_process(document) end end Gateway.new.process("hello world")

    aliasによるメソッドの再定義は危険なのでUnboundMethodかextendを使おう - http://rubikitch.com/に移転しました
    kitokitoki
    kitokitoki 2010/10/31
    UnboundMethod
  • 今はinjectよりもtapだよね〜 - http://rubikitch.com/に移転しました

    tapかわいいよtap - http://rubikitch.com/に移転しました 俺も含めたinject厨は、Ruby 1.8.7からtapへ鞍替えしたほうがいいかもしれない。 たとえば、簡単な例題として、1〜6のうちで偶数の二乗を集めるコードを示そう。 (1..6).select{|x| x % 2 == 0}.map{|x| x*x} # => [4, 16, 36] (1..6).inject([]){|a,x| a << x*x if x % 2 == 0; a} # => [4, 16, 36] [].tap{|a| (1..6).each{|x| a << x*x if x % 2 == 0}} # => [4, 16, 36] 一番上がselectとmapを使った関数プログラミング的な方法。短くて明確だけど強いていえば余計なオブジェクトが生成される上、ループが2回になる欠

    今はinjectよりもtapだよね〜 - http://rubikitch.com/に移転しました
  • tapかわいいよtap - http://rubikitch.com/に移転しました

    Ruby 1.9で導入されたObject#tapはRuby 1.8でも1.8.7から使えるようになった。 tapメソッドとは何かというと、自分自身にブロックを作用させて自分自身を返すだけのメソッドだ。つまり副作用専門メソッド。定義はいたって簡単、コレ。 class Object def tap yield(self) self end end たとえば、1〜4の二乗のうち10以上のものを求めたいんだけど、デバッグ時とかで途中経過である1〜4の二乗を表示してほしいなんて場合はこんな感じに。いらなくなったらtapの部分を消せばいい。楽チン。 ary = [1, 2, 3, 4] ary.map{|x| x**2}.tap{|a| p a}.select {|x| x>10 } # => [16] # >> [1, 4, 9, 16] ほかにも、破壊的メソッドを適用した後で自分自身を返す場合にも

    tapかわいいよtap - http://rubikitch.com/に移転しました
  • Object#instance_exec欲しいなあ - http://rubikitch.com/に移転しました

    Ruby 1.8.7にはいろいろなRuby 1.9のメソッドがbackportされてウハウハなんだが、Object#instance_execが含まれなかったのが残念。 ついにEnumerable::Enumeratorまで入ったのになぁ。 Object#instance_execはObject#instance_evalにブロック引数が渡せるやつ。 class Foo def plus(a, b) a+b end end Foo.new.instance_exec(1, 3) {|a,b| plus(a,b) } # => 4 instance_execを実装するにはかなり大変である。 Ruby 1.8.7はRuby 1.9の振りをしているけどRuby 1.9になりきれてない感じ…大人ぶってる思春期の少女みたいだ。 それにしても、instance_execをselfに対して適用するとLi

    Object#instance_exec欲しいなあ - http://rubikitch.com/に移転しました
    kitokitoki
    kitokitoki 2010/10/21
    instance_exec
  • RubyでのDSLの作り方 - http://rubikitch.com/に移転しました

    Jay Fields' Thoughts: Implementing an internal DSL in Ruby RubyでのDSLの作り方をexpectationsというtesting frameworkを例にとって説明している。 やっぱassert_equalってオブジェクト指向っぽくなくてカッコ悪いよねwここはDSLでカッコよく書きたいものだ。 彼の言いたいことを日語で超要約してみる。 まず、どういうふうに書きたいかを決める。こんな感じにしたい。 Expectations do # テストだよというブロック expect :expected do # :expectedが期待される値 :expected # ブロックの評価結果が実際の値 end end これから、これをRubyスクリプトとして実行可能な形式にする。 まず、DSLを読み込んだら(実行したら)、Expectatio

    RubyでのDSLの作り方 - http://rubikitch.com/に移転しました
  • anything.elプログラマ向け最新情報 - http://rubikitch.com/に移転しました

    Emacsを書きました】 anything.elフレームワークは徐々に進化しています。 ユーザーとして使いやすくする一方、より簡単にプログラミングできるように改良しています。 なるべく非互換性を導入しないように特に気をつけています。 初期に作られた情報源も動くはずです。 動かない場合はanything.elのバグの可能性があります。 anything関数とキーワード引数anything関数がキーワード引数を受け付けるようになりました。 これにより、可読性が上がります。 おそらく一番目立つ最新機能でしょう。 もちろん、通常の引数も使えるので、お好きな方をどうぞ。 基キーワードanything関数の通常の引数に対応するキーワードは以下の通りです。 :sources情報源 :input最初の入力パターン :promptプロンプト :resumetのとき、直前のanythingセッションを復

    anything.elプログラマ向け最新情報 - http://rubikitch.com/に移転しました
  • Emacsからgitのブランチを扱うgit-dwim.elをリリース - http://rubikitch.com/に移転しました

    Emacsを書きました】 gitはブランチが強力です。 ブランチは単なるポインタなので、gitではブランチの積極的な利用が推奨されています。 トピックブランチ特に「トピックブランチ」は便利なブランチ利用法です。 作業前に特定の作業用のブランチを切り、無事に実装できたらmasterにマージ(リベース)し、ブランチを削除する方法です。 トピックブランチを切ることで、現在の目標を明確にすることができます。 また、緊急の修正をする場合はあわてずに一旦masterに戻って修正し、再びトピックブランチで作業することができます。 トピックブランチについては http://progit.org/book/ja/ch3-4.html が詳しいです。 トピックブランチを作成するnewtopicとういう名前のトピックブランチを作成するには、以下のコマンドを使います。 $ git checkout -b ne

  • dbskkd-cdbでSKKの巨大辞書を使う - http://rubikitch.com/に移転しました

    dbskkd-cdbは超高速で動くため、ギガヘルツ時代のマシンではSKK-JISYO.Lじゃもったいない。SKK辞書 - SKK辞書Wikiにあるほぼすべての辞書をとってきて、統合してしまいたい。まず、そこにある辞書をダウンロードしまくる。 俺は /r/skk (= ~/skk) にSKKの辞書を置いている。自分用の巨大辞書 SKK-JISYO.my.cdb を作成するためのRakefileを ~/skk/ に置く。辞書はすべて SKK-JISYO.* になっているのが前提だ。 LARGE_DICT = "/usr/share/skk/SKK-JISYO.L" DICTS = FileList["SKK-JISYO.*"] - FileList["SKK-JISYO.my*"] MY_DICT = "SKK-JISYO.my" desc "Create my dictionary" tas

    dbskkd-cdbでSKKの巨大辞書を使う - http://rubikitch.com/に移転しました
  • SKKでひらがなからカタカナ語に変換する - http://rubikitch.com/に移転しました

    SKKでは英語からカタカナ語に変換することができる。たとえば「/onepointadvice」で「ワンポイントアドバイス」と出る。しかし、デフォルトではひらがなからカタカナ語へは変換できない。以前から不満に思っていたのだが、同じ不満を持っている人がいた。 でも、よーく考えたらSKKの辞書からカタカナ語のエントリを抜き出して「わんぽいんとあどばいす /ワンポイントアドバイス/」のようなエントリを作ればいいじゃないかと思い、ちょっとぐぐってみたら、skktoolsの「filter/abbrev-convert.rb」というスクリプトを使えばいいことがわかった。 /usr/share/skktools/filters/abbrev-convert.rb -k /usr/share/skk/SKK-JISYO.L | skkdic-expr2 > SKK-JISYO.hira-kata $ hea

    SKKでひらがなからカタカナ語に変換する - http://rubikitch.com/に移転しました
  • テスト駆動開発支援のtest-case-mode.elを使ってみた - http://rubikitch.com/に移転しました

    今更感はあるが、最近テスト駆動開発支援Emacs Lispのtest-case-mode.elが発表された。 http://nschum.de/src/emacs/test-case-mode/ M-x auto-install-batch test-case-mode でインストール。 こんな感じ。 テスト成功のグリーン、失敗のレッドなどの信号をモードラインに表示させる バッファが変更されたら信号も対応して変わる テストを実行して、失敗したら、その行へM-x next-errorとM-x previous-errorで飛べる assert関数群に色がつく JUnit, CxxTest, CppUnit, Python(PyUnit), Ruby (test/unit)に対応 テストコードを自動判別して、テストコードならばtest-unit-modeを有効にする 設定 以下の.emacsに