読者です 読者をやめる 読者になる 読者になる

emacs lisp プラグインの作り方(超初心者編)

Emacs

( ´_ゝ`)ノシ
yoshitiaです。
googleで「vim プラグイン 作り方」で検索すると
Vimプラグインが出来るまで が出てきますが
emacs プラグイン 作り方 」でググっても出てくるいい感じの記事が無い。
「欲しい機能や不具合があれば自分でプラグイン書け。パッチあてろ」
の格言があるemacsプラグインの書き方が検索でヒットしないのは
良くないんじゃないかと思いこの記事書いた。

 

目次

 

1.1 一番小さいプラグイン

1.1.1 emacsプラグインを作ろうとする時の流れ。

あくまで最低限です。足りない部分を補足してる
( ゚∀゚)チョウドイイ!!記事があればリンク貼る。(多分)

  • 欲しい機能をelispで書く
  • 関数名決める
  • M-x 関数名で使えるようにする
  1. 欲しい機能をelispで書く

    まず、elispでカーソル行の文字列を取得するだの
    取得した文字列をチェックするだの
    チェック条件式の結果がtrueの場合の動作決めるだの
    ミニバッファにメッセージ出力するだのを
    emacs lispで書く。

    簡単な例として「Hello World」をミニバッファに出力する時はこう書く。

    (message "Hello World")
    
  2. 関数名決める

    普段emacsを使っている時、M-xで関数呼び出したり、
    init.elでキーバインドに関数設定して呼び出す時は
    関数名で指定してますよね?
    オレオレコマンドでも名前が必要です。

    (defun hello-world ()
      (message "Hello World"))
    
  3. M-x 関数名で使えるようにする。

    これはinteractiveスペシャルフォームを関数内に書いておくと
    できるらしい。

    (defun hello-world ()
      (interactive)
      (message "Hello World"))
    

1.1.2 仕上げ

今まで書いた分だけだとscratchバッファに書いてからM-x eval-last-sexpするか
init.elに書いたりしないと動きません。
なのでprovideを追加します。

(defun hello-world ()
  (interactive)
  (message "Hello World"))

(provide 'hello-world)

以上をhello-world.elファイルを作成して書き込みます。
provideの引数はファイル名(今回はhello-world)と同じにしておかないと
エラー出ます。
hello-world.elファイルを置く場所はload-pathの通っている場所です。
scratchバッファで

load-path

と書いてC-jかM-x eval-print-last-sexpすると
emacsがelファイルの存在を確認するフォルダの一覧が表示されます。
load-pathの一覧を見やすくする方法
一覧の中のフォルダのどれかの直下にhello-world.elを置いて
init.elに(require 'hello-world)と書けば起動後M-x hello-worldが使えます。
どうもrequireでload-path一覧のフォルダ内からhello-world.elが無いか探して
見つかったら(provide 'hello-world)と書かれているか確認、
あったらhello-world.el内のコードを読み込んでおく、となるようです。

1.1.3 ここから先

以上で小さいプラグイン、hello-world.el完成。
このプラグインgithubで出ているすごいプラグインの差は
(provide 'プラグイン名)の上に書いてあるコードが
スゴイかすごくないかぐらいです。(超暴論)

実際公開されているemacsプラグインはメインとなるelファイル内に
下記の様な事項を書くのが慣習らしいです。(emacsは慣習が色々ある)

  • プラグイン
  • 作成年
  • 作者名
  • ライセンスの種類(MITライセンスとかGPLライセンスとか)
  • プラグインの機能説明
  • init.elに書く必要がある設定
  • 使い方(M-xで入力する関数名とかデフォルトで設定しているキーバインドとか)
  • 他にもまだまだあるみたいですが調べるの面倒なので省略

つまりこの記事で書いた分では本当の意味でプラグイン完成ではないってことです。
今回の内容だけ書いた例

公開されていて他人に使ってもらえるプラグインは色々書いてあります。
https://github.com/imakado/emacs-smartchr/blob/master/smartchr.el
38行目位までこのプラグインに関しての各種情報が書いてあります。
他のポイントとしては極力英語で書くことです。
(ファイルに日本語が入ってるとそれが原因でエラー出たりする。
プラグインの機能以外でエラーが出ないようにした方がいい。
日本語使う場合は別にreadme-ja.txtなどを作ってそこに書く。)

 

細かい事は公開して他人に広く使ってほしい時に考えるってことで
まずはinit.elにプラグインにしたいコード書いていい感じに出来たら
elファイルに移して、で作っていけば良いと思います。

日々の生活にVimEmacsをEvilを。 Happy Evil life!

 

10/19追記:いい記事があったのでリンク貼ります。

qiita.com

 

※良くわからない場合は下記リンクからlingrチャットの登録方法確認して
登録後emacs部屋で質問できます。
init.el読書会

私より詳しい人が答えてくれるはず( ´_ゝ`)人 (他力本願)
(土曜の夜あたりがログインしている人多いので返事が早い)
emacs lispのコードは括弧が多くて辛いのですがどうしたらいいでしょうか?」
みたいな質問でもOKです。