top  Index  Search  Changes  RSS  Login

howm wiki - SortByHand Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

味見のためのやっつけ試作. cf. [[2ch2:594]]

* 参考: [[簑系|URL:http://www.h5.dion.ne.jp/~syo/_soft.htm]]|http://www.h5.dion.ne.jp/~syo/_soft.htm]]

作ってから思ったけど, こういうのは outline-mode の仕事ちゃいます? ^^;
(outline-mode なら, 並べかえの単位(章・節・項)も自在に変えられる).
あー, でも, [[queue|URL:http://cake.dyndns.org/queue/]][[queue|http://cake.dyndns.org/queue/]]
みたいな使い方もあるか?

----

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; 手動並べかえ

;; howm-test050320 でテスト

;; * 並べかえ
;;   * 一覧で P・N → その項目を上・下へ入れかえ
;;   * M-p・M-n → 先頭・末尾へ飛ばす
;; * 順序保存
;;   * 手順
;;     * M-x howm-arrange-open hoge → hoge の検索結果を一覧
;;     * 上のコマンドで並べかえ
;;     * M-x howm-arrange-save → 順序を ~/.howm-arrange に保存
;;     * 次に M-x howm-arrange-open hoge したら, 保存した順序を復元
;;   * バグ・制限
;;     * howm-arrange-open した場合しか順序保存は効かない.
;;     * 順序の記録はファイル単位. 同じファイル内で複数ヒットしても一緒くた.
;;     * 検索がヒットしなかったら誤動作するかも.

(let ((m howm-view-summary-mode-map))
   (define-key m "P" 'howm-view-summary-arrange-up)
   (define-key m "N" 'howm-view-summary-arrange-down)
   (define-key m "\M-p" 'howm-view-summary-arrange-top)
   (define-key m "\M-n" 'howm-view-summary-arrange-bottom)
   )

(defun howm-view-summary-arrange-up ()
   (interactive)
   (howm-view-summary-arrange-swap (lambda (i) (- i 1))))
(defun howm-view-summary-arrange-down ()
   (interactive)
   (howm-view-summary-arrange-swap (lambda (i) (+ i 1))))
(defun howm-view-summary-arrange-top ()
   (interactive)
   (howm-view-summary-arrange-top/bottom))
(defun howm-view-summary-arrange-bottom ()
   (interactive)
   (howm-view-summary-arrange-top/bottom t))

(defun howm-view-summary-arrange-swap (f &optional mark)
   (let* ((i (- (howm-view-line-number) 1))
          (you (funcall f i)))
     (when (or (< you 0)
               (not (< you (length (howm-view-item-list)))))
       (error "Out of range"))
     (howm-view-summary (howm-view-name)
                        (howm-swap-in-sequence (howm-view-item-list)
                                               i you))
     (forward-line you)))

(defun howm-view-summary-arrange-top/bottom (&optional bottom)
   (let* ((item-list (howm-view-item-list))
          (i (- (howm-view-line-number) 1))
          (xi (nth i item-list))
          (rest (append (subseq item-list 0 i)
                        (subseq item-list (+ i 1)))))
     (howm-view-summary (howm-view-name)
                        (if bottom
                            (append rest (list xi))
                          (cons xi rest)))
     (forward-line i)
     (push-mark)
     (goto-char (if bottom (point-max) (point-min)))
     (beginning-of-line)))

(defun howm-swap-in-sequence (seq m n)
   (let ((ans (copy-sequence seq))
         (xm (elt seq m))
         (xn (elt seq n)))
     (setf (nth m ans) xn)
     (setf (nth n ans) xm)
     ans))

(defvar howm-arrange-file "~/.howm-arrange")
(defvar howm-arrange-key nil)
(make-variable-buffer-local #'howm-arrange-key)

(defun howm-load (file)
   (setq file (expand-file-name file))
   (and (file-exists-p file)
        (with-temp-buffer
          (insert-file-contents file)
          (read (current-buffer)))))
(defun howm-save (expr file)
   (setq file (expand-file-name file))
   (with-current-buffer (find-file-noselect file t)
     (setq buffer-read-only nil)
     (erase-buffer)
     (insert (format "%S" expr))
     (basic-save-buffer)))

(defun howm-arrange-open (keyword)
   (interactive "sKeyword: ")
   (howm-search keyword t)
   (setq howm-arrange-key keyword) ;; BUG! dangerous when no match
   (let ((order (cdr (assoc keyword (howm-load howm-arrange-file)))))
     (howm-view-sort-general (lambda (item)
                               (or (position (howm-item-name item) order
                                             :test #'equal)
                                   -1))
                             #'<)))

(defun howm-arrange-save ()
   (interactive)
   (let ((names (remove-duplicates (mapcar #'howm-item-name
                                           (howm-view-item-list))))
         (mem (howm-load howm-arrange-file)))
     (let ((pair (assoc howm-arrange-key mem)))
       (if pair
           (setcdr pair names)
         (setq mem (cons (cons howm-arrange-key names) mem))))
     (howm-save mem howm-arrange-file)))

----
{{comment}}
----