技術memo

関数型ゴースト

Spacemacsを使い始めた話 #emacs #spacemacs

Spacemacsってなに?

  • Emacsの拡張(魔改造?)
  • 全体的に人間に優しくなった(キーボードショートカットのサジェストとか出たりする)
  • 設定管理をいいかんじにしてくれる(layerシステム)
  • キーバインドVim(Evil)かEmacsか選べる
    • 私はEmacsバインドで使ってます

おすすめする理由

  • 素のEmacsよりはいろいろ親切(上記)
  • とりあえず各種プログラミング言語IDEとか覚えなくても開発し始められて便利
    • デバッガとかは諦めてください
    • Emacsキーバインドに洗脳されることさえ受け入れれば入力で迷わなくなります
      • Vim派でもEvilなら大丈夫(たぶん)
  • (Spacemacsに限った話ではないけど)ターミナルまでEmacs上で操作できるようになってくると、マウス触ることがほぼなくなるくらいにはキーボードだけで操作できる時間が増えてうれしいです
  • Vim派のひとと宗教戦争(笑)でネタにできて楽しいです(冗談です)

導入方法

めんどうなのでググってください

使っててオススメの拡張

利用中のバージョンはSpacemacs 0.200.7、Emacs 24.5.1、Ubuntu 16.04.2 LTS(デスクトップ)です。

もろもろ検索 ivy

Spacemacsのデフォルトではhelmが推奨ですが、ivy(swiper)もいい感じに動いてくれます。 migemoローマ字入力でいいかんじに日本語を検索してくれるやつです。 ivyでmigemoを使うのにググってもよくわからなかったのですが、avy-migemo-e.g.swiperでいいみたいです。 cmigemoは別途インストールしてください。 クリップボード履歴の検索はcounselってやつみたいです。

設定

  • dotspacemacs-configuration-layersに ivy
  • helm関連のデフォルト設定は全部コメントアウト
  • dotspacemacs-additional-packagesに avy-migemo
  • dotspacemacs/user-configで以下
  ;; migemo
  (require 'migemo)
  (setq migemo-command "cmigemo")
  (setq migemo-options '("-q" "--emacs" "-i" "\a"))
  (cond
   ((eq system-type 'darwin)
    (setq migemo-dictionary "/usr/local/share/migemo/utf-8/migemo-dict")
    )
   ((eq system-type 'gnu/linux)
    (setq migemo-dictionary "/usr/share/cmigemo/utf-8/migemo-dict")
    )
   ((eq system-type 'windows-nt)
    (setq migemo-dictionary "c:/app/cmigemo-default-win64/dict/utf-8/migemo-dict")
    ))
  (setq migemo-user-dictionary nil)
  (setq migemo-regex-dictionary nil)
  (setq migemo-coding-system 'utf-8-unix)
  ;; initialize migemo
  (migemo-init)
  ;; avy-migemo
  (require 'avy-migemo)
  (avy-migemo-mode 1)
  (require 'avy-migemo-e.g.swiper)
  ;; M-yでkill-ring履歴から検索
  (global-set-key (kbd "M-y") 'counsel-yank-pop)

シェル multi-term

Emacs上でシェルを動かす場合はいくつか選択肢があるのですが、なんかよさそうだったのでmulti-termにしてみました。 シェル上でのコピペがつらいなーという感じだったのですが、コピーしたいときはモード切り替えするのが無難みたいです。 Windows上でシェルを動かすのは諦めたので、もっぱらUbuntuでしか使ってないです。

設定

  • dotspacemacs-configuration-layersに shell
  • dotspacemacs/user-configで以下。キーバインドはお好みで。
  ;; multi-term
  ;; emacs に認識させたいキーがある場合は、term-unbind-key-list に追加する
  (require 'multi-term)
  (dolist (x '("C-q"))
    (add-to-list 'term-unbind-key-list x))
  ;; terminal に直接通したいキーがある場合は、term-unbind-key-listからdeleteする
  ;(dolist (x '("C-c"))
  ;  (delete x term-unbind-key-list))
  ;; term-mode-hook
  (add-hook
   'term-mode-hook
   '(lambda ()
      (define-key term-raw-map "\C-h" 'term-send-backspace)
      (define-key term-raw-map "\C-y" 'term-paste)
      (define-key term-raw-map term-view-toggle-key 'toggle-term-view)))
  ;; C-q c で multi-term を起動する
  (define-key ctl-q-map (kbd "c") 'multi-term); 事前に (defvar ctl-q-map (make-keymap)) (define-key global-map (kbd "C-q") ctl-q-map) とかしてるのが前提なので普通は global-set-keyとかでいけるはずなので適当にしてください
  ;; C-t で term-mode と fundamental-mode + view-modeを切り替える
  (setq term-view-toggle-key (kbd "C-t"))
  (defun toggle-term-view () (interactive)
         (cond ((eq major-mode 'term-mode)
                (fundamental-mode)
                (view-mode)
                (local-set-key term-view-toggle-key 'toggle-term-view)
                (setq multi-term-cursor-point (point)))
               ((eq major-mode 'fundamental-mode)
                (View-exit)
                (goto-char multi-term-cursor-point)
                (multi-term-internal))))

ファイルツリーをEmacs上で見る neotree

spacemacsのデフォルトで使えます。 M-x neotreeとかやると起動します。面倒ならglobal-set-keyしてください。 M-x neotree-dirまたはneotreeのバッファ上でC-c cとやるとツリー表示のルートディレクトリを移動できます。 neotreeのバッファに移動してからのswiperでのバッファ内検索が本当に捗るのでおすすめです。そうでもないか。

その他雑感

あとは各言語のlayerいれたりキーバインドをいじったりしてるくらいです。 オレオレレイヤーは作らずに、dotspacemacs/user-configを秘伝のタレ置き場として雑につかっても、とりあえずなんとかなってます。

ところでキーバインドでC-hをバックスペースにしたい派なんですが、その場合spacemacsキー(EvilのひとはSPC, Emacsバインドの人はM-m)を押したときのヘルプのページングとバインドが被ります。いろいろ試したんですが、とりあえず下記にしたらうまくいきました。理由はよくわかりません。とりあえずC-hかF1押しておけばいいかんじに解釈してくれます。

  (global-set-key (kbd "C-h") 'delete-backward-char)
  (global-set-key (kbd "<F1>") help-map)

あとWindows10でNTEmacs使ってる場合、M-mを押すとウィンドウが最小化されて「ウオアアアアア!!!」ってなるんですが未解決です。たすけてください。

とりあえずこんなところで。