EmacsのFunction key設定を公開

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

### F1：help-command
F1は、Deaultでいろんなhelp-commadへのprifixとして設定されているのでそのまま使います。which-key.el を導入することで各コマンドのガイドがミニバファーに表示されるので便利です。
![Alt Text](https://live.staticflickr.com/65535/48658798686_6c5227888f_b.jpg)

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

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

![Alt Text](https://live.staticflickr.com/65535/48663159803_02857a9beb_b.jpg) 

``` emacs-lisp
(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)))
```
- [hydra-compile の詳細設定はこちら](https://github.com/minorugh/emacs.d/blob/master/inits/10_utils.el)

### F3：term-current-dir-open
開いているbufferのカレントでシステムのterminalを開きます。また、Shift+F3でFilerを開きます。

```emacs-lisp
(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になります。

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

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

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

## F6：counsel commands
多機能なcounselのコマンド群をキーバインドしてもとても覚えきれませんね。
よく使う主要コマンドだけキーバインドし、あとはF6を叩くとcounsel-M-xが勝手に絞り込んでくれるので必要なコマンドをセレクトできます。
![Alt Text](https://live.staticflickr.com/65535/48659043901_ed297c5081_b.jpg) 

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

```
- [counsel の詳細設定はこちら](https://github.com/minorugh/emacs.d/blob/master/inits/04_counsel.el) 



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

![Alt Text](https://live.staticflickr.com/65535/48659029836_932b26293e_b.jpg) 

``` emacs-lisp
(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))

```
- [calendar の詳細設定はこちら](https://github.com/minorugh/emacs.d/blob/master/inits/07_ui.el) 

### F8 : iconfy-or-deiconfy-frame
Emacsの非表示（最小化）/再表示をtoggleします。

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


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

``` emacs-lisp
(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してます。

![Alt Text](https://jubilee-live.flickr.com/65535/48721753511_36677bd214_b.jpg) 


``` emacs-lisp
(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"))))
```

- [dashboard の詳細設定はこちら](https://github.com/minorugh/emacs.d/blob/master/inits/04_dashboard.el) 

### F11：neotree-toggle
定番の設定ですね。

![Alt Text](https://live.staticflickr.com/65535/48663514508_0498d52ca2_b.jpg) 

- [neotree の詳細設定はこちら](https://github.com/minorugh/emacs.d/blob/master/inits/40_neotree.el)

### F12：darkroom-mode

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


``` emacs-lisp
(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)))
```