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

( ´_ゝ`)ノシ
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です。

もくもくEmacs#1に参加しました。

( ´_ゝ`)ノシ

2015年も残り3カ月と半月程度。嘘だ鈍(゚Д゚≡゚Д゚)ドコドコ?m9( ゚Д゚) ドーン!(aa辞書暴走)

yoshitiaです。

 

もくもくEmacsに参加してきました。

mokumokuemacs.connpass.com

会場はpixivさんです。おー、ホントに壁にイラストがある!漫画と技術書が一緒に棚に並んでる。たまにweb記事で見る通りだー。

 

会の趣旨はEmacsユーザが集まってEmacsでなんかやる会。

12時半開場のところを13時15分着orz

 自己紹介終わったかはわからないけど始まってる。

本日の席順。

もくもくEmacsの座席表 - セキココ

 

yoshitiaは中身が増えすぎて整理できてないinit.el(500行オーバー)をinit-loader.elで

設定ファイル分割。

500行程度で整理できてないと言い出すスライムですみません(´・ω・`)

時間あったらpython用の環境設定でもする予定。

 

序盤、入力メソッドとかキー設定周りの話が出る。

TabキーをAltキーに変えてる人はじめて見た・・・

windows XP時代カナキーと:キーをEnterキーにしてたのであまり人の事は言えないけど。変換キーはShiftにしてた。

 

途中 獨自腐麗夢輪惡上等 (@tadsan) | Twitter さんからネタが。

(注意:ものすごくネタなので真面目に読むコードではない。)

 

evil使ってる人は私含め4人くらい。

 

他にはcarとcdrは素晴らしいだのcdarのaは増やすとわけわからんとか(cdaaaaaaarみたいなの)などlispな話しつつもくもく。

 

終盤 igjit (@igjit) | Twitter さんが進捗発表。IMEの一つ、mozcを色んなOSで利用するEmacsプラグインに手を加えてたそうです。

全角記号の入力、「」にkakkoなど何文字も入力が必要なのが不便、の改善を行ってqなど普段日本語入力で使わないアルファベットを頭に取り q( とかで各種全角括弧を出せたりする便利そうな改善。

(半角英数入力そのままに日本語へ変換できるのはかっこいい)

 

だが、yoshitaはおやゆびシフトかなにゅうりょくなのでかつようできない!

 

次に tomoya ton (@tomoyaton) | Twitter さんの進捗発表。

el-getプラグインの設定とかAtomエディタの設定。会の趣旨上何も問題は無い。

Atomでのrubyコードのオートコレクトすごい。

 

それと 獨自腐麗夢輪惡上等 (@tadsan) | Twitter さんが紹介した 

coldnew/org-ioslide · GitHubはorg-mode形式のテキストをスライドにできる

すごいプラグインでした。

 

最後に主催者

大橋のぞみ(西木野真姫) (@supermomonga) | Twitter さんによる閉会の挨拶で終了。

雰囲気が良かったので次回も参加したいです。

 

yoshitiaの進捗はinit-loaderで多少init.elを分割できました。

参加者の皆さま、お疲れ様でした。

 

 

※何をするかは個々人の自由な会ので極端な話、

Emacs知らないけど、試してみたいのでインストール」でもイケます。

もし、学校や職場でEmacsについて中々質問できる機会が無い方、

Emacsはじめたいたいけどインターネットの記事だけではわからなかった、

そんな方でもEmacsもくもく会では参加OKです。

次の予定があれば下記のリンク先でイベントのお知らせが出るはず。

(10月やるかも、とのことです。)

mokumokuemacs.connpass.com

 

 

qiita.com

 

LinuxのIME制御: fcitxとVimとEmacs with evil-mode

( ´_ゝ`)ノシ

yoshitiaです。 

Qiitaの2014アドベントカレンダーエントリ追加できなくなっちゃったけどこの記事はEvil Advent Calender 2014の11日目の記事のつもりです。

 

どれだけいるかわからない

Linux使っててimeにfcitx使ってて Vim使ってて Emacsでevil-mode使ってる方向けに 一つの記事でVimとevil-modeそれぞれの esc押してノーマルモード(ステート)になる時、 imeオフにする設定を紹介します。

 

これができると日本語入力した後 ノーマルモードでテキスト編集しようと思ったら ひらがなコマンドはないよって VimEmacsに怒られなくて済みます。

1 どんな設定が必要なの?

1 今imeがオンかオフかをVimEmacsに教える設定 2 1で結果がオンだったらimeをオフにする設定 3 escキー押した時に2を使うようにする設定

ちょっとしたプログラミングですね。 VimEmacs単体でやるのではなく fcitxのコマンド、fcitx-remoteと VimEmacsからシェルコマンドを実行させる機能を利用します。

