Emacsの設定

Font設定

  • RIcty-Diminisedを別途インストールしておく。
  • Option-Set Default FontからGUIでフォントを設定する。
  • scratchバッファで(frame-parameter nil 'font)でフォント名を確認する。
  • その文字列を下記のように追記する。
(add-to-list 'default-frame-alist '(font . "-PfEd-Ricty Diminished-normal-normal-normal-*-15-*-*-*-*-0-iso10646-1"))

基本設定

(package-initialize)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))

;; Preference & Misc settings
(load-theme 'deeper-blue t)
(tool-bar-mode 0)
(setq inhibit-startup-message t)
(setq make-backup-files nil)
(setq ring-bell-function 'ignore)
(show-paren-mode t)
(setq frame-title-format "%f")
(column-number-mode t)
(line-number-mode t)

;; Key bindings
(define-key global-map "\C-h" 'delete-backward-char)
(define-key global-map "\C-z" 'undo)
(global-set-key [C-tab] 'next-multiframe-window)
(global-set-key [C-S-iso-lefttab] 'previous-multiframe-window)

;; font
(add-to-list 'default-frame-alist '(font . "-PfEd-Ricty Diminished-normal-normal-normal-*-15-*-*-*-*-0-iso10646-1"))

;; Install use-package.el
(when (not (package-installed-p 'use-package))
  (package-refresh-contents)
  (package-install 'use-package))

拡張パッケージ

(Caskはプロキシ周りでハマるのでパッケージ管理は,package.elとuse-package.elに変更した。)

補完関係(company, irony(c/c++), jedi(python))

  • 補間がauto-completeよりもcompanyの例を見るのでそっちにする.特に,C/C++ようにirony-modeも入れておく.Pythonにはcompany-jediを入れておく(jediは入れない).
  • Caskでcompany, company-ironyを指定しておく.
  • 初回起動時にはirony-install-server(c/c++), jedi:install-server(Python)を実行する.(この時にlibClangが無いとエラーになるので,libClang-devを入れておく.Macだとllvm --with-clangで入っている。Cmakeも必要なので注意。)
  • elpyのコード内移動(定義元へジャンプなど)は内部ではjediを使っている。よって,elpyでコード内移動がうまく動いていないときはjediの設定が間違っている。M-x elpy-configでjediがちゃんと見つかっているかチェックする。また,Ubuntu18.04はpythonがpython2がまだデフォルトなので,RPCもpython3を指定するようにする。

スニペット

  • 最低限の設定は下記。最近のバージョンはTABが展開キーだと指定する必要がある。
  • 下記の設定だと標準のyas-installed-snippet-dir内のsnippetと、自分で追加したsnippet(.emacs.d/snippet)が使用される。
  • 使い方としては、(キーバインドを変えているけど)、例えばpythonモードで、classでTABを打つとクラス定義のテンプレートを生成してくれるし、ifmでTABを押すとif name == 'main':を展開してくる。
  • 新しくsnippetを生成するときは、'C-x i i'でYasnippet編集バッファに移動して、名前(ファイル名)と、キー(TABで展開する指定文字)を決めて、その後ろに展開したいコードを書く。C-c, C-cで保存する。モードとか、フォルダを聞いてくるので適時応える。

dotemacs (use-package)

(require 'yasnippet)
(setq yas-snippet-dirs
      '("~/.emacs.d/snippets"
    yas-installed-snippets-dir))
(define-key yas-minor-mode-map (kbd "C-x i i") 'yas-insert-snippet)
(define-key yas-minor-mode-map (kbd "C-x i n") 'yas-new-snippet)
(define-key yas-minor-mode-map (kbd "C-x i v") 'yas-visit-snippet-file)
(yas-global-mode 1)
(custom-set-variables '(yas-trigger-key "TAB"))

;; Company (except for Python mode)
(use-package company
  :commands global-company-mode
  :init (progn
          (global-company-mode)
          (setq company-global-modes '(not python-mode cython-mode sage-mode))
          )
  :config (progn
            (setq company-tooltip-limit 20) ; bigger popup window
            (setq company-idle-delay .3)
            (setq company-minimum-prefix-length 3)
            (setq company-echo-delay 0)     ; remove annoying blinking
            (setq company-begin-commands '(self-insert-command))
            ))
;;   ;(define-key company-mode-map (kbd "TAB") 'company-complete)
;;   (define-key company-active-map (kbd "TAB") 'company-complete-common)
;;   (define-key company-active-map (kbd "M-h") 'company-show-doc-buffer))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Python
;; Python
(use-package flycheck
  :ensure t
  :init
  (global-flycheck-mode t)
  :config
  (setq flycheck-python-flake8-executable "flake8"))

;; Standard Jedi.el setting
(use-package jedi
  :ensure t
  :init
  (add-hook 'python-mode-hook 'jedi:setup)
  (setq jedi:complete-on-dot t)
  :config
  (use-package company-jedi
   :ensure t
   :init
   (add-hook 'python-mode-hook (lambda () (add-to-list 'company-backends 'company-jedi)))
   (setq  company-jedi-python-bin "python")))

(use-package elpy
  :ensure t
  :init (with-eval-after-load `python (elpy-enable))
  :config
  (progn
    ;; Use Flycheck instead of Flymake
    (when (require 'flycheck nil t)
      (remove-hook 'elpy-modules 'elpy-module-flymake)
      (remove-hook 'elpy-modules 'elpy-module-yasnippet)
      (remove-hook 'elpy-mode-hook 'elpy-module-highlight-indentation)
      (add-hook 'elpy-mode-hook 'flycheck-mode))
    (elpy-enable)
    ;; jedi is great
    (setq elpy-rpc-python-command "python3")
    (setq python-shell-interpreter "ipython3")
    (setq python-shell-interpreter-args "-i --simple-prompt")
    (setq elpy-rpc-backend "jedi")))

Cask編(もう使っていないけどメモとして残しておく)

package.elではなく,caskかEl-docというので管理するのが主流らしい. caskを使ってみる.

インストール

$ curl -fsSkL https://raw.github.com/cask/cask/master/go | python # ubuntu
$ brew install cask # OSX
$ export PATH="/home/nobunaga/.cask/bin:$PATH"

初期設定と使い方

$cd .emacs.d
$ cask init    # 初期化時に一度だけ実行.Caskというファイルが生成される.
$ cask install # Caskの指定にしたがって必要なパッケージをインストール.
$ cask update  # updateがあれば更新する.

Caskの書き方

  • (depends-on "package-name") でpackage-nameのパッケージが.emacs.d/.cask以下に保存される

init.elの設定

  • 下記を記入しておくと,Caskに書いたファイルを自動でrequireしてくれる.
(require 'cask "~/.cask/cask.el") ; Ubuntu
(require 'cask)                   ; OSX
(cask-initialize)
(global-company-mode 1)
;; c/c++
(add-hook 'c-mode-hook 'irony-mode)
(add-hook 'c++-mode-hook 'irony-mode)
(add-hook 'irony-mode-hook 'irony-cdb-autosetup-comile-options)
(add-to-list 'company-backends 'company-irony)
;; python
(require 'jedi-core)
(setq jedi:complete-on-dot t)
(setq jedi:use-shortcuts t)
(add-hook 'python-mode-hook 'jedi:setup)
(add-to-list 'company-backends 'company-jedi)
;; general
(setq comany-idle-delay 0)
(setq comany-minimum-prefix-length 2)
(setq comany-selection-wrap-around t)
;; (setq company-idle-delay 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 "<tab>") 'company-complete-selection)

Yasnippet

(require 'yasnippet)
(setq yas-snippet-dirs
      '("~/.emacs.d/snippets"
    yas-installed-snippets-dir))
(define-key yas-minor-mode-map (kbd "C-x i i") 'yas-insert-snippet)
(define-key yas-minor-mode-map (kbd "C-x i n") 'yas-new-snippet)
(define-key yas-minor-mode-map (kbd "C-x i v") 'yas-visit-snippet-file)
(yas-global-mode 1)
(custom-set-variables '(yas-trigger-key "TAB"))