emacs

ネイティブコンパイルEmacsの登場

April 27, 2021
emacs

日本時間の2021年4月26日午前3時6分、Emacsのmasterブランチにfeature/native-compブランチがマージされました(コミット:Merge branch ‘feature/native-comp’ into into trunk)。これにより、HEADのEmacsをビルドすると、Native compilation機能を兼ね備えたネイティブコンパイルEmacs、通称Gcc Emacsが使えるようになりました。 ネイティブコンパイルEmacsの機能 # ネイティブコンパイルEmacs(以下、Gcc Emacsと呼びます)は、Andrea Corallo、Luca Nassi、Nicola Mancaの3名によるBringing GNU Emacs to Native Code という論文で詳細が説明されています。 簡単に説明すると、これまでのEmacsは、Elispの読み込みを早くするため*.elファイルをバイトコンパイルして*.elcというバイトコードファイルを作成して読み込んでいましたが、Gcc Emacsでは*.elファイルをGCCを使ってコンパイル(これの工程をバイトコンパイルに対してネイティブコンパイルと呼んでいます)して*.elnというバイナリファイルを作成して読み込むことで、バイトコードと比べて2.3倍から42倍ほど高速化させたという話です。 ネイティブコンパイルされたElispファイルをEmacsで開いてみると、上図のようにバイナリファイルになっていることがわかります。 Emacsが早くなるという話であれば、飛び付かないわけにはいきません。そこで、早速試しにビルドしてみました。 macOSにおけるGcc Emacsのビルド # それでは、macOSでGcc Emacsをビルドしてみたいと思います。まずは、必要なライブラリをインストールしてビルド環境を整えましょう。 Windows on WSLの人はEmacsに来たnative compileを試す - ぐるっとぐりっどの記事を参考にしてみてください。 GCCでlibgccjitを使用する # Gcc EmacsはGCCとEmacsとのインターフェイスにlibgccjitを利用しています。そのため、Gcc Emacsをビルドするにはlibgccjitのインストールが必要です。僕はHomebrewでインストールしました。 $ brew install libgccjit libgccjitをインストールしたら、libgccjitを利用したコードをビルドできるか確認してみましょう。 Tutorial part 1: “Hello world”に書かれている通りにコードをビルドしてみます。 $ touch tut01-hello-world.c $ pbpaste > tut01-hello-world.c # ブラウザでコピーして、pbpasteでファイルに書き込む $ gcc tut01-hello-world.c -o tut01-hello-world -lgccjit ld: library not found for -lgccjit clang: error: linker command failed with exit code 1 (use -v to see invocation) 僕の環境では、libgccjitのライブラリが見つけられず、上記のエラーが表示されてしまいました。 ...

風になりたい奴だけがEmacsを使えばいい 2020

September 26, 2020
emacs

先日、Emacsに一生入門できねえ2020という記事を目にした。 確かにEmacsは難しい。まったくもって増田の言う通りだ。うんうんと頷きながら、過去に自分が書いた「風になりたい奴だけが Emacs を使えばいい。」という記事が脳裏に浮かんだ。 10年間の出来事 # 僕が「風になりたい奴だけがEmacsを使えばいい」と言った記事は2010年9月4日に投稿されていて、あれから実に10年の月日が経過していた。とても懐しい。 振り返ればこの10年間でエディタの世界は大きく変わった。次世代エディタを銘打ったAtomが誕生し、エディタにおける表現の限界をぶち壊した。そして後続で登場したVSCodeが一気にシェアを奪い、一瞬でトップシェアの座に立ってしまった。予想しなかった未来があった。 一方、Emacsはどうなったかと言えば、メジャーバージョンが23から27になった。しかし、起動したてのEmacsはまるで時が止まっているかのように見た目に変化がなく、表面からのぞかせるEmacsの顔は驚くほど何も変化していなかった。 2010年10月のEmacs 2020年9月のEmacs Emacsは荒木飛呂彦 # この10年、見た目がまったく変化していないEmacsをどう捉えれば良いのか考えてみて、荒木飛呂彦と同じと捉えれば良いことが分かった。 荒木飛呂彦先生の比較表2020年版を作りました pic.twitter.com/ADUBHF0r6W — 男爵芋 (@Japerrin_1838) February 15, 2020 荒木飛呂彦先生(荒木飛呂彦と入力すると吸血鬼がサジェストされる)もまた10年間まるで時が止まっているかのように見た目の変化がないことが分かる。 つまり、Emacsは荒木飛呂彦であり、吸血鬼であり、石仮面をかぶって「人間を止めるぞ!ジョジョーーッ!!」といって、永遠の若さを手に入れていたのである。もしかすると、すでにエイジャの赤石を使って究極生命体になっていてもおかしくはない。 Emacsはハッカーのためのエディタ # 話を元に戻そう。Emacsがなぜ難しいのかだ。 端的に言えば、Emacsはリチャード・ストールマン(RMS)が作ったハッカーのためのエディタだからに他ならない。ハッカーのハッカーによるハッカーのためのエディタなのだ。 Emacsを使っているハッカーと言えば、ドナルド・クヌース(Donald Knuth)、グイド・ヴァン・ロッサム(Guido van Rossum)、まつもとゆきひろ(Matz)、スティーブ・イエギ(Steve Yegge)など、早々たるメンバーが顔を揃えている。それを聞いて、「じゃあ俺も」と憧れを抱くのは自然な流れだと言える。 しかし、グイドは「Emacsは新しいエンジニアには本当にオススメしない(つまり使うな)」と言っていて、その理由として「It just exists for old brain compatibility.(古い頭脳との互換性のために存在している)」と述べている。 Really I don't recommend Emacs to new developers. It just exists for old brain compatibility. ...