2 Vim

http://blog.goo.ne.jp/ikunya/e/68dfba9591660b04f98c1bec66aaf9c3 で紹介されていたページのvimscriptから 「esc押してノーマルモード(ステート)になる時、 imeオフにする設定」だけを抜粋してます。

どなたか知らないけど謎の中国人さんありがとう。 感謝しつつ~/.vimrcに以下の設定を書きます。

"##### auto fcitx  ###########
function! Fcitx2en()
 let s:input_status = system("fcitx-remote")
 if s:input_status == 2
    let l:a = system("fcitx-remote -c")
 endif
endfunction

set ttimeoutlen=150
"退出插入模式
autocmd InsertLeave * call Fcitx2en()
"##### auto fcitx end ######

紹介されてるページのvimscriptを全部丸写しすると もれなくインサートモードに入ると同時にimeオンになる設定もついてきます。

3 Evil編

evil-modeの場合です。 Vim編で使われていたfcitx-remoteをここでも使います。

$ fcitx-remote

で現在のime状態を数値で教えてくれます

$ fcitx-remote -c

だとimeがオフされます。 この2つを利用した設定を~/.emacs.d/init.elに書きます。 http://d.hatena.ne.jp/syohex/20121230/1356850677 syohexさんの記事でshell-command-to-stringの存在知りました。 便利。

(add-hook 'evil-normal-state-entry-hook
  (lambda ()
    (if (string= "2\n" (shell-command-to-string "fcitx-remote"))
        (shell-command "fcitx-remote -c"))))

これでLinuxVimEmacsのevil-modeでビィムビィムできます。

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

Evil使いのelispデバッグ風景

( ´_ゝ`)ノシ

yoshitiaです。

この記事はEvil Advent Calendar 2014の7日目の記事になります。

先日、web-modeで出てくる

File mode specification error: (void-variable web-mode-html-offset)

の対処ですが、

emacs: web-mode のインデント設定が効かない - yoshitia’s diary

よりまともなやり方が見つかったので記事にします。

 

対処法

私の場合、highlight-indentation-modeが原因でした。

highlight-indentation-modeはメジャーモードがweb-modeの時に

変数web-mode-html-offsetを参照する仕様になってるっぽいので

highlight-indentation.elを直接開いて

web-mode-html-offset

(web-modeの古いバージョンで使われていた変数)

を検索、

web-mode-markup-indent-offset

(web-modeの新しいバージョンで使われていた関数)

に書き換えれば解決します。

 

対処法を探したやり方

ここからが本題。

結果としてweb-mode自体が原因でなかったので

どれが原因かを探す方法が必要だと思うので書いておきます。

emacsネイティブ?の方には常識かもですが

M-x backtrace
(普通よりエラーを詳しく表示してくれる関数)

を入力してからhtmlなどを開いて

メジャーモードをweb-modeに切り替えます。

すると同じ

(void-variable web-mode-html-offset)

メッセージが出てきますが手前の部分に

エラーが発生してるモードが表示されます。

私の例の様にhighlight-indentation-modeでなくても

問題のモードのファイルを開いて

web-mode-html-offset

を検索して見つけた部分を書き直せば

多分解決するんじゃないかと。

この記事のEvil要素は?

( ´_ゝ`)

インデント設定効いてないと

Evilでの操作、

i<TAB><down><ESC>

の後のドットコマンドが役に立たないのです。

(Vim ドットコマンドで調べると便利)

後はVimEmacs Evilルートの方に

M-x backtraceの存在を知ってもらえれば、

と言う意図で。

elispプラグインは関数や変数の頭に

プラグインの名前が付いてるのですごくわかりやすいです。

これでVimmerelispと戦える(はず)です。

 

日々の暮らしにVimEmacsをEvilを。 Happy Evil life!

emacs: web-mode のインデント設定が効かない

( ´_ゝ`)ノシ

yoshitiaです。

Evil使いのelispデバッグ風景 あらすじ - yoshitia’s diary

昨日、Evil Advent Calenderの前フリとして特に

ブックマークやtwitterのツイートをしてないのに

見てくださった方が居たので

デバッグと言うか応急処置みたいなものを書きます。

3/28追記 ちゃんとした対処法見つけました。

Evil使いのelispデバッグ風景 - yoshitia’s diary

 

対象:web-mode.el内に Version: 11.0.29 って書いてあるもの

package-list-packagesでならフォルダ名に

Package-Version: 20150321.1140  とかついてるもの

github.com

 

不具合対策:

web-mode.el内の47行目以降、

defcustomがやたら沢山ある辺りに

(defcustom web-mode-html-offset 1
  ""
  :type 'integer
  :group 'web-mode)

と書いて保存すると

File mode specification error: (void-variable web-mode-html-offset)

のエラーが消えてインデント設定が効くようになる。

場当たり的な対策なので完全に不具合解消してるかは謎。

もっといい対策があったらはてブにでもコメント下さい。

Evil使いのelispデバッグ風景 あらすじ

2015/3/26追記

対処法は以下の記事にあります。

emacs: web-mode のインデント設定が効かない - yoshitia’s diary

 

 

( ´_ゝ`)  JSF2.2書くならweb-modeが良いか・・・

