Emacs環境をアップデートする（straight.el）

長年使ってきた`MacBookPro Mid2010`から`MacBookAir2018`に買い替えました。
きっかけがないとなかなか設定を見直さないため、何年ぶりかに実施です。

これまでは下記のようにパッケージごとに設定ファイルを分けてきたのですが、そこまでこだわった使い方をしていないため、init.elにまとめることにしました。
こだわりの設定し始めたらファイル分けたほうがいいのかもしれませんが、個人的にはスッキリして満足です。
起動時間もそこまで気になるほどじゃないので`use-package`も使わずにいきます。

```terminal:~/.emacs.d/
init.el
./inits/
    ├── 01_basic.el
    └── 02_helm.el
    └── 03_recentf.el
```

# Emacs
## [straight.el](https://github.com/raxod502/straight.el)
パッケージマネージャです。
`init.el`に`straight-use-package`を書くだけでパッケージのインストールまで完了します。

```elisp:init.el
(defvar bootstrap-version)
(let ((bootstrap-file
       (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
      (bootstrap-version 5))
  (unless (file-exists-p bootstrap-file)
    (with-current-buffer
        (url-retrieve-synchronously
         "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
         'silent 'inhibit-cookies)
      (goto-char (point-max))
      (eval-print-last-sexp)))
  (load bootstrap-file nil 'nomessage))
```
参考：[Emacsパッケージマネージャ決定版：これからのパッケージ管理はstraight.elで決まり！
](https://nukosuke.hatenablog.jp/entry/straight-el)

## helm
```elisp:init.el
(straight-use-package 'helm)
(helm-mode 1)
(define-key global-map (kbd "M-y") 'helm-show-kill-ring)
(define-key global-map (kbd "C-x C-f") 'helm-find-files)
(define-key global-map (kbd "C-x C-r") 'helm-recentf)
(define-key helm-map (kbd "C-h") 'helm-ff-delete-char-backward)
(define-key helm-find-files-map (kbd "TAB") 'helm-execute-persistent-action)
```
個人的な慣れの問題から`C-h`と`TAB`を定義してます。
参考：[Emacs に革命を起こすパッケージ「helm」 ](http://emacs.rubikitch.com/sd1503-helm/)

## recentf-ext
最近開いたファイルを一覧で表示してくれる。
すごいよく使う機能。
`C-x C-r`に設定してます。

```elisp:init.el
(straight-use-package 'recentf-ext)
(recentf-mode 1)
(setq recentf-max-saved-items 200)
(setq recentf-save-file "~/.emacs.d/recentf")
(setq recentf-auto-cleanup 'never)
(setq helm-for-files-preferred-list
      '(helm-source-buffers-list
        helm-source-recentf
        helm-source-bookmarks
        helm-source-file-cache
        helm-source-files-in-current-dir
        helm-source-bookmark-set
        helm-source-locate))
```

## [company](https://github.com/company-mode/company-mode)
補完用パッケージ。

```elisp:init.el
(straight-use-package 'company)
(global-company-mode)
(setq company-transformers '(company-sort-by-backend-importance))
(setq company-idle-delay 0)
(setq company-minimum-prefix-length 3)
(setq company-selection-wrap-around t)
(setq completion-ignore-case t)
(setq company-dabbrev-downcase nil)
(global-set-key (kbd "C-M-i") 'company-complete)
(define-key company-active-map (kbd "C-n") 'company-select-next)
(define-key company-active-map (kbd "C-p") 'company-select-previous)
(define-key company-search-map (kbd "C-n") 'company-select-next)
(define-key company-search-map (kbd "C-p") 'company-select-previous)
(define-key company-active-map (kbd "C-s") 'company-filter-candidates)
(define-key company-active-map (kbd "C-i") 'company-complete-selection)
(define-key company-active-map [tab] 'company-complete-selection)
(define-key company-active-map (kbd "C-f") 'company-complete-selection)
(define-key emacs-lisp-mode-map (kbd "C-M-i") 'company-complete)
```
## [web-mode](http://web-mode.org/)
HTML書くとき用。

```elisp:init.el
(straight-use-package 'web-mode)
(add-to-list 'auto-mode-alist '("\\.html\\'" . web-mode))
(defun web-mode-hook ()
  (setq web-mode-html-offset   2)
  (setq web-mode-css-offset    2)
  (setq web-mode-script-offset 2)
  (setq indent-tabs-mode nil)
  (setq tab-width 2))
(add-hook 'web-mode-hook 'web-mode-hook)
```

## [php-mode](https://github.com/emacs-php/php-mode)
PHP書くとき用。補完に`company-php`入れてます。

```elisp:init.el
(straight-use-package 'php-mode)
(straight-use-package 'company-php)
(add-hook 'php-mode-hook
          '(lambda ()
             (company-mode t)
             (ac-php-core-eldoc-setup)
             (make-local-variable 'company-backends)
             (add-to-list 'company-backends 'company-ac-php-backend)))
```

**screenshot**
<img width="591" alt="company-php" src="https://qiita-image-store.s3.amazonaws.com/0/42069/5aba5e7a-092b-00f8-e748-ba3cd11f11aa.png">

## [js2-mode](https://code.google.com/archive/p/js2-mode/)
js書くとき用。補完に`company-tern`入れてます。

```elisp:init.el
(straight-use-package 'js2-mode)
(straight-use-package 'company-tern)
(add-to-list 'auto-mode-alist '("\\.js\\'" . js2-mode))
(add-hook 'js2-mode-hook 'tern-mode)
(add-to-list 'company-backends 'company-tern)
```
別途ternをインストールする必要があります。
``npm install -g tern``
**screenshot**
<img width="411" alt="company-tern" src="https://qiita-image-store.s3.amazonaws.com/0/42069/d89d7e05-61eb-8c44-7dcb-ff92a8229904.png">

## [flycheck](http://www.flycheck.org/en/latest/)
シンタックスチェック用。

```elisp:init.el
(straight-use-package 'flycheck)
(add-hook 'after-init-hook #'global-flycheck-mode)
```
## migemo
日本語インクリメンタルサーチ。

```elisp:init.el
(straight-use-package 'migemo)
(straight-use-package 'helm-migemo)
(setq migemo-command "cmigemo")
(setq migemo-options '("-q" "--emacs"))
(setq migemo-dictionary "/usr/local/Cellar/cmigemo/20110227/share/migemo/utf-8/migemo-dict")
(setq migemo-user-dictionary nil)
(setq migemo-regex-dictionary nil)
(setq migemo-coding-system 'utf-8-unix)
(load-library "migemo")
(migemo-init)
```
参考：[migemo.el : ローマ字で日本語検索する神ツールMigemoが更新されたよ！
](http://emacs.rubikitch.com/migemo/)
## swiper + migemo
isearchを一覧でだしてくれる。＋日本語対応。

```elisp:init.el
(global-set-key "\C-s" 'swiper)
(defvar swiper-include-line-number-in-search t)
(straight-use-package 'avy)
(straight-use-package 'swiper-helm)
(straight-use-package 'avy-migemo)
(avy-migemo-mode 1)
(require 'avy-migemo-e.g.swiper)
```
**screenshot**
<img width="761" alt="swiper" src="https://qiita-image-store.s3.amazonaws.com/0/42069/70c43786-7ff6-3227-29fa-48ad53543b4c.png">


# 番外：VSCode
普段は`emacs`なのですが、マークダウンをプレビュー見ながら書きたい時や、PDFにしたいとき用に`VSCode`入れました。
## Extensions
- Emacs Friendly Keymap
- Markdown All in One
- Markdown PDF

**screenshot**
<img width="1101" alt="markdown all in one" src="https://qiita-image-store.s3.amazonaws.com/0/42069/074784ba-560b-d91c-8c91-2933d6dc1bae.png">