EmacsのFunction key設定を公開


あまり役に立つTipsではありませんが、自分の設定を公開します。みなさんの「私の場合は…」というのを教えていただけると嬉しいです。

F1:help-command

F1は、Deaultでいろんなhelp-commadへのprifixとして設定されているのでそのまま使います。which-key.el を導入することで各コマンドのガイドがミニバファーに表示されるので便利です。

(use-package which-key)
(add-hook 'after-init-hook #'which-key-mode)

F2:hydra-compile

一般的には此処に、M-x compileを割り当てている人が多いと思います。私はいろんな作業をmakefaileで自動化しているので目的に応じてコマンドを使い分けられるようにhydraでメニュー設定しています。

(bind-key
 [f2]
 (defhydra hydra-compile (:color red :hint nil)
   "
 🗿 Compile: make _k_  _a_ll  _u_pftp  _m_ove  _b_klog  _g_it  _c_lean   🐾 "
   ("k" my:make-k :exit t)
   ("a" my:make-all :exit t)
   ("u" my:make-upftp :exit t)
   ("m" my:make-move :exit t)
   ("g" my:make-git :exit t)
   ("b" my:make-bklog :exit t)
   ("c" my:make-clean)))

F3:term-current-dir-open

開いているbufferのカレントでシステムのterminalを開きます。また、Shift+F3でFilerを開きます。

(bind-key
 [f3]
 (defun term-current-dir-open ()
   "Open terminal application in current dir."
   (interactive)
   (let ((dir default-directory))
     (when (eq system-type 'darwin)
       (shell-command (concat "open -a iterm.app " dir)))
     (when (eq system-type 'gnu/linux)
       (shell-command (concat "gnome-terminal --maximize " dir))))))

(bind-key
 [S-f3]
 (defun filer-current-dir-open ()
   "Open filer in current dir."
   (interactive)
   (when (eq system-type 'darwin)
     (shell-command "open ."))
   (when (eq system-type 'gnu/linux)
     (shell-command (concat "xdg-open " default-directory)))))

F4: goto-chg

テキストを編集していて前の編集した箇所に戻りたいときがよくあります。その際に便利なのがgoto-chg.elになります。

(use-package goto-chg
 :bind
 ([f4] . goto-last-change)
 ([S-f4] . goto-last-change-reverse))

F5:quickrun

ごくたまに perlruby などのミニスクリプトを自作することもあるのでquickrunで簡単に試運転できるようにしています。

(use-package quickrun)
(bind-key [f5] 'quickrun)

F6:counsel commands

多機能なcounselのコマンド群をキーバインドしてもとても覚えきれませんね。
よく使う主要コマンドだけキーバインドし、あとはF6を叩くとcounsel-M-xが勝手に絞り込んでくれるので必要なコマンドをセレクトできます。

(bind-key [f6] (lambda ()
           (interactive)
           (counsel-M-x "^counsel ")))

F7:calendar

リタイアしてからは、EmacsでのGTDはやめてしまいましたが、作業中にカレンダーをチラ見したいときもあります。Calfwまでは必要ないので標準機能のcalendarを使っています。F7を押すことで、表示/非表示をトグルします。

(use-package calendar
  :commands calendar
  :bind (([f7] . calendar)
     :map calendar-mode-map
     ("n" . calendar-forward-day)
     ("b" . calendar-backward-day)
     ([f7] . calendar-exit))
  :config
  (setq calendar-mark-holidays-flag t))

F8 : iconfy-or-deiconfy-frame

Emacsの非表示(最小化)/再表示をtoggleします。

;; Iconify-frame
(bind-key [f8] 'iconify-or-deiconify-frame)

F9:display-line-numbers-mode

linum-modeは重いので使ってなかったのですが、Emacs26以降になって動作の軽い display-line-numbers-modeが使えるようになったので、F9でtoggleしています。

(add-hook 'prog-mode-hook 'display-line-numbers-mode)
(add-hook 'text-mode-hook 'display-line-numbers-mode)
(bind-key [f9] 'display-line-numbers-mode)

F10:dashboard

Emacsでの作業をリセットするときはdashboardに戻るようにしています。また戻るときにはdashboard bufferをRefreshしてます。

(use-package dashboard
  :bind (([f10] . open-dashboard)
     :map dashboard-mode-map
     ([f10] . quit-dashboard))
  :hook
  (after-init . dashboard-setup-startup-hook)
  :config
  (defun open-dashboard ()
    "Open the *dashboard* buffer and jump to the first widget."
    (interactive)
    (delete-other-windows)
    ;; Refresh dashboard buffer
    (if (get-buffer dashboard-buffer-name)
    (kill-buffer dashboard-buffer-name))
    (dashboard-insert-startupify-lists)
    (switch-to-buffer dashboard-buffer-name)
    ;; Jump to the first section
    (goto-char (point-min))
    (dashboard-goto-recent-files))

  (defun quit-dashboard ()
    "Quit dashboard window."
    (interactive)
    (quit-window t)
    (when (and dashboard-recover-layout-p
           (bound-and-true-p winner-mode))
      (winner-undo)
      (setq dashboard-recover-layout-p nil)))

  (defun dashboard-goto-recent-files ()
    "Go to recent files."
    (interactive)
    (funcall (local-key-binding "r"))))

F11:neotree-toggle

定番の設定ですね。

F12:darkroom-mode

私のEmacsは文章書きがメインなのでDarkroom-modeをF12のtoggleで使っています。darkroom-modeで作業する時は、flycheck-mode git-gutter-mode display-line-numbers-mode をそれぞれOFFにします。

(use-package darkroom
  :bind (([f12] . my:darkroom-mode-in)
     :map darkroom-mode-map
     ([f12] . my:darkroom-mode-out ))
  :config
  (defun my:darkroom-mode-in ()
    "Darkroom mode in."
    (interactive)
    (display-line-numbers-mode 0)
    (flycheck-mode 0)
    (git-gutter-mode 0)
    (darkroom-mode 1))
  (defun my:darkroom-mode-out ()
    "Darkroom mode out."
    (interactive)
    (darkroom-mode 0)
    (git-gutter-mode 1)
    (flycheck-mode 1)
    (display-line-numbers-mode 1)))