Tuesday, December 30, 2014

Emacs でワードをキャメルケース、スネークケース、スパイナルケースに変換するマイナーモード

とある案件対策用のマイナーモード。

当方も年に一回使うか使わないかのため、誰得感満載ですが。

https://github.com/chiyano/extra-letter-cases.el/blob/master/extra-letter-cases.el

camelize, snakify, spinalize 関数を定義し、 それらをラップして camelize-word, snakify-word, spinalize-word といったインタラクティブな関数を提供します。

当方 el-get を愛用しているため以下 el-get による導入方法です。

init.el に以下を記述して eval または Emacs 再起動など。

(setq el-get-sources
      '((:name extra-letter-cases
               :type git
               :url "https://github.com/chiyano/extra-letter-cases.el.git"
               :after (add-hook 'prog-mode-hook 'extra-letter-cases-minor-mode))))

あとは M-x el-get-install extra-letter-cases で導入できます。 詳しくは el-get のほうを参照いただきたく。

上の設定では prog-mode-hook でフックしているため、 なんらかのソースコードファイルを開くと extra-letter-cases-minor-mode が有効になります。 画面下部のインジケータに excases と表示されるはず。

キーバインドはそれぞれ

  • M-p - camelize-word :カーソル位置の文字列をキャメルケースに置き換え
  • M-[ - snakify-word :スネークケースに置き換え
  • M-{ - spinalize-word :スパイナルケースに

これらを M-uM-lM-c などと連携で使用します。

しかし、せっかく調べた word-at-point や Syntax Table は使わずじまい。

そしてやはり誰得感満載。

Saturday, December 27, 2014

Emacs Syntax Table の変更

丁度 M-uM-lM-c みたく、単語をキャメルケース、スネークケース、スパイナルケースに変換したい案件あり。

まずは単語の抜き出にトライ。

単語の抜き出しは word-at-point を活用できそう。だけど _ とか - が含まれてこない。 それらを単語として解釈してもらうにはどう設定すればいいか。

そこで EmacsWiki: Emacs Syntax Table を斜め読み。

結論、諸々解るも、基底(?)のシンタックステーブルを変更する手法だと術が見つからないため断念。

だけど modify-syntax-entry でカレントバッファのシンタックステーブルを変更できるため、 代わりにこれを prog-mode-hooktext-mode-hook に追加して事なきを得ましたと。

init.el に以下。

(defun my-syntax-table ()
  (modify-syntax-entry ?- "w")
  (modify-syntax-entry ?_ "w"))
(add-hook 'prog-mode-hook 'my-syntax-table)
(add-hook 'text-mode-hook 'my-syntax-table)

新しい挙動に慣れないせいか使いにくくなった気がしなくもないですけど。

以降、 EmacsWiki: Emacs Syntax Table の読みメモ。

Emacs Syntax Table

シンタックステーブルは、ワードごとの前後カーソル移動などに使用される。

シンタックスはバッファごとに異なり、メジャーモードでコントロールされる。

シンタックステーブルは standard syntax table を継承する。

Working with Syntax table

C-h s (describe-syntax) でカレントバッファのシンタックステーブルを参照できる。

シンタックステーブルには、各キャラクタやキャラクタレンジと、シンタックスクラスとの対応がリストされる。

シンタックスクラスは以下のシンボルで識別される。

-   whitespace character        /   character quote character
w   word constituent            $   paired delimiter
_   symbol constituent          '   expression prefix
.   punctuation character       <   comment starter
(   open delimiter character    >   comment ender
)   close delimiter character   !   generic comment delimiter
"   string quote character      |   generic string delimiter
\   escape character            @   inherit from `standard-syntax-table'

カレントシンタックステーブルにおける + のシンタックスを参照するには以下。

(char-to-string (char-syntax ?+))

How to define a new syntax table

シンタックステーブルは make-char-table で定義する。

新しいシンタックステーブルは、通常、基本的なシンタックステーブルを継承し、置き換えることで定義する。

スタンダードシンタックステーブルから設定していくには以下。

(setq my-table (make-syntax-table))

text-mode シンタックステーブルからだと以下。

(setq my-table (make-syntax-table text-mode-syntax-table))

Hacking the syntax table

キャラクタのシンタックスは modify-syntax-entry で変更する。

クォータキャラクタにエクスプレッションプレフィックスクラスをセットする例。(Lisp モードでのデフォルト)

(modify-syntax-entry ?' "'")

ブラケット [] にワードクラスをセットし、デリミタとしての解釈を除去する例。

(modify-syntax-entry ?[ "w")
(modify-syntax-entry ?] "w")

などなど、他にも述べられているが本件ではスルー。

カレントシンタックステーブルを変更し、新しいシンタックステーブルを定義するには以下。 (と記載があるけど、この場合 make-syntax-table は standard-syntax-table を戻すのでは)

(defvar my-wacky-syntax-table
     (let ((table (make-syntax-table)))
       (modify-syntax-entry ?[ "w" table)
       (modify-syntax-entry ?] "w" table)
       table))

text-mode のデフォルトテーブルとして my-wacky-syntax-table を指定できる。

(add-hook 'text-mode-hook (lambda ()
            (set-syntax-table my-wacky-syntax-table)))

Thursday, July 31, 2014

Blender Python Console にてオブジェクトに頂点・辺追・面を追加

2014/7/30 開催の Okinawa.rb に参加。

本来 Ruby の集いであるにも関わらず、この日は構わず Blender 方面へ突入。主に Python Console において Bpy な方面へ。

結果、オブジェクト(以降の説明では Plane)に対し、頂点、辺、面をそれぞれ追加する手法を理解したため、以下のとおりメモ。

準備

まず、本件について準備しつつ Python Console を開くまでの手順。 Blender は、現 2.71 の on OS X な版を使用。

デフォルトの Cube は使用しないため削除。(X キーをタイプ)

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-07-31+22.52.36.png

オブジェクト(Plane)を配置するため、 3D View の表示形式を Top Persp に切り替え。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-07-31+22.54.54.png

3D View にマウスカーソルをのせ、スペースキーをタイプ。 表示されたメニューから Add Plane を選択。 なお、以下な矢印の付け根部分をドラッグすることで画面分割が可能。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2014-07-31_22_56_01.png

Editor Type のメニューから Python Console を選択。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-07-31+22.56.37.png

これで Python Console が開きます。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-07-31+22.56.42.png

頂点の追加

Python Console に以下を入力し、 3D View にマウスカーソルを移動させタブキーをタイプして Edit Mode に切り替えると

d = bpy.data.objects['Plane'].data
d.vertices.add(1)
d.vertices[4].co.x = 3

以下のアカマルな位置に頂点が追加されている。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2014-07-31_21_56_57.png

ちなみに、 bpy.data.objects['Plane'].data の戻りは bpy.data.meshes['Plane'] であり Blender 2.71.0 5c2d7f7 - API documentation では bpy.types.Mesh に示される。 vertices については bpy.types.MeshVertex

辺の追加

3D View にマウスカーソルを移動させ、タブキーをタイプして Object Mode に切り替えた後、 Python Console にて以下な入力。

d.edges.add(2)
d.edges[4].vertices = [3, 4]
d.edges[5].vertices = [1, 4]

Edit Mode に切り替えると辺が 2 つ追加されている。なお、頂点のインデックスについては、どうやら図中番号のように Blender では管理される模様。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2014-07-31_22_27_56.png

面の追加

Object Mode に切り替え、 Python Console にて以下な入力。

d.loops.add(3)
d.loops[4].vertex_index = 1
d.loops[5].vertex_index = 4
d.loops[6].vertex_index = 3

d.polygons.add(1)
d.polygons[1].loop_start = 4
d.polygons[1].loop_total = 3

d.loops のデフォルトを確認すると vertex_index にそれぞれ 0, 1, 3, 2 が設定されている。これに追加し 0, 1, 3, 2, 1, 4, 3 とする。 また d.polygons にひとつ追加し、 d.loops の要素中、 4 番目から 3 つ目までを追加面として設定している。

Edit Mode に切り替た後、確認すると以下なとおり。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-07-31+22.48.37.png

これらの手法で、プログラム的モデリングについていろいろ妄想中。

あと、 いい加減、そろそろ Unity 方面をおさえないとな件。