Wednesday, February 10, 2010

ウィンドウ・バッファ関連のキーバインドを晒してみる

キーバインドを晒してみる。と言うのも…

を読んで、自分の .emacs を見てみたら、キーバインドのカスタマイズは、ほとんどがウィンドウとバッファ関連だったから。

愚直にほぼデフォルトのキーバインドをずっと使ってきたので、長いこと使ってるわりには他のベテランの人みたいな味わい?は無いです。最近になって他のかたの twitter や blog から勉強させてもらって、それで真似てみたのが多いかな。

なのでただ晒すだけ。普段から新しい情報を探している人には目新しいものは無いと思われます。

ぼくが普段使っているのは Windows の GUI の(-nw ではない) Emacs で、一つの Emacs を二つの縦長 80桁のフレームで、頻繁に縦に二分割しながら使ってます。分割するかどうかは window-full-height-p を見ます。

最大化(フルスクリーン)と横分割はあんまりしないです。いまどき 80桁へのこだわりも無いので、そのうち突然横幅を広げるかも知れないけど。

;; ~/.emacs.d/emacs23_nt.el -*- mode: emacs-lisp; coding: utf-8-dos -*-
;; $Id: emacs23_nt.el 635 2010-02-10 11:32:17Z yu-ji $

;;
;; key bindings
;;

