2012年2月6日月曜日

siteinit.l

;; NetInstaller
(require "ni/setup")
(ni-autoload)

                                        ; インクリメンタルサーチ (C-s, C-r)
(require "isearch")

                                        ; dynamic abbreviation
(require "dabbrev")
(global-set-key #\M-/ 'dabbrev-expand)

                                        ; write-file
                                        ; バッファーの名前や割り付けられているファイル名も新しく指定
                                        ; されたファイルに変える
(define-key ctl-x-map #\C-w 'emacs-write-file)

                                        ; C-x C-v
                                        ; 廃棄するバッファのファイル名がミニバッファに表示
(setq *find-other-file-requires-file-name* t)

                                        ; sort-lines
(defun sort-lines (start end)
  (interactive "*r")
  (filter-region "sort" start end))

                                        ; ウィンドウを左右に分割
(define-key ctl-x-map #\3 'split-window-vertically)

                                        ; ispell-word
(defun ispell-word()
  (interactive "*")
  (let ((end (progn
               (skip-chars-forward "A-Za-z")
               (point)))
        (beg (progn
               (skip-chars-backward "A-Za-z")
               (point))))
    (ispell-region beg end)))
(global-set-key #\M-$ 'ispell-word)

                                        ; frame
(global-set-key '(#\C-x #\5 #\o) 'other-pseudo-frame)
(global-set-key '(#\C-x #\5 #\0) 'delete-pseudo-frame)
(global-set-key '(#\C-x #\5 #\2) 'new-pseudo-frame)

                                        ; 文字コードの変更
(global-set-key '(#\C-x #\RET #\f) 'change-fileio-encoding)
;;;; emacs風

                                        ; C-x C-v
                                        ; 廃棄するバッファのファイル名がミニバッファに表示
(setq *find-other-file-requires-file-name* t)

                                        ; sort-lines
(defun sort-lines (start end)
  (interactive "*r")
  (filter-region "sort" start end))

                                        ; ウィンドウを左右に分割
(define-key ctl-x-map #\3 'split-window-vertically)

                                        ; ispell-word
(defun ispell-word()
  (interactive "*")
  (let ((end (progn
               (skip-chars-forward "A-Za-z")
               (point)))
        (beg (progn
               (skip-chars-backward "A-Za-z")
               (point))))
    (ispell-region beg end)))
(global-set-key #\M-$ 'ispell-word)

                                        ; frame
(global-set-key '(#\C-x #\5 #\o) 'other-pseudo-frame)
(global-set-key '(#\C-x #\5 #\0) 'delete-pseudo-frame)
(global-set-key '(#\C-x #\5 #\2) 'new-pseudo-frame)

                                        ; 文字コードの変更
(global-set-key '(#\C-x #\RET #\f) 'change-fileio-encoding)


;;; grepの強化
;;; grep 結果からダブルクリックでファイルを開く
;;; http://hie.s64.xrea.com/xyzzy/note/search.html#grep-mouse-left-press
;;; http://hie.s64.xrea.com/xyzzy/note/search.html#grep-mouse-left-press
(defun grep-mouse-left-press ()
  (interactive)
  (let ((click (mod *last-mouse-click-count* 6)))
    (if (= click 2)
        (first-error)
      (mouse-left-press))))

(defvar *grep-map* nil)
(unless *grep-map*
  (setq *grep-map* (make-sparse-keymap))
  (define-key *grep-map* #\LBtnDown 'grep-mouse-left-press))
(add-hook 'ed::*grep-hook* #'(lambda () (use-keymap *grep-map*)))
(add-hook 'ed::*grepd-hook* #'(lambda () (use-keymap *grep-map*)))

(define-key *grep-map* #\RET 'first-error)

;; 操作を便利にするためにキーバインドの類を設定
;; 検索結果一覧(*compilation*バッファ)上の操作:
;; * [↑][↓]で、該当箇所を別ウィンドウに表示
;; * RETまたはダブルクリックで、該当箇所にジャンプ
;; 検索対象バッファ上での操作:
;; * C-M-Up([Ctrl]+[Alt]+[↑])で1つ前のマッチへジャンプ(F11と同じ)
;; * C-M-Down([Ctrl]+[Alt]+[↓])で1つ先のマッチへジャンプ(C-u F11と同じ)
(defun show-previous-error ()
  (interactive)
  (progn (next-line -1)(first-error)(other-window -1)))
(defun show-next-error ()
  (interactive)
  (progn (next-line)(first-error)(other-window -1)))
(define-key *grep-map* #\Up 'show-previous-error)
(define-key *grep-map* #\Down 'show-next-error)

(defun previous-error ()
  (interactive)
  (next-error -1))
(global-set-key #\C-M-^ 'previous-error)
(global-set-key #\C-^ 'next-error)

;;; grepの強化ここまで


;;マウスだけでコピー・ペースト
(defun mouse-right-press ()
  (interactive)
  (mouse-left-press)
  (paste-from-clipboard))
(global-set-key #\LBtnUp 'copy-selection-to-clipboard)
;;(global-set-key #\RBtnUp 'mouse-right-press)
;;(global-set-key #\MBtnUp 'mouse-menu-popup)
;;;;;



                                        ;バックアップ - 外部 lisp は不要
(require "backup")
(setq *hierarchic-backup-directory* t)

                                        ;バックアップを取る場所を指定 in .xyzzy
(setq *backup-directory* "~/backup")

;; XML-MODE
(require "xml/xml-mode")
(use-package 'xml)
(pushnew '("\\.\\(xml\\|arxml\\|mcxml\\|xsl\\|html\\|sdoc\\|fo\\|rng\\|svg\\|xi\\)" . xml-mode) *auto-mode-alist* :test #'equal)
;;  色の変更
(setq *xml-tag-attribute* '(:bold t :foreground 9))
(setq *xml-tag-invalid-attribute* '(:bold t :foreground 1))
(setq *xml-cdata-attribute* '(:foreground 2))

;; リージョンに色をつける
(require "rv-region")
(setq *rv-region-stay-on* t)

;; TreeView
(require "treeview/setup")
;; buf2html
(require "buf2html")
;; OutlineTree
(require "outline-tree/outline-tree")

;; c-mode インデント設定
(setq *c-indent-tabs-mode* t)
(setq c-indent-level 4)
(setq c-continued-statement-offset 4)
(setq c-brace-offset -4)
(setq c-argdecl-indent 4)
(setq c-label-offset -4)
(setq c-brace-imaginary-offset 0)
(add-hook 'ed::*c-mode-hook*
          #'(lambda () (set-tab-columns 4 (selected-buffer))))
                                        ; (setq *c++-tab-always-indent* nil)

;; c++-mode インデント設定
(setq *c++-indent-tabs-mode* t)
(setq c++-indent-level 4)
(setq c++-continued-statement-offset 4)
(setq c++-brace-offset -4)
(setq c++-argdecl-indent 4)
(setq c++-label-offset -4)
(setq c++-brace-imaginary-offset 0)
(add-hook 'ed::*c++-mode-hook*
          #'(lambda () (set-tab-columns 4 (selected-buffer))))
                                        ; (setq *c++-tab-always-indent* nil)



;; コメントアウト
(autoload 'comment-out-region "comment" t nil)
(global-set-key #\M-\; 'comment-out-region)


;;Migemoの正規表現をキャッシュ
(require "migemo")
(defvar *migemo-cache-more-than* 3)
(defvar *migemo-cache-file* "~/etc/migemo.dat")
(in-package "editor")
(let (old-migemo-query cache)
  (add-hook '*post-startup-hook*
            #'(lambda ()
                (when (file-exist-p user::*migemo-cache-file*)
                  (with-open-file (fp user::*migemo-cache-file*)
                                  (let (line)
                                    (while (setf line (read fp nil))
                                      (pushnew line cache
                                               :key 'car
                                               :test 'equal)))))))
  (add-hook '*kill-xyzzy-hook*
            #'(lambda ()
                (with-open-file (s user::*migemo-cache-file*
                                   :direction :output
                                   :if-exists :overwrite
                                   :if-does-not-exist :create)
                                (mapc #'(lambda (x)
                                          (format s "~S~%" x))
                                      cache))))
  (setf (symbol-function 'old-migemo-query)
        (symbol-function 'migemo-query))
  (defun migemo-query (query)
    (setq *isearch-regexp* *migemo-on*)
    (let ((val (assoc query cache :test 'equal)))
      (if val
          (cdr val)
        (let ((regexp (old-migemo-query query)))
          (when (<= (length query) user::*migemo-cache-more-than*)
            (setf cache
                  (acons query regexp cache)))
          regexp))))
  (defun migemo-delete-cache ()
    (interactive)
    (setf cache nil)))
(in-package "user")
(migemo-toggle t)

                                        ;dabbrevでこれ以上の文字数の時にmigemo使う
(defvar *dabbrev-use-migemo-more-than* 4)
(let ((old #'ed::dabbrev-find-expansion)
      (old-all #'ed::dabbrev-find-all-expansion))
  (defun ed::dabbrev-find-all-expansion (abbrev case-fold match-table start matches)
    (and (not (regexpp abbrev))
         (<= *dabbrev-use-migemo-more-than* (length abbrev))
         (setf abbrev (compile-regexp (ed::migemo-query abbrev) t)))
    (funcall old-all abbrev case-fold match-table start matches))
  (defun ed::dabbrev-find-expansion (abbrev count reverse no-dup case-fold match-table)
    (and (not (regexpp abbrev))
         (<= *dabbrev-use-migemo-more-than* (length abbrev))
         (setf abbrev (compile-regexp (ed::migemo-query abbrev) t)))
    (funcall old abbrev count reverse no-dup case-fold match-table)))
;; migemoのバグ対策
(in-package "editor")
(let ((migemo #'migemo-query))
  (defun migemo-query (query)
    (let ((regexp (funcall migemo query)))
      (setf regexp (substitute-string regexp
                                      "\\[\\\\)" "\\\\[\\\\)")
            regexp (substitute-string regexp
                                      "\\[\\\\|" "\\\\[\\\\|")
            regexp (substitute-string regexp
                                      "\\[\\[" "\\\\[\\[")))))
(in-package "user")


;; bat-mode
(in-package "editor")
(export 'bat-mode)
(export 'ini-mode)
(autoload 'bat-mode "bat-mode" t)
(autoload 'ini-mode "ini-mode" t)
(pushnew '("\\.bat$" . bat-mode) *auto-mode-alist* :test 'equal)
(pushnew '("\\.ini$" . ini-mode) *auto-mode-alist* :test 'equal)
(in-package "user")

;; バッファ名をコピー
;; 名前だけ
(defun clipboard-to-buffer-name() (interactive)
  (copy-to-clipboard (buffer-name (selected-buffer))))
(define-key spec-map #\c 'my-buffer-name-copy)
;; フルパス
(defun clipboard-to-buffer-file-name ()
  (interactive)
  (unless (equal (get-buffer-file-name) nil)
    (copy-to-clipboard
     (map-slash-to-backslash (get-buffer-file-name)))))
(define-key spec-map #\n 'my-file-name-copy-backslash)

;; makefile-mode
(require "elisp")
(load-library "make-mode")
(push '("makefile\\|\\.mak$\\|\\.mk$" . elisp::makefile-mode) *auto-mode-alist*)

;; 行末まで削除する
(defun my-kill-line (&optional arg)
  (interactive "*p")
  (cond ((bolp)
         (let ((point (point))
               (lines (cond ((or (null arg)
                                 (<= arg 1))
                             0)
                            (t
                             (- arg 1)))))
           (kill-region point
                        (progn
                          (forward-line lines)
                          (goto-eol)
                          (forward-char)
                          (point)))))
        (t
         (kill-line arg))))
(define-key *global-keymap* #\C-k 'my-kill-line)

;; 括弧をハイライト
(require "paren")
(turn-on-global-paren)

;; emacs風キーバインド
                                        ; key bind
(global-set-key #\C-] 'redo)
(global-set-key #\M-h 'backward-kill-word)
(global-set-key #\C-/ 'undo)
(global-set-key #\M-v 'previous-page)
                                        ;(global-set-key #\M-% 'replace-string)
                                        ;(global-set-key #\C-M-% 'replace-regexp)
(global-set-key #\M-% 'query-replace)
(global-set-key #\C-M-% 'query-replace-regexp)
(global-set-key #\C-M-\\ 'indent-region)
(global-set-key '(#\C-x #\h) 'mark-page)
(global-set-key '(#\C-x #\u) 'undo)
(global-set-key '(#\C-x #\r #\d) 'delete-rectangle)
(global-set-key '(#\C-x #\r #\k) 'kill-rectangle)
(global-set-key '(#\C-x #\r #\o) 'open-rectangle)
(global-set-key '(#\C-x #\r #\t) 'string-rectangle)
(global-set-key '(#\C-x #\r #\y) 'yank-rectangle)
(global-set-key '(#\C-x #\r #\w) 'copy-rectangle)
(global-set-key #\Home 'beginning-of-buffer)
(global-set-key #\End 'end-of-buffer)
(global-set-key #\C-_ 'undo)
(global-set-key #\C-- 'negative-argument)
(global-set-key #\C-\\ 'toggle-ime)
(dolist (c '(#\C-0 #\C-1 #\C-2 #\C-3 #\C-4 #\C-5 #\C-6 #\C-7 #\C-8 #\C-9))
  (global-set-key c 'digit-argument))
(global-set-key '(#\C-x #\n #\n) 'narrow-to-region)
(global-set-key '(#\C-x #\n #\w) 'widen)
(global-set-key #\M-: 'eval-expression)
(substitute-key-definition 'next-virtual-line 'next-line)
(substitute-key-definition 'previous-virtual-line 'previous-line)

(export 'ed::csv-mode "ed")
(autoload 'csv-mode "csv-mode" t)
;;(autoload 'tsv-mode "csv-mode" t)
(pushnew '("\\.csv$" . csv-mode) *auto-mode-alist* :test 'equal)
;;(pushnew '("\\.tsv$" . csv-mode) *auto-mode-alist* :test 'equal)

;; マウスホイールで画面をスクロールさせてもセレクションを解除されないようにする
;;(require "keep-selection")
;;
;;(in-package "editor")
;;
;;(defun mouse-wheel-scroll (window n lines)
;;  (or lines
;;      (setq lines (window-lines window)))
;;  (with-selected-window
;;    (set-window window)
;;    (move-kept-selection #'scroll-window (* n lines))))
;;
;;(setq mouse-wheel-handler #'mouse-wheel-scroll)
;;
;;(defun previous-page-kept-selection ()
;;  (interactive)
;;  (move-kept-selection #'previous-page))
;;
;;(in-package "user")
;;
;;(global-set-key #\PageUp 'previous-page-kept-selection)
;;(global-set-key #\PageDown 'next-page-kept-selection)


;; bash-mode
(load-library "bash-mode")
;; python-mode
(load-library "py-mode")
(push '("\\.py$" . py-mode) *auto-mode-alist*)
;;Python-mode関連
(add-hook 'ed::*py-mode-hook*
          #'(lambda ()
                                        ;c-jをオートインデント改行に
              (define-key ed::*py-mode-map* #\c-m 'ed::py-newline-and-indent)
              ))
(require "complete+")    ; ni-autoloadしている人は不要
(use-package "complete+"); ni-autoloadしている人は不要
(dolist (keymap (list minibuffer-local-completion-map
                      minibuffer-local-must-match-map))
  (define-key keymap '#\C-n 'complete+-select-next-item)       ; 次の候補
  (define-key keymap '#\C-p 'complete+-select-prev-item)       ; 前の候補
  (define-key keymap '#\C-< 'complete+-substring-match-rotate) ; 部分一致
  (define-key keymap '#\C-> 'complete+-skip-match-rotate)      ; スキップマッチ
  (define-key keymap '#\C-. 'complete+-toggle-incremental))    ; インクリメンタル
(setf *complete+-and-search* ";") ;AND検索
(setf *complete+-show-drive* t)   ;ドライブを表示
(setf *complete+-current-item-attribute* '(:foreground 1)) ; *Completion*バッファ
(setf *complete+-highlight-color*        '(:foreground 2)) ; ハイライト
(complete+-toggle-incremental t);最初からインクリメンタルに補完候補を表示

;; 罫線モードの拡張
(require "box-fixation-mode")
;; URL
(require "clickable-uri")
;; Explorer呼び出し
(require "explorer")
;; Grrep拡張
(require "ggrep")
;; iswitchb
(require "elisp")
(require "iswitchb")
(elisp::iswitchb-mode 1)
(elisp::iswitchb-substitute-global-map)
;; JavaScript
(require "jscript-mode")
;; markdown
(require "markdown")
;;Replace拡張
(require "multiple-replace")

;; 最近使ったファイル一覧
(defun list-recents ()
  (interactive)
  (let (hlist filename)
    (setq hlist (mapcar #'(lambda (x)
                            (list (abbreviate-display-string x 60 t) x))
                        *minibuffer-file-name-history*))
    (multiple-value-bind (result data)
        (dialog-box
         '(dialog 0 0 286 162
                  (:caption "最近使ったファイル")
                  (:font 9 "MS Pゴシック")
                  (:control
                   (:listbox flist nil #x50b10111 7 7 216 148)
                   (:button IDOK "OK" #x50010001 229 7 50 14)
                   (:button IDCANCEL "キャンセル" #x50010000 229 24 50 14)))
         (list (cons 'flist hlist))
         `((flist :must-match t :enable (IDOK))))
      (when result
        (setq filename (car (cddr (assoc 'flist data))))
        (find-file filename)
        (add-history filename '*minibuffer-file-name-history*)))))

;; URLデコード

;; 文字コードを指定して開き直す
(defvar *encoding-menu* nil)
(defun encoding-menu ()
  (or *encoding-menu*
      (let ((menu (create-popup-menu)))
        (mapc #'(lambda (x)
                  (add-menu-item menu nil (car x)
                                 #'(lambda ()
                                     (interactive)
                                     (revert-buffer (cdr x)))))
              `(("utf-8n \t(&8)" . ,*encoding-utf8n*)
                ("utf-16 \t(&6)" . ,*encoding-utf16*)
                ("sjis   \t(&S)" . ,*encoding-sjis*)
                ("auto   \t(&A)" . ,*encoding-auto*)
                ("euc-jp \t(&E)" . ,*encoding-euc-jp*)
                ("jis    \t(&J)" . ,*encoding-jis*)))
        (add-menu-item menu :select "詳細指定\t(&_)"
                       #'(lambda (encoding)
                           (interactive "zEncoding: ")
                           (revert-buffer encoding)))
        (setq *encoding-menu* menu))))
(defun revert-buffer-encoding-popup2 ()
  (interactive)
  (track-popup-menu (encoding-menu)))

(defun encoding-menu-in-file-autoload ()
  (let ((filemenu (get-menu *app-menu* 'ed::file)))
    (insert-popup-menu filemenu
                       (1- (get-menu-position (get-menu *app-menu* 'ed::file) :above-session))
                       (encoding-menu) "Reopen with Encoding (&G)\tC-c e")))
(add-hook '*init-app-menus-hook* 'encoding-menu-in-file-autoload)
(global-set-key '(#\C-x #\RET #\r) 'revert-buffer-encoding-popup2)

0 件のコメント:

コメントを投稿