Emacsで自動修正を実現する auto-fix.el

January 30, 2019
emacs

AtomからEmacsに引越しする中で、AtomにあってEmacsにはなく、これがないと快適なプログラミングは厳しいというパッケージや機能が幾つかありました。 その中のひとつが、コードの自動修正機能を提供するパッケージです。 エディタでコードを自動修正する # 個人的な感覚ではGo言語とgofmtの登場以降、いわゆるインデントのタブ・スペース論争やコーディングスタイルについては、プロジェクト毎に利用するコードフォーマッタに任せるという流れで決着がついたと思っています。 最近良く書くJavaScriptやTypeScriptでは、ESLint、TSLint、Prettierが主流になったお陰もあり、僕みたいな様々な会社のプロジェクトで開発を行う人間も、インデント、クォート、文末のセミコロンなどの修正はプログラムに任せて、僕は適当に書いて保存するだけで自然に統一がはかられるようになりました。 Atomでは、この自動修正とエディタとの連携はlinter-eslintやatom-beautifyなどのプラグインによって実現していましたが、Emacsでは、個別の言語で修正させるパッケージはちらほらありますが、汎用的に使えるパッケージは僕の中ではまだ見つかっていません。 そこで、Elispの練習がてら自分でパッケージを作成してみることにしました。 汎用自動修正パッケージauto-fix.el # auto-fix.elはgo-mode.elのgofmt()を参考にして汎用的なコードの自動修正を実現するパッケージです。 コードの自動修正を実現するための方式として、ファイルを直接書き換える方式とバッファを書き換える方式の2種類がありますが、Emacsは設定によってはファイルを直接書き換えてしまうと読み込み直す手間が発生するため、go-mode.elで使われているファイルを保存する前にバッファを書き換える方式を採用しました。 また、コードの自動修正が必要かどうかを判別するためのテンポラリファイルの作成場所に、システムのtmpディレクトリを利用してしまうと、自動修正プログラムが利用する設定ファイルでプロジェクト内のディレクトリに関する設定がある場合(例えば特定のディレクトリのファイルは対象外にするなど)にリスペクトされないようになってしまうため、修正の対象となるファイルと同じディレクトリに作成するようにしています。 auto-fix.elの使い方 # auto-fix.elの使い方はgo-mode.elと同じようにauto-fix-before-save()をbefore-save-hook()にひっかけて利用します。 そして、auto-fix.elはマイナーモードとして実装されているため、auto-fix-commandとauto-fix-optionという2つのバッファローカル変数に修正したいプログラムと自動修正を実行するための引数をセットした上で、メジャーモードのフックで有効化します。 例えばシンプルにRubyでrubocopを実行させたい場合は次のような設定になります。 (add-hook 'auto-fix-mode-hook (lambda () (add-hook 'before-save-hook #'auto-fix-before-save))) (defun setup-ruby-auto-fix () (setq-local auto-fix-command "rubocop") (setq-local auto-fix-option "-a") (auto-fix-mode +1)) (add-hook 'ruby-mode-hook #'setup-ruby-auto-fix) これでruby-modeでファイルを編集して保存するだけで、ファイル保存時にrubocopによる自動修正が実行されるようになります。 flycheckとの組み合わせ # 僕はflycheckを利用していてプロジェクトごとの修正プログラムを利用しているため、次のような設定で利用しています。 ;; flycheck (defun my-use-local-lint () "Use local lint if exist it." (let* ((root (locate-dominating-file (or (buffer-file-name) default-directory) "node_modules")) (eslint (and root (expand-file-name "node_modules/.bin/eslint" root))) (tslint (and root (expand-file-name "node_modules/. ...