;; C-h を backspace として使う。
(define-key global-map [(C h)] 'delete-backward-char)

;; (・ω・)モキュ
(define-key global-map [(M o)] 'moccur)

;; C-x M-f で recentf
(define-key ctl-x-map [(M f)] 'recentf-open-files)

;; C-x 4 M-f u-recentf-open-files-other-window
(defun u-recentf-open-files-other-window ()
  "Show a dialog to open a recent file in other window."
  (interactive)
  (if (window-full-height-p)
      (split-window-vertically))
  (other-window 1)
  (recentf-open-files))
(define-key ctl-x-4-map [(M f)] 'u-recentf-open-files-other-window)

;; C-x C-b で list-buffers のかわりに ibuffer
(define-key ctl-x-map [(C b)] 'ibuffer-other-window)

;; C-x 4 C-b 
(define-key ctl-x-4-map [(C b)] 'ibuffer)

;; C-aで「行頭」と「インデントを飛ばした行頭」を行き来する - ポロポロ
;; http://d.hatena.ne.jp/kitokitoki/20100131/p4
(defun u-move-beginning-of-line ()
  (interactive)
  (if (bolp)
      (back-to-indentation)    
      (beginning-of-line)))
(define-key global-map [(C a)] 'u-move-beginning-of-line)

;; ibuffer
;; Meadow/Emacs memo: バッファリストとバッファの切り替え
;; http://www.bookshelf.jp/soft/meadow_28.html
(define-ibuffer-column
 ;; ibuffer-formats に追加した文字
 coding
 ;; 一行目の文字
 (:name " coding ")
 ;; 以下に文字コードを返す関数を書く
 (if (coding-system-get buffer-file-coding-system 'mime-charset)
     (format " %s" (coding-system-get buffer-file-coding-system :mime-charset))
   " undefined"
   ))
(setq ibuffer-formats
      '((mark modified read-only " "
	      (name 18 18 :left :elide) " "
	      (size 6 -1 :right) " "
	      (mode 10 10 :left :elide) " "
	      (coding 10 10 :left :elide) " "
	      filename-and-process)
	(mark " " (name 16 -1) " " filename)))

;; 分割したウィンドウ間の移動
;; マイ.emacs探訪 - I am Cruby!
;; http://d.hatena.ne.jp/authorNari/20091225/1261667956
(define-key global-map [(C S n)] 'windmove-down)
(define-key global-map [(C S p)] 'windmove-up)
(define-key global-map [(C S b)] 'windmove-left)
(define-key global-map [(C S f)] 'windmove-right)

;; 分割したウィンドウの大きさを Ctrl-上下キーで変える
;; とりあえず暇だったし何となく始めたブログ
;; http://d.hatena.ne.jp/khiker/20100118/emacs_arrow
(define-key global-map [(C up)] 'shrink-window)
(define-key global-map [(C down)] 'enlarge-window)

;; 細かいことはキニシナイ。
(define-key global-map [(C left)]
  '(lambda (size) (interactive "p") (shrink-window size t)))
(define-key global-map [(C right)]
  '(lambda (size) (interactive "p") (enlarge-window size t)))

;; w3m
;; w3m-mode-hook で
;;(define-key w3m-mode-map (kbd "C-c C-q") 'w3m-delete-buffer)

;; twittering-mode
(define-key twittering-edit-mode-map (kbd "C-c C-q")
  'twittering-edit-cancel-status)

;; そろそろEmacsのウィンドウについて一言いっとくか
;; (rubikitch loves (Emacs Ruby CUI))
;; http://d.hatena.ne.jp/rubikitch/20100210/emacs
(defun u-other-window-or-split (arg)
  (interactive "p")
  (if (window-full-height-p)
      (split-window-vertically))
  (other-window arg))
(define-key global-map [(C t)] 'u-other-window-or-split)
(define-key global-map [(C S t)]
  '(lambda (arg) (interactive "p") (u-other-window-or-split (- arg))))

;; URL をブラウザで開く
;;(define-key ctl-x-map "m" 'browse-url-at-point)

;; App キーを Hyper に
;;(setq w32-pass-lwindow-to-system nil)
;;(setq w32-apps-modifier 'hyper)
;;(define-key global-map [(H f)] 'forward-char)

冒頭の rubikitchさんのも早速入れてみました。ちょっと手を加えて。
前述の理由で横分割しないのと、引き数取るのと、C-t で順方向、C-S-t か C-- C-t で逆方向。

手がこれを使うかどうかは分からないけど…。細々操作してると、二分割して「こっちのウィンドウでなにかしたい」ときと「あっちのウィンドウでなにかしたい」ときとありますよね。そういうとき従来のキーバインドを使うと思う。C-t を使いはじめたら、C-t 連打で使い分けるようになるかなぁ。

あと変数の設定は custom でやってるので、関係しそうなところだけ手抜きコピペ。

;; ~/.emacs.d/custom23_nt.el
;; $Id: custom23_nt.el 627 2010-02-03 21:36:35Z yu-ji $
(custom-set-variables
 '(cursor-in-non-selected-windows nil)
 '(custom-file "~/.emacs.d/custom23_nt.el")
 '(history-delete-duplicates t)
 '(ibuffer-mode-hook (quote ((lambda nil (ibuffer-switch-to-saved-filter-groups "u")))))
 '(ibuffer-saved-filter-groups (quote (("u" ("dired" (saved . "dired")) ("Development" (saved . "Development")) ("Text" (saved . "Text")) ("Mew" (saved . "Mew")) ("Twitter" (saved . "Twitter")) ("w3m" (saved . "w3m")) ("Custom" (saved . "Custom")) ("Help" (saved . "Help")) ("Emacs" (saved . "Emacs"))))))
 '(ibuffer-saved-filters (quote (("dired" ((or (mode . dired-mode) (mode . vc-dir-mode)))) ("Emacs" ((or (name . "\\*scratch\\*") (name . "\\*Messages\\*") (mode . Buffer-menu-mode) (mode . completion-list-mode) (mode . apropos-mode)))) ("Text" ((or (mode . texinfo-mode) (mode . org-mode) (mode . text-mode)))) ("Mew" ((or (mode . mew-summary-mode) (mode . mew-virtual-mode) (mode . mew-draft-mode) (mode . mew-message-mode)))) ("Development" ((or (mode . bat-generic-mode) (mode . c++-mode) (mode . c-mode) (mode . change-log-mode) (mode . conf-mode) (mode . conf-windows-mode) (mode . cperl-mode) (mode . css-mode) (mode . diff-mode) (mode . emacs-lisp-mode) (mode . html-mode) (mode . java-mode) (mode . js2-mode) (mode . lisp-mode) (mode . makefile-gmake-mode) (mode . makefile-mode) (mode . moccur-mode) (mode . nxml-mode) (mode . php-mode) (mode . reg-generic-mode) (mode . sgml-mode) (mode . sh-mode) (mode . sql-mode) (mode . vc-bzr-log-view-mode) (mode . vc-git-log-view-mode) (mode . vc-svn-log-view-mode) (mode . visual-basic-mode) (mode . xml-mode) (name . "\\*vc-diff\\*") (name . "\\*vc\\*") (name . "\\.\\(php\\|yml\\|cmd\\)")))) ("w3m" ((or (mode . w3m-mode)))) ("Twitter" ((or (mode . twittering-mode) (name . "^\\*Twit-")))) ("Custom" ((or (mode . Custom-mode)))) ("Help" ((or (mode . help-mode) (mode . Man-mode) (mode . Info-mode)))))))
 '(iswitchb-mode t)
 '(recentf-exclude (quote ("^c:/Users/yu-ji/AppData/Local/Temp" "^c:/Users/yu-ji/home/work/ExtractedFiles/" "^c:/Users/yu-ji/home/Mail/draft/" "^c:/Users/yu-ji/home/.mozilla/firefox/firefox35/itsalltext/")))
 '(recentf-max-saved-items 40)
 '(recentf-mode t)
 '(recentf-save-file "~/.emacs.d/.recentf")
 '(save-place t nil (saveplace))
 '(save-place-file "~/.emacs.d/.emacs-places")
 '(save-place-limit 100)
 '(savehist-mode t nil (savehist))
 '(shift-select-mode nil)
 '(uniquify-buffer-name-style (quote post-forward) nil (uniquify))
 '(w3m-mode-hook (quote ((lambda nil (define-key w3m-mode-map (kbd "C-c C-q") (quote w3m-delete-buffer))))))
 '(windmove-wrap-around t))

見辛いな(-ω-;)

C-S-n, C-S-p, C-S-f, C-S-b は transient-mark-mode と相性悪いめです。

No comments:

Post a Comment