growl.el


/lang/elisp/emacs-growl/trunk/growl.el –
CodeRepos::Share – Trac

pit.el のついでに growl.el も放流します。

Growl Network Notification Protocol にメッセージを送れるのが特徴です。

Emacs の make-network-process を使用しています。 なお NTEmacs では make-network-process で UDP へ投げられないようなので、その場合は NetCat があればそれを使います。

growlnotify などの外部クライアントを経由して、 Growl へメッセージを送ることもできます。*1

こちらもごジユウに変更くださいませ。

最後に encode-coding-string を教えてくださった Topia 師に感謝します。いつもありがとう :->

*1:実はこちらのが規定の動作になっています

pit.el その後


/lang/elisp/pit/trunk/pit.el –
CodeRepos::Share – Trac

いくつか不具合報告や要望を戴いておりますが、ちかごろ私生活が忙しくなりまして、とても手を付けられそうにないため、 CodeRepos に放流しました。

CodeRepos ですし、コミット前の連絡や相談はまったく必要ありません。ジユウ*1にどうぞ :)

*1:GPLv3 的な意味で

Windows で Cygwin の Git を使うときに

NTEmacs は(当然ながら) Cygwin の file permission を無視してファイルを保存します。

そのため、Cygwin の Git で管理しているファイル群を NTEmacs で変更すると、file mode の変更が頻繁に検出されてしまいます。

そこで、git diff の結果を使用して、必要があれば file mode を元に戻す hook を書いた……のですが、書き終ったあとに

$ git config core.filemode false

だけで良い事がわかりました :(

何となく惜しいので、書いたコードも晒しておきます。後で何かの役に立ちますように……。

(and
 (eq system-type 'windows-nt)
 (executable-find "chmod")
 (add-hook 'after-save-hook
	   (lambda ()
	     (let*
		 ((git-dir (egg-git-dir))
		  (base-dir (and git-dir
				 (string-match "\\(.+\\).git" git-dir)
				 (match-string 1 git-dir)))
		  (file-name (and base-dir
				  (string-match (format "%s\\(.+\\)" base-dir)
						(buffer-file-name))
				  (match-string 1 (buffer-file-name))))
		  (old-mode (and file-name
				 (with-temp-buffer
				   (call-process "git" nil t t "diff" file-name)
				   (goto-char (point-min))
				   (when (re-search-forward "^old mode.+\\([0-9]..\\)$" nil t)
				     (match-string 1))))))

	       (when old-mode
		 (call-process "chmod" nil t t old-mode (buffer-file-name)))))))

extended-riece-keyword-message-filter

Riece 上で、指定した nick から発言があった場合に強調表示する advice.

特定の人のポストをnotifyに出したい

http://wassr.jp/user/kuraku/statuses/hefXosqfhq

riece-keyword-message-filter に渡ってる message ってベクタで、中に発言者情報も含まれているから、それ見てなんかする advice 書けばよいかも

http://wassr.jp/user/elim/statuses/2EPjDvguI0

Wassr でこんな遣り取りがありましたので、ひとまず書いてみました。

(defvar riece-notify-nicks (list "elim"))

(defadvice riece-keyword-message-filter
  (around extended-riece-keyword-message-filter (message))

  (let ((speaker (aref (riece-message-speaker message) 0))
        (message-text (riece-message-text message)))

    (mapcar (lambda (nick)
              (when (string-match nick speaker)

                (put-text-property 0 (length speaker)
                                   'riece-overlay-face
                                   riece-keyword-face
                                   speaker)

                (put-text-property 0 (length message-text)
                                   'riece-overlay-face
                                   riece-keyword-face
                                   message-text)))
            riece-notify-nicks))
  ad-do-it)

(ad-enable-advice 'riece-keyword-message-filter
                  'around
                  'extended-riece-keyword-message-filter)

riece-notify-nicks で指定した nick から発言があると、nick と発言に riece-keyword-face を適用します。

さて九楽さんの意図に沿えているかしら。

pit.el

  • ~/.emacs は全て GitHub の公開リポジトリに入れてある
  • outputz.el の設定ファイルを書いた
  • outputz-key*1を直に書いてあるから git add したくない
  • そうだ Pit 使おう
  • Pit 使うための elisp 見付からない
  • 書くか

というわけで pit.el 書きました。 => Gist

load-path の通っている所へ置いて require してください。

(require 'pit)

使用例一覧

(pit/get 'github.com)
  • 設定されていれば alist が、されていなければ nil が返ります。
(pit/get 'github.com '(require ((user . "Your github user name")
                                (token . "Your github token"))))
  • 設定されていない値が一つでもあれば minibuffer で入力を促します。
  • 既に設定されている値は minibuffer の initial-contents として挿入されます。
  • 入力された値で Pit のファイルを更新します。
  • 更新後の alist を返します。
(pit/set 'github.com)
  • 既に設定されている値が一つでもあれば minibuffer で入力を促します。
  • 既に設定されている値は minibuffer の initial-contents として挿入されます。
  • 入力された値で Pit のファイルを更新します。
  • 更新後の alist を返します。
(pit/set 'github.com '(config ((user . "Your github user name")
                               (token . "Your github token"))))
  • 渡された alist を用いて minibuffer で入力を促します。
  • 既に設定されている値は一切使われません。
  • 入力された値で Pit のファイルを更新します。
  • 更新後の alist を返します。
(pit/set 'github.com '(data ((user . "Your github user name")
                             (token . "Your github token"))))
  • 渡された alist の値で Pit のファイルを更新します。
  • 更新後の alist を返します。

いずれも alist が返ってきますので、assoc と cdr で value が取り出せます。

たとえば outputz-key でしたら...

(setq outputz-key
      (cdr (assoc 'key
                  (pit/get 'outputz.com
                           '(require ((key . "Your Outputz key")))))))

かなり冗長ですね。あまり嬉しくない気がしてきました :(

注意事項

Pit のファイル*2を読み書きします。
  • 念の為バックアップしておく事を強くお薦めします。
pit.rb の key は String ですが、pit.el は symbol です
  • なんとなく alist の key は symbol だという気がしました*3
  • string だと両端囲みが必要ですが、 symbol は左側にシングルクォートを置くだけで済みます :)*4
  • intern を使えば、どちらも受け付けられるかも……今後の課題。
YAML を解釈できているわけではありません。

もの凄く汚いやり方*5で読み込んでいます。

  • 良い子は真似しないでください。
  • エロい人は YAML を解釈して sexp にする elisp を書いてください。
    • そしてそれをぼくにも使わせてください >_

*1:復活の呪文

*2:~/.pit/default.yaml

*3:趣味です

*4:趣味です

*5:replace-regexp を重ねて eval.