俺的xyzzyのカスタマイズおメモ

060103:
だいぶ使いやすくなってきた。しかしこれ以上はFAQとかに頼れずに自分でLispを書かざるを得ないかも。
060103:
あとの希望の変更点はもう見た目だけで実用レベルになった。すげぇ。
0600307:
VCエディタが最高すぎてなかなかxyzzyを使わない。こーどーうぉーりあーはもっさりしすぎでウンコ
0600913:
これからは基本的にWindowsキーバインドを捨てEmacs風キーバインドで使用することにする。

インスコした拡張

  • NetInstaller? 拡張インストーラー。必須。
  • paren カッコ内強調表示。
  • toggle-gates Emacsもどきキーバインドと似非Windowsキーバインド切り替えGUIボタン。
  • bufmenu バッファの右クリメニュー拡張。
  • topmost 最善表示GUIボタン。できればメニューにも入れて欲しい。
  • ctags対応標準のXTAGSだとクラスメンバとかに飛べないので。
  • pickup-pattern 検索文字列とかの強調表示。
  • buffer-bar-click-to-delete マウス操作回りでのバッファ拡張。
    ;;タブ拡張
    (load-library "buffer-bar-click-to-delete.l")
  • py-mode Python用メジャーモード。
  • py-tags Python用タグジャンプ。だが使い方がわからん。
    ;;Python(py-mode)でタグジャンプ
    (require "py-tags")
  • gtags対応 ctagsと違うのはローカル変数定義にも飛べる?
    ;; gtags-mode設定
    (in-package "editor")
    (setq *gtags-mode-hook*
          #'(lambda ()
              (local-set-key #\M-t 'gtags-find-tag)
              (local-set-key #\M-r 'gtags-find-rtag)
              (local-set-key #\M-s 'gtags-find-symbol)
              (local-set-key #\M-e 'gtags-find-tag-from-here)
              ;(local-set-key #\M-a 'gtags-pop-stack)
              (local-set-key #\C-t 'gtags-pop-stack)
              (local-set-key #\M-j 'gtags-find-with-grep)
              (local-set-key #\M-c 'gtags-find-file-ext)
              (local-set-key #\M-n 'gtags-find-next-tag)
              (local-set-key #\M-p 'gtags-find-previous-tag)
              ))
    
    (setq *gtags-select-mode-hook*
          #'(lambda ()
              (local-set-key #\M-a 'gtags-pop-stack)
              (local-set-key #\PageUp 'previous-page-kept-selection)
              (local-set-key #\PageDown 'next-page-kept-selection)
              (local-set-key #\LBtnDown 'gtags-mouse-left-press)
              (local-set-key #\M-n #'(lambda ()
                                       (interactive)
                                       (next-virtual-line)
                                       (gtags-select-tag)))
              (local-set-key #\M-p #'(lambda ()
                                       (interactive)
                                       (previous-virtual-line)
                                       (gtags-select-tag)))
              ))
    
    (add-hook '*c-mode-hook*
              #'(lambda ()
                  (gtags-mode 1)
                  ;(gtags-make-complete-list);未対応
                  ))
    (add-hook '*c++-mode-hook*
              #'(lambda ()
                  (gtags-mode 1)))
    (add-hook '*php-mode-hook*
              #'(lambda ()
                  (gtags-mode 1)))
    (in-package "user")
    ※060913現在
     俺の環境ではgtags-find-tagの際、同一ファイル内のメンバ関数以外"xxxxxxx":tag not foundになる。何故。
     gtags-find-symbolあたりは使えてるので作成したTAGが見えてないということはないと思うのだがなぁ。
  • rv-region リージョンに範囲カラーを付ける拡張。
    ;;rv-region用設定
    ;リージョン反転をセレクションで行うようにしてしまう
    (setq *rv-region-use-selection* t)
  • iswitchb バッファの切り替えを簡単にする拡張。

変更または追加したキーバインド

  • Emacsキーバインドの論理行頭移動が気に入らないので
    (global-set-key #\C-a 'back-to-indentation-or-bol)
  • VS2005やMeadowじゃc-jでしかオートインデント改行が効かないのであわせる(各モード事に追記すること)
    ;c-jをオートインデント改行に
    (define-key ed::*c-mode-map* #\c-j 'c-newline-and-indent) 

機能追加したい事

  • ソースコード中の数字の色付け
  • Ctrl+F2でショートカットセット
  • F2で後方ショートカットジャンプ
  • Shift+F2で前方ショートカットジャンプ
  • ホイール使用しても範囲選択/カーソル位置を保持
  • C++モードのコメントの背景色を設定する
  • 各メジャーモードごとに文字色設定
  • バックスペースキーの挙動が違う、範囲選択していればそれを消すように
  • ctags.l が望む挙動を示さない。
    条件が良くわからんのだが関数定義行までジャンプ出来ずそのファイルの先頭に移動する事が多々ある。
    数百キロバイトぐらいのtagsで初回の読み込みに異様に時間がかかってしまう。
    また2006/11/16現在、ctags.l の開発サイトが閉じてしまっているのでメンテに期待できない。
    変わりに導入したgtagsの挙動はキー1発で定義に飛んでくれない等 少々慣れにくいものであり、
    VisualStudioやサクラエディタに慣れた俺には少々使い辛い。gtagsはpythonやC#のタグ出力に対応していない。
    ctagsからetags形式で出力したものをMeadowで試した所、動作速度も機能もほぼ問題ないため
    etags.elをXyzzyに移植できれば幸せになれそうなのだが・・・。

カスタマイズ完了

  • Tab+Ctrlで前方バッファ(タブ)移動、Tab+Shift+Ctrlで後方バッファ(タブ)移動 削除予定
    ;; 前のフレーム
    (set-extended-key-translate-table exkey-S-C-tab #\S-C-F24)
    (global-set-key #\S-C-F24 'previous-pseudo-frame)
    
    ;; 次のフレーム
    (set-extended-key-translate-table exkey-C-tab #\C-F24)
    (global-set-key #\C-F24 'next-pseudo-frame)
    良くみるとframeの移動であり勘違いしている。
    同じキーバインドでバッファが移動していたのはgates.lに望む設定が合ったから。
  • BackSpase?でTABを分解せず削除する
    ;; バックスペースでタブをしっかり消したい
    (undefine-key ed::*c-mode-map* #\C-h)
    (undefine-key ed::*c++-mode-map* #\C-h)
    (global-set-key #\C-h 'delete-backward-char)
    ただこれだとバックスペースで範囲選択が消せない原因にもなっていると思われる。
  • C言語モードの設定(C++ならc++-modeに読み替えること)
    ウチの会社8タブなのよね。
    ;;C
    (add-hook 'ed::*c-mode-hook*
    	 #'(lambda ()
    		(set-tab-columns 8 (selected-buffer))))
    ;インデントはタブで
    (setq *c-indent-tabs-mode* t)
    ;タブキーを押せばインデント挿入
    (define-key ed::*c-mode-map* #\tab 'self-insert-command)
    ;c-jをオートインデント改行に
    (define-key ed::*c-mode-map* #\c-j 'c-newline-and-indent) 
    ;インデント設定
    (setq c-indent-level 8)
    (setq c-continued-statement-offset 8)
    (setq c-brace-offset -8)
    (setq c-argdecl-indent 8)
    (setq c-label-offset -8)
    (setq c-brace-imaginary-offset 0)
    (setq c-comment-indent 2)
  • Pythonモードの設定
    デフォルトの4キャラスペースインデント
    ;;Python-mode関連
    (add-hook 'ed::*py-mode-hook*
    	 #'(lambda ()
    		;c-jをオートインデント改行に
    		(define-key ed::*py-mode-map* #\c-j 'ed::py-newline-and-indent)
    				 ))
  • Homeでインデント行頭移動(1回押しでインデント,2回押しで行頭へ)
    ※xyzzyの使い方が分からぬやし 励ましあえ その8 >>467
    ;; 行頭移動とインデント位置移動のトグル
    (defun back-to-indentation-or-bol ()
     (interactive)
     (let ((current (point)))
      (back-to-indentation)
      (if (= current (point))
        (goto-bol))))
    
  • shift+Homeで範囲選択行頭移動
    ※xyzzyの使い方が分からぬやし 励ましあえ その8 >>468
    ;; さらに選択
    (defun my-selection-beginning-of-line ()
    (interactive)
    (begin-selection)
    (back-to-indentation-or-bol)) ;467さんの関数
  • ミニバッファの補完候補リストをチップヘルプにする
    ;;ミニバッファの補完候補リストをチップヘルプにする
    (setq *print-completion-list-hook*
    '(lambda (list prefix &optional string)
    (popup-string (format nil "Possible completions are ~D items:\n~{\n~A~}" (length list) list) (point))))
  • dabbervの候補をポップアップにする
    ;;dabbervの候補をポップアップにする
    (require "dabbrev")
    (global-set-key #\C-t 'dabbrev-popup)
    (setq *popup-completion-list-default* :always)
  • マウスホイールで画面をスクロールさせてもセレクションが解除されないようにする

    ※リンク先のkeep-selection.lが必要

    ;; .xyzzy やsiteinit.l に以下のように記述してください。
    
    (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)
  • C-Sの検索をインクリメンタルサーチに変更
    ;; インクリメンタルサーチ
    (require "isearch")
  • isearchで正規表現をトグルする
    ;;正規表現でisearchの切替
    (defun toggle-regex-isearch ()
      (interactive)
      (setq *isearch-use-regexp*
            (not *isearch-use-regexp*))
      (message "isearch ~[nomal~;regexp~]"
               (if *isearch-use-regexp* 1 0)))
    ;(define-key ed::*isearch-map* '#\C-t 'toggle-regex-isearch)
    (define-key ed::*isearch-map* '#\M-r 'toggle-regex-isearch)
  • grep結果をダブルクリックで開く
    (defun grep-mouse-left-press ()
      "grep結果をダブルクリックでファイルopen"
      (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*)))
  • CモードとC++モードでVCのようにF1でHTMLヘルプを開く
    ;; F1でHTML Helpを開く
    (define-key ed::*c-mode-map* #\F1 'show-html-help)
    (define-key ed::*c++-mode-map* #\F1 'show-html-help)
    開かれるHTMLヘルプは共通設定のディレクトリタブで指定する。