jsp対応してるらしいし。

 

・・・ん?

f:id:yoshitia:20150325212328p:plain

 

    File mode specification error: (void-variable web-mode-html-offset)

何このエラー?あ・・・

f:id:yoshitia:20150325213155p:plain

インデント設定機能しなくなった\(^o^)/オワタ

 

「そこで問題だ!この壊れたインデント設定をどうするか?

 3択—ひとつだけ選びなさい。

 答え1.ハンサム( ´_ゝ`)は突如解決策がひらめく。

 答え2.通りすがりのギッハバが不具合を修正したプルリク

 →プラグイン作者が即マージで問題解決してくれる。  

 答え3.どうしようもない。現実は非情である。  

 答えは-」

 

    
                                 ,.へ 
  ___                             ム  i 
 「 ヒ_i〉                            ゝ 〈 
 ト ノ                           iニ(() 
 i  {              ____           |  ヽ 
 i  i           /__,  , ‐-\           i   } 
 |   i         /(●)   ( ● )\       {、  λ 
 ト-┤.      /    (__人__)    \    ,ノ  ̄ ,! 
 i   ゝ、_     |     ´ ̄`       | ,. '´ハ   ,! 
. ヽ、    `` 、,__\              /" \  ヽ/ 
   \ノ ノ   ハ ̄r/:::r―--―/::7   ノ    / 
       ヽ.      ヽ::〈; . '::. :' |::/   /   ,. " 
        `ー 、    \ヽ::. ;:::|/     r'" 
     / ̄二二二二二二二二二二二二二二二二ヽ 
     | 答 |  答え4. 自分で何とかする │| 
     \_二二二二二二二二二二二二二二二二ノ 

VimやEmacsを始める前に(windows向け)

( ´_ゝ`)ノシ

yoshitiaです。近年は4月が近づくと

VimEmacsをはじめよう、と言った趣旨の記事が

出るようですが、

windowsの人向けに

新しいテキストエディタを始める前に

やっておくことを書いてみようかと。

 

テキストエディタを全く使った事無い方

sakura-editor.sourceforge.net

サクラエディタから始めましょう。

と言うのは大抵新しいテキストエディタを勧める記事は

「使いこなせたらすごいエディタ」を紹介します。

 

そういうのは設定やプラグイン設定をミスると

起動からエラー出て使えない事態が起きることがあります。

 

時間に追われてない方であればそれでもいいと思いますが

もし、windows使ってて新しいエディタを

仕事で使う、論文・レポートを書く用途で使おうとするなら

設定でトラブル起きた時に使える

サブのエディタを用意した方が良いです。

 

サクラエディタ

-------------------------------------------

保存、コピー、カット、ペースト、Ctrl+z

矩形選択、検索、置換、文字コード変換、改行コード変換

grep、ソート、マージ、diff

------------------------------------------

上記の1行目2行目辺りを覚えてから

他のエディタに移ると身に付くのも早いと思います。

(3行目は人による)

 

サクラエディタはここに書いた以外にも機能沢山あるので

そのまま安住の地に選択するのもアリです。

2015/4/12追記:

サクラエディタ、タイプ別設定で「括弧の強調表示」設定が可能だった。

プログラム書く時に{ ( [が沢山あってもどの] ) }と対応してるかわかるから楽。

サクラエディタで、対応する括弧を探す。 - 今日の3タックル

 

すでに良く使うテキストエディタがある方

もし苦手ならタッチタイピングを鍛えなおした方がいいかもです。

「使いこなすとすごいエディタ」の類は

「キーボードショートカットを沢山使うエディタ」だったりします。

必然的にキーを見ないでも使えることが求められます。

使うエディタの種類は置いておいても

タイピングの速さは作業速度に繋がるので鍛えて損はありません。

 

もし、定型の文章を沢山コピー&ペーストすることが多いなら

PraseExpressをおすすめします。

yossense.com

タッチタイピング、PraseExpressでの改善を試みても

その先を、という方なら新しいエディタを始めるのはいいと思います。

 

 

春から幸せなテキストエディタライフを送りたいですね。

Happy Vim and Emacs life!