博士以前

人間です

Spacemacs を設定した

最近なんとなく暇なので、spacemacs というエディタを使ってみようと思い色々設定していた。spacemacs は emacs をベースに vim の良いところを取り入れたエディタらしい。公式サイトには"The best editor is neither Emacs nor Vim, it's Emacs and Vim!"と書いてある。

僕は普段のエディタには emacs を使っているのだけど、最近は以下のようなことを思うようになっていた

  • 素の emacs は機能が貧弱なので、普通はパッケージをダウンロードして改造していくことになる。何か新しく追加したい時に、どのパッケージがイケてるのかを調べるのが面倒だった。

  • 強いエンジニアなら自分で調べて設定ファイルを書いていくのだろうけど、僕はこの手のことに関しては素人なので、世の中の多くの人が使っている機能が勝手に入る方が良かった。

  • vimの指の使い方を学んでみたかった。

以上のような理由から spacemacs をインストールして設定したのでメモを残しておく。なお使っているOSはMacだ。

設定ファイル(.spacemacs)は github に置いてある。

github.com

インストール

公式のgithubに書いてある通りに、まず emacs を入れその後 spacemacs を導入する。 こちらのブログにあるように、emacs のインストール時に spacemacs のアイコンを一緒に入れたり、あらかじめかっこいいフォントをダウンロードしておいたりすると後々良い感じになる。

ブランチ

上の手順でインストールすると、~/.emacs.dが git リポジトリになっているはずである。master ブランチは非常に遅れているのでgit checkout developしておくと良い(自己責任で)。 実際 master ブランチでは以下の設定が所々上手くいかなかった。

カスタマイズ

Spacemacs では pythonLaTeX のような個々の言語環境に対する設定はレイヤーという機能を通して行うことになる。 具体的には~/.spacemacsを編集することになる。このあたりも適当にググるか公式のドキュメントを読めばなんとなくわかろうだろう。 以下ではこの~/.spacemacsに行った変更について書く。

LaTeX環境

公式ドキュメントを参照する。 僕は今まで AUCTeX という emacs のパッケージを使って LaTeX 文書を書いていた。 Spacemacs の latex レイヤーを使うと、AUCTeX が使えるようになる。

LaTeX 文書に References があるときは何回もコンパイルする必要があるので、普通は LatexMk などで自動化すると思う。 僕は今まで emacs で使っていたコンパイル設定を、そのまま spacemacs に持ってきた。以下のようにdefun dotspacemacs/user-config ()を編集すれば良い。 だいたいTeX Wikiに書いてあった内容をコピペしているだけである。

