普段の開発は IntelliJ 製品をメインでつかっている.JavaScript/Nodejs や Ruby 系の開発が多く,WebStorm・RubyMine をかれこれ 5 年くらい使っている.一方,Python や Go 使ったり,このブログをかくときは Emacs を使っているが,ちゃんと設定せず使っていてツラみだったので,設定を見直しした.

先に述べておくと,自分の Emacs に対するこだわりやスキルは初心者と言っても過言ではなく,これらがベストだとは思っていない.他のやり方でもそれできるじゃん,というのは多々あると思う.かれこれ何回か Emacs の設定をイジっては挫折してきたけれど,これらの設定で落ち着いてきた.

環境

開発環境は次の通り. Emacs はデフォルトで入っているのが,バージョン 24 系だった.ちゃんと使い始めるなら最新版にしたかったので brew install emacs でインストールした.

  • macOS High Sierra 10.13.5
  • Mac Book Pro (15-inch, 2016)
  • US Keyboard (改良版, 改良版のバタフライキーボード,何回か修理に出したため,幸い最新版になっている,最新版は Option キーにオプションマークがついている)
  • GNU Emacs 26.1

straight.el でパッケージ管理

パッケージ管理を Cask から straight.el に乗り換えた.

straight.el: next-generation, purely functional package manager for the Emacs hacker.

Emacs 系のパッケージマネージャーの中では最新で更新も活発な模様. Note: straight.el supports a minimum version of Emacs 24.4, and works on macOS, Windows, and most flavors of Linux. とあるが, Emacs 26.1 でも今のところ,何も支障はない.

.emacs.d/init.elこれだけ記述すればOK!というシンプルさが,個人的には嬉しかった点. 記述後,Emacs 起動に若干時間がかかる.

(straight-use-package 'company)

という記述で,インストールされていない場合に限り,MELPA, GNU ELPA, or EmacsMirror などのパッケージホストから自動でダウンロード&インストールされる.(Emacs 起動時) パッケージは .emacs.d/straight/repos 以下に入る.Emacsパッケージマネージャ決定版:これからのパッケージ管理はstraight.elで決まり!辺りが詳しく解説している.

※ この初回起動で init.el などでエラーがあると,設定が正常に完了しないことがある.例えば MELPA などのパッケージホストの設定が完了せず, パッケージの自動ダウンロードが Not Found でエラーになる. init.el のエラーを解消後,一度 .emacs.d/straight を削除してから Emacs を起動すると再度セットアップされた.

Basic Settings

;; UTF-8
(prefer-coding-system 'utf-8)
;;; Disable *.~
(setq make-backup-files nil)
;;; Diable .#*
(setq auto-save-default nil)
;; column / line
(column-number-mode t)
(global-linum-mode t)
(setq linum-format "%4d \u2502")
;; show full path in the titlebar
(setq frame-title-fomat "%f")
;; tab
(setq-default tab-width 4)
;; startup message
(setq inhibit-startup-message t)
;; color of background
(set-face-background 'default "black")
(set-face-foreground 'default "green")
;; color of selected
(set-face-background 'region "white")
(set-face-foreground 'region "black")
;; pareable brackets
(show-paren-mode t)
;; move multi window
(global-set-key (kbd "C-x <left>")  'windmove-left)
(global-set-key (kbd "C-x <down>")  'windmove-down)
(global-set-key (kbd "C-x <up>")    'windmove-up)
(global-set-key (kbd "C-x <right>") 'windmove-right)
;; window opacity
(set-frame-parameter nil 'alpha 75)
;; C-h is backspace
(global-set-key "\C-h" 'delete-backward-char)

Used packages

straight-use-package で入れているパッケージを書く.

;; company
(straight-use-package 'company)
(use-package company)
(global-company-mode)
(setq company-idle-delay 0)
(setq company-minimum-prefix-length 2)
(setq company-selection-wrap-around t)

;; neotree
(straight-use-package 'neotree)
(use-package neotree)
(global-set-key [f8] 'neotree-toggle)

;; undo-tree
(straight-use-package 'undo-tree)
(use-package undo-tree)
(global-undo-tree-mode t)
(global-set-key (kbd "M-/") 'undo-tree-redo)

;; projectile
(straight-use-package 'projectile)
(projectile-global-mode)

;; multiple-cursors
(straight-use-package 'multiple-cursors)
(straight-use-package 'smartrep)
(use-package multiple-cursors)
(use-package smartrep)
(declare-function smartrep-define-key "smartrep")
(global-set-key (kbd "C-M-c") 'mc/edit-lines)
(global-set-key (kbd "C-M-r") 'mc/mark-all-in-region)
(global-unset-key "\C-t")
(smartrep-define-key global-map "C-t"
  '(("C-t"      . 'mc/mark-next-like-this)
    ("n"        . 'mc/mark-next-like-this)
    ("p"        . 'mc/mark-previous-like-this)
    ("m"        . 'mc/mark-more-like-this-extended)
    ("u"        . 'mc/unmark-next-like-this)
    ("U"        . 'mc/unmark-previous-like-this)
    ("s"        . 'mc/skip-to-next-like-this)
    ("S"        . 'mc/skip-to-previous-like-this)
    ("*"        . 'mc/mark-all-like-this)
    ("d"        . 'mc/mark-all-like-this-dwim)
    ("i"        . 'mc/insert-numbers)
    ("o"        . 'mc/sort-regions)
    ("O"        . 'mc/reverse-regions)))
  • company : 補完用パッケージ
  • neotree : CurrentDirectory をプロジェクト風に表示する
  • projectile : Git管理されているディレクトリ内をファイル名などで検索できる.M-x M-f によるファイル検索の代わりに,C-c C-p f でファイル名の一部などヒットしたファイルを瞬時に開けるようにしている.
  • multiple-cursors + smartrep : 複数 Caret を配置して同時に文字列操作できる.(エディタで一番欲しい機能はこれかもしれない)

その他,開発環境に合わせた *-mode 系のパッケージを設定している.

iTerm2 x Ricty Font

iTerm2 で Emacs を起動している.プロファイルのフォント設定は プログラミング用フォント Rictyを使っている.英字と日本語が並んだときに違和感がなく気に入っている. tmux はまだ必要に駆られていないが,どこかのタイミングで使ってみたいと思っている.

Vim ではなく Emacs で

なんとなく身近には Vim 勢が多い気がしていたので,とある案件で Python 開発するときに,Vim と Emacs 両方で開発してみた.結果,Vim のモード切り替えが辛すぎて結局は Emacs に戻ってきてしまった.