Hatena::ブログ(Diary)

8tree にっき

2009-03-17

バックアップファイルの拡張子を正しく返すパッチ

設定ファイル .emacs は肥大化しがちなので、設定ごとにファイルを分割して .emacs.d ディレクトリに放り込むことにした。こうすればメンテナンスの効率がいいし、起動時にエラーが走っても *Messsage* バッファでどのファイルを読み込んだ場合か確認できる。

分割した設定ファイル群を読み込むため .emacs で以下のような関数を呼び出すことにしたのだが、これだとバックアップファイル ".el~" も読み込んでしまうことに気づいた。原因は file.el の関数 file-name-extension が ~ のついたファイル名の拡張子を正しく返してくれないことだった。

(defun my-load-directory-files (dir)
  (let ((wd (getenv "PWD"))(file)(filelist (directory-files dir)))
    (cd dir)
    (while filelist
      (setq file (car filelist))
      (if (not (file-directory-p file))
	  (if (equal (file-name-extension file) "el")
	      (load-file file)))
      (setq filelist (cdr filelist)))
    (cd wd)))

実際は file-name-extension が内部で使用している低レベル関数 file-name-sans-versions の使い方に問題があるようだ。この低レベル関数はしっかりとそのへんを考慮した作りで optional 引数を与えることで切り替えができるようなインタフェイスを持っているのにそれを利用していないのが実にもったいない。(^-^;

ということで、file-name-extension の改善版パッチを作ってみた。今まで関数を使っている人が困らないよう旧版とのインタフェイスを生かしつつ、低レベル関数 file-name-sans-version に渡せるよう optional で引数をひとつ追加している。

[PATCH] Suggestion about a minor change of `file-name-extension' for backup filenames

http://groups.google.com/group/gnu.emacs.sources/browse_thread/thread/35e5f739be7ef108#

$ cat file-name-extension.patch 
--- files.el.orig	2009-03-03 10:58:07.000000000 +0900
+++ files.el	2009-03-17 18:19:19.000000000 +0900
@@ -3682,7 +3682,7 @@ except that a leading `.', if any, doesn
 	    (substring file 0 (match-beginning 0)))
 	filename))))
 
-(defun file-name-extension (filename &optional period)
+(defun file-name-extension (filename &optional period backup-version)
   "Return FILENAME's final \"extension\".
 The extension, in a file name, is the part that follows the last `.',
 excluding version numbers and backup suffixes,
@@ -3694,7 +3694,7 @@ If PERIOD is non-nil, then the returned 
 that delimits the extension, and if FILENAME has no extension,
 the value is \"\"."
   (save-match-data
-    (let ((file (file-name-sans-versions (file-name-nondirectory filename))))
+    (let ((file (file-name-sans-versions (file-name-nondirectory filename) (if backup-version t nil))))
       (if (and (string-match "\\.[^.]*\\'" file)
 	       (not (eq 0 (match-beginning 0))))
           (substring file (+ (match-beginning 0) (if period 0 1)))

2008-10-22

GNU GLOBAL 5.7.2 とタグジャンプのパッチ

以前 switch-dir.el を開発していた時に 作った Emacs でタグジャンプしている人がちょびっと幸せになれる(気がする)設定のパッチGNU GLOBAL 5.7.2 に反映されたみたいだ。わーい、うれぴー(古っ)。v(^o^)v

自分が思っていたのとは別の形になってしまったけど、副産物であれ OSS に貢献できてよかった。現在、お仕事上では開発は一段落しているけれど、また次の(現実逃避の)機会にも GNU GLOBAL に対して何か貢献できればいいな。

$ diff -Nurp global-5.7.1/gtags.el global-5.7.2/gtags.el
(...snip...)
+;; [Setting to make 'Gtags select mode' easy to see]
+;;
+;; (setq gtags-select-mode-hook
+;;   '(lambda ()
+;;      (setq hl-line-face 'underline)
+;;      (hl-line-mode 1)
+;; ))
(...snip...)

2008-07-09

switch-dir.el 0.9.1 リリース

switch-dir.el 0.9.1 を gnu-emacs-sources ML に投げてみた。


switch-dir.el (v0.9.1) - switching directory easily and interactively

http://lists.gnu.org/archive/html/gnu-emacs-sources/2008-07/msg00002.html


shigio さん、パッチじゃなく汎用マイナーモードとして作成するようにとのご提案ありがとうございました。なんとかやりとげました。

id:rubikitch さん、早速のコメントありがとうございます。精進します。anything.el で同様のことができたとは…。(T_T)> これはこれで開発していきたいと思います。

2008-07-08

Emacs でタグジャンプしている人がちょびっと幸せになれる(気がする)設定のパッチ

.emacs に書いておくべき設定だと思うが、いちおう gtags/cscope の ML にお知らせ済み。(^_^;

global

Re: [PATCH] Enhancement: Switch gtags-rootdir easily and interactively

http://lists.gnu.org/archive/html/bug-global/2008-07/msg00010.html

ctags

[Cscope-devel] [PATCH] Enhancement: Show and select easily in `cscope-list-entry-mode'.

http://sourceforge.net/mailarchive/forum.php?thread_name=48719EEB.7010705%40miraclelinux.com&forum_name=cscope-devel

2008-07-07

ディレクトリ楽々切り替えマイナーモード "switch-dir.el"

初版を書いた。インタフェイスを改良したので、より簡単に使えるようになったと思う。

Re: [PATCH] Enhancement: Switch gtags-rootdir easily and interactively

http://lists.gnu.org/archive/html/bug-global/2008-07/msg00005.html

(↑)untabify 忘れてインデントがめちゃくちゃになってて悲しい...。(T_T 

Emacs Lisp リファレンスマニュアルはもちろん、transient-mark-mode, hl-line-mode, gtags-mode, gtags-select-mode, what-line, which-function-mode などが参考になった。特に gtags-mode/gtags-select-mode のマイナー/メジャーモードの切り分けの設計は参考になった。

残りの ToDo(H=高, M=中, L=低)はこんなところかな。

  • - H shigio さんに指摘された line-number-at-pos の取扱い(22.x -> 21.x へバックポートする?)
  • - H dir-alist を $HOME/.emacs に引越しさせる。dir-alist が nil の時にメッセージ云々とか必要かも。
  • - M hook 系の整備。
  • - L ウィンドウ、C-g でキャンセル時の細かなエラーハンドリング。
  • - L メジャーモード、マイナーモードのお作法を確認。
  • - L defcustom 系の整備。
  • - L モードラインに現在選択していている dir-alist の car がくるようにする。

f:id:kyagi:20080707003639p:image

gnu-emacs-source に投げる日は近い(気がする)。