;;;
;; ~/.xyzzy - Startup file for xyzzy
;; HIROSE, Yuuji [yuuji@gentei.org]
;;;

(defun save-kill-buffer ()
  "Save and kill current buffer"
  (interactive)
  (save-buffer)
  (kill-buffer (selected-buffer)))

(defun backward-kill-line ()
  "Kill line backward"
  (interactive)
  (kill-line 0))

(defun copy-word ()
  (interactive)
  (copy-region-as-kill
   (point) (save-excursion
	    (skip-chars-forward "^[](){} \t\n()\"")
	    ;(skip-chars-forward "-A-Za-z_")
	    (point)))
  (message (car (car *kill-ring*))))

(defun MY-scroll-up (&optional (arg 1))
  (interactive "p")
  (let ((p (point)))
    (scroll-window arg)
    (if (pos-visible-in-window-p p)
	(goto-char p))))
(defun MY-scroll-down (&optional (arg 1))
  (interactive "p")
  (MY-scroll-up (- arg)))


(define-key *global-keymap* #\C-x 'nil)
(define-key *global-keymap* #\C-x 'next-line)
(setq Ctrl-O-prefix (copy-keymap ctl-x-map))
;;;
;; Ctrl-L prefix family
;;;
(setq Ctrl-L-prefix (make-sparse-keymap))
;(define-key Ctrl-L-prefix "1" 'win-switch-to-window)
(define-key Ctrl-L-prefix #\) 'up-list)
(define-key Ctrl-L-prefix #\( 'backward-up-list)
;(define-key Ctrl-L-prefix "]" 'remove-trailing-spaces)
;(define-key Ctrl-L-prefix ">" 'comment-out-region)
;(define-key Ctrl-L-prefix "<" 'uncomment-region)
;(define-key Ctrl-L-prefix "?" 'apropos)
;(define-key Ctrl-L-prefix "a" 'Super-apropos-menu);Joe Wells's Apropos
(define-key Ctrl-L-prefix #\c 'next-page)
;(define-key Ctrl-L-prefix "d" 'Describe-menu)     ;Extended Describe menu
;(define-key Ctrl-L-prefix "e" 'Evaluate-menu)     ;Extended Evaluate menu
;(define-key Ctrl-L-prefix "\C-i" 'file-complete)
;(define-key Ctrl-L-prefix "\C-k" 'mkdir-in-line)
(define-key Ctrl-L-prefix #\v 'compare-windows)
;(define-key Ctrl-L-prefix "w" 'Change-case-menu)  ;Change case menu
(define-key Ctrl-L-prefix #\C-l 'recenter)
(define-key Ctrl-L-prefix #\l 'recenter)
(define-key Ctrl-L-prefix #\u 'unshar-other-buffer)
;(define-key Ctrl-L-prefix "\^R" 'Rectangle-menu)
;(define-key Ctrl-L-prefix "\^X" 'edebug-defun)


;;;
;; Ctrl-O prefix family
;; ( Re-defined ^Q^O as ^O in order to alive 
;;   ^O prefix in other environmet such as 
;;   gnus-Subject-mode. )
;;;
(setq Ctrl-O-prefix ctl-x-map)
;(global-set-key "\^Q\^O" 'Control-X-prefix)
(define-key Ctrl-O-prefix #\C-a	'save-buffer)
;;(define-key Ctrl-O-prefix "b"	'switch-to-buffer-across-frame)
;;(define-key Ctrl-O-prefix "B"	'switch-to-buffer)
(define-key Ctrl-O-prefix #\C-e 'save-kill-buffer)
(define-key Ctrl-O-prefix #\C-g 'quit)
(define-key Ctrl-O-prefix #\C-i 'fill-paragraph)
(define-key Ctrl-O-prefix #\C-j 'jump-to-register)
(define-key Ctrl-O-prefix #\C-k 'copy-region-as-kill)
(define-key Ctrl-O-prefix #\C-l 'yank)
;(define-key Ctrl-O-prefix "l"	'browse-yank)
;(define-key Ctrl-O-prefix "\^M" 'electric-buffer-list)
(define-key Ctrl-O-prefix #\C-n 'find-file)
;(define-key Ctrl-O-prefix "\^S" 'suspend-emacs)
(define-key Ctrl-O-prefix #\C-q 'replace-string)
;(define-key Ctrl-O-prefix "q"   Ctrl-Q-prefix)
(define-key Ctrl-O-prefix #\C-r 'find-file-read-only)
(define-key Ctrl-O-prefix #\C-t 'set-mark-command)
(define-key Ctrl-O-prefix #\C-u 'fill-region-as-paragraph)
(define-key Ctrl-O-prefix #\w   'write-file)
(define-key Ctrl-O-prefix #\C-w
	    #'(lambda () (interactive)
		(if (= (count-windows) 1)
		    (switch-to-buffer (other-buffer))
		  (other-window 1))))
(define-key Ctrl-O-prefix #\C-x #'(lambda () (interactive)
				    (kill-buffer (selected-buffer))))
(define-key Ctrl-O-prefix #\z	'copy-word)
;;(define-key Ctrl-O-prefix "\^Z" 'suspend-emacs)
;;(define-key Ctrl-O-prefix "["   'backward-paragraph)
;;(define-key Ctrl-O-prefix "]"   'forward-paragraph)
(define-key Ctrl-O-prefix #\8   'save-buffers-kill-xyzzy)
;;(define-key Ctrl-O-prefix "9"   'see-you-again)
(define-key Ctrl-O-prefix #\/ 'point-to-register)

;;;
;; Ctrl-Q prefix family
;; for Quick operations.
;;;
(setq Ctrl-Q-prefix (make-sparse-keymap))
(define-key Ctrl-Q-prefix #\1 #'(lambda()(interactive)(jump-to-register #\1)))
(define-key Ctrl-Q-prefix #\2 #'(lambda()(interactive)(jump-to-register #\2)))
(define-key Ctrl-Q-prefix #\3 #'(lambda()(interactive)(jump-to-register #\3)))
(define-key Ctrl-Q-prefix #\4 #'(lambda()(interactive)(jump-to-register #\4)))
(define-key Ctrl-Q-prefix #\5 #'(lambda()(interactive)(jump-to-register #\5)))
;;(define-key Ctrl-Q-prefix "\^B" 'isearch-backward)
(define-key Ctrl-Q-prefix #\b   're-search-backward)
;(define-key Ctrl-Q-prefix "\^E" 'Beginning-of-screen)
(define-key Ctrl-Q-prefix #\C-f 'search-forward)
;(define-key Ctrl-Q-prefix "f"   're-search-forward)
(define-key Ctrl-Q-prefix #\C-c 'end-of-buffer)
(define-key Ctrl-Q-prefix #\c	'next-page)
(define-key Ctrl-Q-prefix #\C-d 'end-of-line)
(define-key Ctrl-Q-prefix #\C-h 'backward-kill-word)
(define-key Ctrl-Q-prefix #\C-j 'exchange-point-and-mark)
(define-key Ctrl-Q-prefix #\C-k 'copy-to-register)
(define-key Ctrl-Q-prefix #\C-l 'insert-register)
(define-key Ctrl-Q-prefix #\l   'goto-line)
(define-key Ctrl-Q-prefix #\C-m 'call-last-kbd-macro)
;(define-key Ctrl-Q-prefix "o"
;  '(lambda () (interactive) (global-set-key "\C-o" Ctrl-O-prefix)))
(define-key Ctrl-Q-prefix #\C-o Ctrl-O-prefix)
(define-key Ctrl-Q-prefix #\C-r 'beginning-of-buffer)
(define-key Ctrl-Q-prefix #\C-s 'beginning-of-line)
(define-key Ctrl-Q-prefix #\C-u 'universal-argument)
(define-key Ctrl-Q-prefix #\C-v 'overwrite-mode)
(define-key Ctrl-Q-prefix #\v   'overwrite-mode)
;(define-key Ctrl-Q-prefix "\^W" 'resize-window)
;(define-key Ctrl-Q-prefix "w"	'smooth-scroll-down)
;(define-key Ctrl-Q-prefix "z"	'smooth-scroll-up)
;(define-key Ctrl-Q-prefix "\^X" 'End-of-screen)
;(define-key Ctrl-Q-prefix "\^Y" 'Kill-to-register)
;(define-key Ctrl-Q-prefix "\e"  '(lambda ()(interactive)(blink-matching-open)))
;(define-key Ctrl-Q-prefix "\^@" 'ispell-complete-word)
;;(setq search-repeat-char ?\^C)
;;(setq search-quote-char  ?\^V)
;(setq search-delete-char ?\^H) ;No need by bobcat.el


;;;
;; Basic editing commands
;;;
(global-set-key #\C-a 'backward-word)
(global-set-key #\C-b 'repeat-complex-command)
(global-set-key #\C-c 'next-page)
(global-set-key #\C-d 'forward-char)
(global-set-key #\C-e 'previous-line)
(global-set-key #\C-f 'forward-word)
(global-set-key #\C-g 'delete-char)
;(global-set-key #\C-^H" 'delete-backward-char)
;(global-set-key #\C-^I" 'indent-for-tab-command)
(global-set-key #\C-j 'point-to-register)
;(global-set-key #\C-^K" 'MY-kill-line)
(global-set-key #\C-l Ctrl-L-prefix)
;(global-set-key #\C-^M" 'newline)
(global-set-key #\C-n
		#'(lambda(&optional (arg 1))
		    (interactive "p")
		    (beginning-of-line)
		    (open-line arg)))
(global-set-key #\C-o Ctrl-O-prefix)
(global-set-key #\C-p 'undo)
(global-set-key #\C-q Ctrl-Q-prefix)
(global-set-key #\C-r 'previous-page)
(global-set-key #\C-s 'backward-char)
(global-set-key #\C-t 'kill-word)
(global-set-key #\C-u 'backward-kill-line)
(global-set-key #\C-v 'quote-char)
(global-set-key #\C-w 'MY-scroll-down)
(global-set-key #\C-x 'next-line)
(global-set-key #\C-y 'kill-region)
(global-set-key #\C-z 'MY-scroll-up)

(global-set-key '(#\C-[ #\C-n) "~/")

(toggle-eof nil)
(toggle-line-number nil)
