Windows10でEmacs26を使う

- OS：Windows10 Pro 64bit
- バージョン：1909

# 1. Emacs26.3のインストール

- [https://www.gnu.org/software/emacs/](https://www.gnu.org/software/emacs/download.html#windows) から`emacs-26.3-x86_64.zip`をダウンロード
- `C:\USR\TOOl\`で解凍
- `C:\USR\TOOL\emacs-26.3\bin\runemacs.exe`へのショートカットを作成


# 2. 小ツールのインストール

### 2-1. C/Migemo
- [https://www.kaoriya.net/software/cmigemo/](https://www.kaoriya.net/software/cmigemo/) から`cmigemo-default-win64-20110227.zip`をダウンロード
- `C:\USR\TOOl\`で解凍
- `C:\USR\TOOL\cmigemo-default-win64`を`C:\USR\TOOL\cmigemo`にフォルダ名変更

### 2-2. ripgrep
- [https://github.com/BurntSushi/ripgrep](https://github.com/BurntSushi/ripgrep/releases) から`ripgrep-12.0.1-x86_64-pc-windows-gnu.zip`をダウンロード
- `C:\USR\TOOl\`で解凍
- `C:\USR\TOOL\ripgrep-12.0.1-x86_64-pc-windows-gnu\rg.exe`を`C:\USR\bin\`にコピー

### 2-3. Universal Ctags
- [https://github.com/universal-ctags/ctags-win32/releases](https://github.com/universal-ctags/ctags-win32/releases) から`ctags-2020-04-18_f45cd56c-x64.zip`をダウンロード
- `C:\USR\TOOl\`で解凍
- `C:\USR\TOOL\ctags-2020-04-18_f45cd56c-x64\ctags.exe`を`C:\USR\bin\`にコピー


# 3. Emacs-Lispのインストール

- `$HOME/.emacs`を編集してMELPAを追加

```elisp:~/.emacs
(require 'package)
(add-to-list 'package-archives
             '("melpa-stable" . "https://stable.melpa.org/packages/") t)
(package-initialize)
```

- Emacsを起動して `M-x package-list-packages` を実行

- 次のパッケージを`i`で選択して`x`でインストール（`u`で選択解除）
    - csharp-mode 0.9.2 (melpa-stable)
    - migemo 1.9.2 (melpa-stable)
    - php-mode 1.22.2 (melpa-stable)
    - rg 1.8.1 (melpa-stable)

# 4. ~/.emacs の設定

### 4-1. C/Migemo
```elisp:~/.emacs
;;; C/Migemo (melpa-stable)
;; https://www.kaoriya.net/software/cmigemo/
;; https://github.com/emacs-jp/migemo
(require 'migemo)
(setq migemo-command "C:/USR/TOOL/cmigemo/cmigemo.exe")
(setq migemo-options '("-q" "--emacs"))
(setq migemo-dictionary "C:/USR/TOOL/cmigemo/dict/utf-8/migemo-dict")
(setq migemo-user-dictionary nil)
(setq migemo-regex-dictionary nil)
(setq migemo-coding-system 'utf-8-unix)
(migemo-init)
```

### 4-2. ripgrep
```elisp:~/.emacs
;;; rg (melpa-stable)
;; https://github.com/dajva/rg.el
(require 'rg)
(rg-enable-default-bindings)
```

### 4-3. Majorモード
```elisp:~/.emacs
;;; C# mode (melpa-stable)
(setq auto-mode-alist
      (append '(("\\.cs$" . csharp-mode)) auto-mode-alist))
(autoload 'csharp-mode "csharp-mode" "Major mode for editing C# code." t)

;;; PHP mode (melpa-stable)
(setq auto-mode-alist
      (append '(("\\.php$" . php-mode)) auto-mode-alist))
(autoload 'php-mode "php-mode" "Major mode for editing php code." t)
```

# 5. その他の設定

### 日本語
```elisp:~/.emacs
;;; 漢字コードの指定 (端末画面ではterminal-coding-systemが必須)
(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-buffer-file-coding-system 'utf-8-unix)
(setq default-process-coding-system '(utf-8 . utf-8))
(setq default-file-name-coding-system 'cp932)
(set-coding-system-priority 'utf-8
                            'cp932
                            'euc-jp
                            'iso-2022-jp)
(defun reread-file-coding()
  (interactive)
  (universal-coding-system-argument "sjis-dos")
  (revert-buffer nil t t)
  )
(global-set-key "\M-r" 'reread-file-coding)

;;; IMEの設定
(set-language-environment "Japanese")

;; フォント設定
;; http://misohena.jp/blog/2016-01-21-emacs-font-size-adjustment.html
;; MS Mincho, MS Gothic, HGれいしっく, Cica
;; https://github.com/miiton/Cica
(set-face-attribute 'default nil :family "MS Mincho" :height 110)
(set-fontset-font nil 'cp932 (font-spec :family "MS Mincho"))
(setq-default line-spacing 0.1)
```

### キー操作
```elisp:~/.emacs
;;; assign BackSpace to \C-h
(global-set-key "\C-h" 'delete-backward-char)

;;; ソースコード折り畳み表示
(add-hook 'c-mode-hook      '(lambda () (hs-minor-mode 1)))
(add-hook 'c++-mode-hook    '(lambda () (hs-minor-mode 1)))
(add-hook 'csharp-mode-hook '(lambda () (hs-minor-mode 1)))
(add-hook 'php-mode-hook    '(lambda () (hs-minor-mode 1)))

(global-set-key "\C-\\" 'hs-toggle-hiding)
(global-set-key "\M-\\" 'hs-hide-level)

;;; disable [kanji] & [\C-\]
(global-set-key [M-kanji] 'ignore)
(global-set-key [kanji]   'ignore)
```

### 画面表示
```elisp:~/.emacs
;;; 表示画面の設定 (Ｘ上ではfontset部分が必須)
(setq default-frame-alist
      (append
       '((line-space . "0")
         (width . 80)
         (height . 56)
         (top . 16)
         (left . 160)
;        (font . "fontset-standard")
;        (font . "fontset-startup")
         )
       default-frame-alist))

(set-foreground-color "cornsilk")
(set-background-color "#002800")
(setq hilit-mode-enable-list    nil
;      hilit-background-mode     'light
      hilit-background-mode     'dark
      hilit-inhibit-hook        nil
      hilit-inhibit-rebinding   nil)

;;; enable visual feedback on selections
(setq transient-mark-mode t)

;;; default to better frame titles
(setq frame-title-format
      (concat  "%b - emacs@" system-name))

;;; モードラインの設定
(setq display-time-day-and-date t)      ;; 曜日・月・日
(setq display-time-24hr-format t)       ;; 24時間表示
(display-time-mode t)                   ;; 現在時刻
(line-number-mode t)                    ;; 行番号
(column-number-mode t)                  ;; 桁番号
(size-indication-mode t)                ;; ファイルサイズ

;;; ディレクトリ表示設定
(setq dired-listing-switches "-alU")
```

### Majorモード
```elisp:~/.emacs
;;; Emacs Lispモード
(setq auto-mode-alist
      (append '(("\\.emacs*" . emacs-lisp-mode)) auto-mode-alist))

;;; Shellモード
(setq auto-mode-alist
      (append '(("\\.bash_*" . sh-mode)) auto-mode-alist))

;;; Makefileモード
(setq auto-mode-alist
      (append '(("Makefile*" . makefile-mode)
                ("Makehead$" . makefile-mode)
                ("Make.def$" . makefile-mode)) auto-mode-alist))

;;; ChangeLogモード
(setq auto-mode-alist
      (append '(("Changelog$" . change-log-mode)
                ("ChangeLog$" . change-log-mode)) auto-mode-alist))

;;; Octave/MATLABの設定
(setq auto-mode-alist
      (append '(("\\.m$" . octave-mode)) auto-mode-alist))

;;; C++モード
(setq auto-mode-alist
      (append '(("\\.c$" . c++-mode)
                ("\\.h$" . c++-mode)
                ("\\.i$" . c++-mode)
                ("\\.cu$" . c++-mode)) auto-mode-alist))

;;; C#モード(melpa-stable)
(setq auto-mode-alist
      (append '(("\\.cs$" . csharp-mode)) auto-mode-alist))
(autoload 'csharp-mode "csharp-mode" "Major mode for editing C# code." t)

;;; PHPモード(melpa-stable)
(setq auto-mode-alist
      (append '(("\\.php$" . php-mode)) auto-mode-alist))
(autoload 'php-mode "php-mode" "Major mode for editing php code." t)
(add-hook 'php-mode-user-hook
          'turn-on-font-lock)
(add-hook 'php-mode-user-hook
          '(lambda () (define-abbrev php-mode-abbrev-table "ex" "extends")))

;;; Jave Script(JSON)モード
(setq auto-mode-alist
      (append '(("\\.jsn$" . js-mode)) auto-mode-alist))
; JSON形式の整形方法
;   1. 範囲選択
;   2. M-x json-pretty-print
```

### タブ・インデント設定
```elisp:~/.emacs
;;; 自動インデント(C-jとRetの入れ替え)
(setq electric-indent-mode nil)

;;; タブ設定
(setq-default c-basic-offset 4          ;; 基本インデント量 4
              tab-width 4               ;; タブ幅 4
              indent-tabs-mode nil)     ;; タブ or スペースでインデント

;;; 全角空白とタブの可視化
;; http://syohex.hatenablog.com/entry/20110119/1295450495
(require 'whitespace)
(setq whitespace-style '(face
                         tabs
                         tab-mark
                         spaces
                         space-mark
                         trailing))
(setq whitespace-display-mappings
      '((tab-mark ?\t [?\u00BB ?\t] [?\\ ?\t])))
(set-face-foreground 'whitespace-tab "#000000")
(set-face-background 'whitespace-tab "#FFFF80")
(set-face-underline  'whitespace-tab nil)
(set-face-foreground 'whitespace-space "#000000")
(set-face-background 'whitespace-space "#001800")
(set-face-bold-p     'whitespace-space nil)
(global-whitespace-mode 1)

;;; Cモード
;; http://d.hatena.ne.jp/i_s/20091026/1256557730
(add-hook 'c-mode-common-hook
          '(lambda()
             ;;(c-set-style "bsd")
             ;; 連続する空白の一括削除
             (c-toggle-hungry-state t)
             ;; タブ幅4
             (setq tab-width 4)
             ;; インデントは空白文字で行う(TABコードを空白に変換)
             (setq indent-tabs-mode nil)
             ;; インデント幅計算用基数
             (setq c-basic-offset 4)
             ;; 全自動インデント有効
             (setq c-auto-newline t)
             ;; TABキーはインデント(nilならTABコード入力)
             (setq c-tabs-always-indent t)
             ;; 演算式が複数行にまたがる時のオフセット
             (c-set-offset 'statement-cont 'c-lineup-math)
             ))

;;; C++モード
;; http://www.02.246.ne.jp/~torutk/cxx/emacs/indentation.html
(add-hook 'c++-mode-hook
          '(lambda()
             (c-set-style "bsd")
             ;; namespace {}の中はインデントしない
             (c-set-offset 'innamespace 0)
             ))

;;; C#モード(melpa-stable)
;; https://qiita.com/fujimisakari/items/d043a2fae31ed740e290
(add-hook 'csharp-mode-hook
          '(lambda()
             ;;(c-set-style "stroustrup")
             ;;(font-lock-add-magic-number)
             ;; 連続する空白の一括削除
             (c-toggle-hungry-state t)
             ;; 全自動インデント有効
             (setq c-auto-newline t)
             ;; TABキーはインデント(nilならTABコード入力)
             (setq c-tabs-always-indent t)
             ;; 演算式が複数行にまたがる時のオフセット
             (c-set-offset 'statement-cont 'c-lineup-math)
             (setq comment-column 40)
             (c-set-offset 'substatement-open 0)
             (c-set-offset 'case-label '+)
             (c-set-offset 'arglist-intro '+)
             (c-set-offset 'arglist-close 0)
             ;;(auto-complete-mode)
             ))

;;; PHPモード(melpa-stable)
(add-hook 'php-mode-hook
          (defun php-mode-hook ()
;            ;; c-mode のスタイル (コメントアウトした場合 "gnu")
;            (c-set-style "linux")
;            ;; 連続する空白の一括削除 (必要なければコメントアウトする)
            (c-toggle-hungry-state t)
;            ;; コメント行のインデント (必要なければコメントアウトする)
;            (setq c-comment-only-line-offset 0)
;            ;; コメントのスタイル (必要なければコメントアウトする)
            (setq comment-start "// "
                  comment-end   ""
                  comment-start-skip "// *")
            ))

```

### 最終更新日付
※write-file-hooksからbefore-save-hookに変更

```elisp:~/.emacs
;;; 最終更新日の自動挿入
;;;   ファイルの先頭から 8 行以内に Time-stamp: <> または
;;;   Time-stamp: " " と書いてあれば、セーブ時に自動的に日付が挿入されます
(if (not (memq 'time-stamp before-save-hook))
    (setq before-save-hook
          (cons 'time-stamp before-save-hook)))
```

### 個人設定
```elisp:~/.emacs
;;; [~/.emacs]          Time-stamp: <2020-04-18 14:19:13 username>
(setq user-full-name "Full Name")
(setq load-path (cons "~/.emacs.d/site-lisp/" load-path))
```