AtomからEmacsに乗り換えて気付いたEmacsの底力

January 28, 2019
emacs

2018年の年末にAtomからEmacsにスイッチしてしようと決めてから、年末年始を利用して快適にコードが編集できるようにEmacsを鍛えていました。 Atomは大変素晴しいコードエディタで、初心者がプログラムを書く上で、必要な機能が最初から備わっています。これはVSCodeも同様でしょう。まさに生まれながらのプログラミングエディタと言えます。 Emacsに復帰してあらためて思ったのは、Emacsは生まれながらのプログラミングエディタではないということです。Emacsの初期設定でプログラミングをするには、自動補完もなければGitの対応も不十分で、あまりにも機能が足りていません。 ですが、Emacsが他のエディタと比べて劣っているかと言えばそうではありません。 Emacsの最大利点は即時拡張性 # 僕が感じたEmacsがAtomやVSCodeと比べて優れている点は「即時拡張性」です。 Emacsはエディタとして操作している途中の、ありとあらゆるタイミングで設定の変更が可能です。つまり、コードを書いているときでも、キー操作、文字装飾、編集機能、表示項目、コマンドなど不満に感じた部分をリアルタイムで自分の手に馴染むように調整できます。 もちろん、AtomやVSCodeでもたいていの設定変更はできますが、そのためには設定画面を開いて、該当する項目があるかどうかを調べたり、ブラウザでAPIドキュメントを開いて調べる必要があるため、設定がそもそも変更可能なのかを調べるだけでも時間がかかります。 しかし、Emacsの場合は、M-x describe-function(C-h f)、M-x describe-variable(C-h v)、M-x apropos-command(C-h a) 、M-x customize、M-x find-libraryなどのコマンドから、関数、変数、用意されている設定(変数)、コマンド、ライブラリのソースコードを探索して 、すべての調査をEmacsの中のみで完結して行い、提供されているすべての設定が変更可能となります。 もちろん慣れもあるのですが、慣れた人にとってEmacsの設定を調べて変更するまでの速さは圧倒的なスピード感があります。 M-x customizeによる設定 # 今回設定に関しては、リハビリと実験をかねて新規で作り直した上で、できるだけM-x customizeによって自動生成される設定を利用して設定を行っています。 M-x customize(Easy Customization Interface)はEmacsに用意されている設定画面で、なんとなくGUIっぽい雰囲気でインタラクティブに設定を変更できる機能です。上部のサーチボックスに調べたい機能名を入力してエンターを押せば、設定を検索することができます(M-x customize-aproposでミニバッファから検索することも可能です)。 M-x customizeによる設定の利点は、設定値を入力して保存すれば自動的に設定内容がinit.elに書き出されることと、設定値の型が定義されているため、設定すべき値を間違いにくいという点です。 これまでのinit.elに直接設定を書く方式に慣れている人からすると、若干やぼったさはありますが慣れてくれば悪くない感じです。 Emacsと私の今後 # とりあえず、現在開発中のプロジェクトとブログを快適に書けるようにすることを目標に設定をしてましたが、ようやく良い感じになってきました。 自分が快適にコードを書くために、久しぶりにElispパッケージを書いたりして楽しいEmacsライフを送っていますので、それらについては徐々に紹介していければと思います。 なお、自分が書いたEmacs実践入門を片手に設定していたのですが、自分で書いだけあって自分が欲しい設定が書いてあり大変便利でした。ちなみに、年末からKindle版が発売されていて、[改訂新版]Emacs実践入門 Gihyo Digital PublishingからEPUBを買うことも出来るので電子書籍で欲しい方はぜひ。