vim-likeなキーバインドにする

vimは、まだよく知らないのですがとりあえず以下のような工夫をした。

View-modeにもともと備わっているキーバインド

いづれも設定で上書きすれば変更できるので、お好みにカスタマイズできます。

更に便利にする

超絶便利(^o^)

検索は、慣れた helm-ag,helm-occur,helm-swoop,helm-bm などを使うほうが機能的だと思います。

f : C-x C-j (dired-jump) は、なにげに重宝します。

ということで以下に設定を載せました。

View-modeの設定

view-modeの中でのキーアサインは、るびきちさんの記事 を参考にしました。

また、view-modeのときにモードラインの色を変えたかったので、こちらも、るびきちさんが作られたviewer.elを使っています。

;;---------------------------------------------------------------------
;; view-mode.el                                last updated: 2017/10/25
;;---------------------------------------------------------------------
;; Package to enhance view-mode
(use-package viewer
  :ensure t
  :config
  (setq viewer-modeline-color-view "IndianRed4")
  (setq view-mode-by-default-regexp "\\.el$")
  (viewer-change-modeline-color-setup)
  (viewer-stay-in-setup)
  :chords ("::" . view-mode))

;; Customize default-setup function by add file-exists-p
(defun view-mode-by-default-setup ()
  (when (and buffer-file-name view-mode-by-default-regexp
             (string-match view-mode-by-default-regexp buffer-file-name))
  (when (file-exists-p buffer-file-name) ;; New file is writeable
    (view-mode 1))
    (message "view-mode by view-mode-by-default-regexp.")))
(add-hook 'find-file-hook 'view-mode-by-default-setup)

;; Define my-view-mode-setup function
(defun view-mode-setup ()
  (when (file-exists-p buffer-file-name)
    (view-mode 1)))

;; Set my-view-mode-hook for each mode
(dolist
    (hook (list
           'perl-mode-hook
           'ruby-mode-hook
           'sh-mode-hook
           'python-mode-hook
           'html-mode-hook
           'css-mode-hook
           'makefile-mode-hook
           'js-mode-hook
           'nxml-mode-hook
           'conf-mode-hook))
  (add-hook hook
            (lambda ()
              (my-view-mode-setup))))

;; View-mode
(defvar pager-keybind
  `(;; vi-like
    ("o" . helm-occur)
    (";" . helm-swoop)
    ("a" . helm-ag)
    ("f" . dired-jump)
    ("h" . backward-char)
    ("l" . forward-char)
    ("j" . next-line)
    ("k" . previous-line)
    ("g" . View-goto-line)
    ("G" . View-goto-percent)
    ("b" . scroll-down)
    (" " . scroll-up)
    ("i" . read-only-mode)  ;; view-mode から抜ける
    ;; w3m-like
    ("w" . forward-word)
    ("e" . backward-word)
    ("n" . ,(lambda () (interactive) (scroll-up 1)))
    ("p" . ,(lambda () (interactive) (scroll-down 1)))
    ;; bm-easy
    ("." . bm-toggle)
    ("[" . bm-previous)
    ("]" . bm-next)
    ("@" . helm-bm)
    ))

(defun define-many-keys (keymap key-table &optional includes)
  (let (key cmd)
    (dolist (key-cmd key-table)
      (setq key (car key-cmd)
            cmd (cdr key-cmd))
      (if (or (not includes) (member key includes))
          (define-key keymap key cmd))))
  keymap)

(defun view-mode-hook0 ()
  (define-many-keys view-mode-map pager-keybind)
  (hl-line-mode 1)
  (linum-mode 1)
  (mozc-mode 0)    ;; mozc-mode を切る
  (define-key view-mode-map " " 'scroll-up))
(add-hook 'view-mode-hook 'view-mode-hook0)

;;; view-mode.el ends here

view-modeで開きたいファイルを複数設定する

view-modeで開きたいファイルモードを複数設定できるように、my-view-mode-setupという関数を定義しました。

emacs-lisp-mode-hookだけは何故かnilエラーになるので、やむなくviewer.elのview-mode-by-default-regexpのお世話になることにしました。いづれも、(when (file-exists-p buffer-file-name)の条件を付加して、新規ファイルを開く時にはview-modeにならないようにしています。

;; Customize default-setup function by add file-exists-p
(defun view-mode-by-default-setup ()
  (when (and buffer-file-name view-mode-by-default-regexp
             (string-match view-mode-by-default-regexp buffer-file-name))
  (when (file-exists-p buffer-file-name)  ;; New file is writeable
    (view-mode 1))
    (message "view-mode by view-mode-by-default-regexp.")))
(add-hook 'find-file-hook 'view-mode-by-default-setup)

;; Define my-view-mode-setup function
(defun my-view-mode-setup ()
  (when (file-exists-p buffer-file-name)
    (view-mode 1)))

;; Set my-view-mode-hook for each mode
(dolist
    (hook (list
           'perl-mode-hook
           'ruby-mode-hook
           'sh-mode-hook
           'python-mode-hook
           'html-mode-hook
           'css-mode-hook
           'makefile-mode-hook
           'js-mode-hook
           'nxml-mode-hook
           'conf-mode-hook))
  (add-hook hook
            (lambda ()
              (my-view-mode-setup))))

view-modeでは、mozc-modeをOFFにする

view-modeのときに、うっかりmozcを起動してしまうと固まってしまうことがあるので、view-modeでは、mozcをOFFにしています。 mozcに限らずskkなどinput-method は、view-mode時には、offに設定するほうがいいと思います。

(defun view-mode-hook0 ()
  (define-many-keys view-mode-map pager-keybind)
  (hl-line-mode 1)
  (mozc-mode 0)    ;; mozc-mode を切る
  (define-key view-mode-map " " 'scroll-up))
(add-hook 'view-mode-hook 'view-mode-hook0)

参考

viewerの使い方

viewer.el - EmacsWiki

view-modeの私的な設定