(defun dotspacemacs/user-config ()
  "Configuration function for user code.
This function is called at the very end of Spacemacs initialization after
layers configuration.
This is the place where most of your configurations should be done. Unless it is
explicitly specified that a variable should be set before a package is loaded,
you should place your code here."
  (add-hook 'LaTeX-mode-hook
            '(lambda ()
               (setq TeX-command-default "Latexmk-pdfLaTeX")
               (setq japanese-TeX-command-default "Latexmk-upLaTeX-pdfdvi")
               (setq TeX-view-program-selection
                     '((output-dvi "Skim")
                       (output-pdf "Skim")))
               (setq TeX-view-program-list
                     '(("Skim" "/Applications/Skim.app/Contents/SharedSupport/displayline -b -g %n %s.pdf %b")))))
  (add-hook 'LaTeX-mode-hook
        (function (lambda ()
            (add-to-list 'TeX-command-list
                     '("Latexmk"
                       "latexmk %t"
                       TeX-run-TeX nil (latex-mode) :help "Run Latexmk"))
            (add-to-list 'TeX-command-list
                     '("Latexmk-upLaTeX-pdfdvi"
                       "latexmk -e '$latex=q/uplatex %%O %(file-line-error) %(extraopts) %S %(mode) %%S/' -e '$bibtex=q/upbibtex %%O %%B/' -e '$biber=q/biber %%O --bblencoding=utf8 -u -U --output_safechars %%B/' -e '$makeindex=q/upmendex %%O -o %%D %%S/' -e '$dvipdf=q/dvipdfmx %%O -o %%D %%S/' -norc  -pdfdvi %t"
                       TeX-run-TeX nil (latex-mode) :help "Run Latexmk-upLaTeX-pdfdvi"))
            (add-to-list 'TeX-command-list
                     '("Latexmk-upLaTeX-pdfps"
                       "latexmk -e '$latex=q/uplatex %%O %(file-line-error) %(extraopts) %S %(mode) %%S/' -e '$bibtex=q/upbibtex %%O %%B/' -e '$biber=q/biber %%O --bblencoding=utf8 -u -U --output_safechars %%B/' -e '$makeindex=q/upmendex %%O -o %%D %%S/' -e '$dvips=q/dvips %%O -z -f %%S | convbkmk -u > %%D/' -e '$ps2pdf=q/ps2pdf %%O %%S %%D/' -norc  -pdfps %t"
                       TeX-run-TeX nil (latex-mode) :help "Run Latexmk-upLaTeX-pdfps"))
            (add-to-list 'TeX-command-list
                     '("Latexmk-pdfLaTeX"
                       "latexmk -e '$pdflatex=q/pdflatex %%O %(file-line-error) %(extraopts) %S %(mode) %%S/' -e '$bibtex=q/bibtex %%O %%B/' -e '$biber=q/biber %%O --bblencoding=utf8 -u -U --output_safechars %%B/' -e '$makeindex=q/makeindex %%O -o %%D %%S/' '-synctex=1' -norc -pdf %t"
                       TeX-run-TeX nil (latex-mode) :help "Run Latexmk-pdfLaTeX"))
            (add-to-list 'TeX-command-list
                     '("Latexmk-LuaLaTeX"
                       "latexmk -e '$lualatex=q/lualatex %%O %(file-line-error) %(extraopts) %S %(mode) %%S/' -e '$bibtex=q/upbibtex %%O %%B/' -e '$biber=q/biber %%O --bblencoding=utf8 -u -U --output_safechars %%B/' -e '$makeindex=q/upmendex %%O -o %%D %%S/' -norc  -pdflua %t"
                       TeX-run-TeX nil (latex-mode) :help "Run Latexmk-LuaLaTeX"))
            (add-to-list 'TeX-command-list
                     '("Latexmk-LuaJITLaTeX"
                       "latexmk -e '$lualatex=q/luajitlatex %%O %(file-line-error) %(extraopts) %S %(mode) %%S/' -e '$bibtex=q/upbibtex %%O %%B/' -e '$biber=q/biber %%O --bblencoding=utf8 -u -U --output_safechars %%B/' -e '$makeindex=q/upmendex %%O -o %%D %%S/' -norc  -pdflua %t"
                       TeX-run-TeX nil (latex-mode) :help "Run Latexmk-LuaJITLaTeX"))
            (add-to-list 'TeX-command-list
                     '("Latexmk-XeLaTeX"
                       "latexmk -e '$xelatex=q/xelatex %%O %(file-line-error) %(extraopts) %S %(mode) %%S/' -e '$bibtex=q/upbibtex %%O %%B/' -e '$biber=q/biber %%O --bblencoding=utf8 -u -U --output_safechars %%B/' -e '$makeindex=q/upmendex %%O -o %%D %%S/' -norc  -pdfxe %t"
                       TeX-run-TeX nil (latex-mode) :help "Run Latexmk-XeLaTeX")))))

  )

これでC-c C-cと入力するとコマンドの選択肢が表示され、Latexmk-pdfLaTeXで pdflatex でコンパイルできる。終わったら再びC-c C-cと打ってViewを選ぶと PDF が表示される。

Julia環境

Spacemacs には Julia レイヤーも用意されている。公式のドキュメントを読んでその通りに設定すれば良い。

LSPの設定をするには Julia の LanguageServer.jl を入れる必要がある。これは Julia で通常通り ] add LanguageServerをすれば良い。 これで同時にSymbolServer.jlも入る。ただし現段階 (2019年7月23日) では、きちんと] update SymbolServerをしておかないと spacemacs を起動しても disconnected と表示され接続がキャンセルされてしまった。

なお公式のドキュメントには PackageCompiler.jl を使って、あらかじめLanguageServer.jlコンパイルしておかないと Spacemacs の起動が遅くなると書いてある。 しかしこのコンパイルがなぜか失敗するので、とりあえずコンパイルせずに使っているのだけど、今のところは起動が異様に遅いということにはなっていない。