|

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Elisp メモ: メジャーモードを切り替えるタイミングで処理を実行させる

注)以下の方法がベストか?という点についてはよく分かりません。 添削歓迎です。


M-x apropos RET hook RET して "major-mode" で検索すると after-change-major-mode-hook と change-major-mode-hook という項目が出てくるので調べてみた。

大ざっぱに言えばモード移行時に「現在のモードの最後」に実行するか 「次のモードの最初」に実行するかの違いらしく、 次のように my-mode を作り my-mode から別のモードへ切り替えると どのモードの時に呼ばれているか確認できる。


(defun my-mode ()
  (interactive)
  (setq major-mode 'my-mode)
  (setq mode-name "MY mode")

  (add-hook 'change-major-mode-hook
            (lambda ()
              (message (format "change-major-mode-hook: %s" major-mode))
              (sit-for 2)))

  (add-hook 'after-change-major-mode-hook
            (lambda ()
              (message (format "after-change-major-mode-hook: %s" major-mode))
              (sit-for 2))))

ただし、これだけだと大域的なフック変数に登録されてしまうらしく、 すべてのモード切り替え時に実行されてしまって都合が悪い。 M-x でミニバッファを開くだけでも change-major-mode-hook に登録した関数が実行されてしまう。

そうではなく、「my-mode から」別のモードへ切り替える時「だけ」実行させたい。 調べてみると、フック変数をバッファローカルにすると良いらしい。

GNU Emacs Lispリファレンスマニュアル: Creating Buffer-Local の change-major-mode-hook の説明から引用:

この変数をバッファローカルにしておくとその役目を終えると変数は消えてしまい、 それ以降のメジャーモードに干渉しない。

フック変数をローカルにするためには make-local-hook を使う……のかと思ったが、 それではダメで、 add-hook の第4引数を nil 以外にすると期待通りに動いた。


my-mode の時だけあるアドバイスが有効になる (my-mode に切り替えたときにアドバイスが有効になり、 他のモードに切り替えたときに無効になる) ようにするサンプル:


(defun my-mode ()
  (interactive)
  (setq major-mode 'my-mode)
  (setq mode-name "MY mode")
  
  (defadvice next-line
    (after advc-foo activate)
    (message (format "%c" (char-after))))
  (ad-activate 'next-line) ;; my-mode 実行時にアドバイスを有効に
  
  ;;(make-local-hook 'change-major-mode-hook)
  (add-hook 'change-major-mode-hook
            (lambda ()
                ;; my-mode から別のモードへの切り替え時にアドバイスを無効に
                (ad-deactivate 'next-line))
            nil
            t))

環境

GNU Emacs 23.0.91.1

スポンサーサイト

anbt-sql-formatter メモ

README 的なことは github の readme.ja.txt を見ていただくとして、その他適当なメモ、覚書。


* 2014-07-08

参考。ベンダごとに構文定義を切り替える方式。
SQL Translator - r7km/s

----
https://github.com/sonota/anbt-sql-formatter.js
JavaScriptで書きなおしてみましたが、
もういっそのことHaxeで書いた方がいいかも?

* 2010-03-23

Parser ではなく Scanner という名前の方が良かったかも?

Parser 部分は「これは関数名、これは列名」などと意味値を与えるとこまではやってなくて、
文字列の外形を見てコメント、文字列、空白、記号、数、キーワードなどに
トーカナイズしているだけなので、やはり
racc とか Ragel などを使って置き換えた方が良いかもしれない。
"1a" が "1" "a" になったりするし。

メモ: Ruby で JSON のパース/シリアライズ

1.9 では JSON を扱うライブラリが標準添付になっているらしいので、 以下は 1.8系に関するメモです。

YAML

パースだけなら YAML.load でも可。

require "yaml"

YAML.load( '{ "a": 1, "b": "x", "c": [2, 3, {"d": 4}] }' )
#=> {"a"=>1, "b"=>"x", "c"=>[2, 3, {"d"=>4}]}

参考: Rubyist Magazine - プログラマーのための YAML 入門 (初級編)

JSON implementation for Ruby

RubyForge: JSON implementation for Ruby
Documentation

gem install json で入るのはこれ。 C で書かれた拡張版と Ruby で書かれた pure 版の 2つを含む。

require "json" とした場合 json/ext.rb のロードに失敗したら json/pure.rb を読むようになっている が、明示的に pure を使いたいなら require "json/pure" でも良いかも。

json/pure.rb を使う場合:

require "json/pure"

JSON.parse( '[1,2,"あ"]' )  #=> パースしてオブジェクトへ
puts [1,"a","あ"].to_json #=> [1,"a","\u3042"]
puts JSON.pretty_generate( [1,"a","あ"] )
#=>
# [
#   1,
#   "a",
#   "\u3042"
# ]

Simple JSON parser & builder

日本語がそのまま読める形(\u~とならない)で変換できる。

RubyForge: サンプル詳細 - Simple JSON parser & builder
今回試したのは v1.09。

Ruby のバージョンは 1.8.7。

パスの通ったところにファイル名 simple-json-parser-builder.rb で保存 (ファイル名は例示のためのもので、こう決まっている訳ではないです)。

require "simple-json-parser-builder"

puts str = JsonBuilder.new.build(["あ"]) #=> ["あ"]
puts JsonParser.new.parse(str).to_s      #=> あ

ちなみに、 gem でインストールできる simple-json(SimpleJSON, http://rubyforge.org/projects/simple-json/) とは別物のようです。

そのまま使うと改行なしで 1行で出力されるが、 ソースをいじって "[", "]", "{", "}", "," の前後あたりに適当に改行を入れれば 簡易的に pretty print っぽくできる。

2012-03-25 追記 JsonBuilder.new.build(nil) #=> "[null]" となる点に注意。数や真偽値も同様。

ruby-json

JavaScript Object Notation | Get JavaScript Object Notation at SourceForge.net

参考: [Ruby] JSONのパーズとシリアライズ - うなの日記

yajl

brianmario's yajl-ruby at master - GitHub

調べてません。

参考(外部リンク)

当ブログ内の Ruby 関連記事

雑メモ: 専門家の役割

適当(ほんとに適当)なメモです。気が向いたら適当に修正・追記します。


ネットがなかったらサクッと条例改正されてたんじゃね? - 俺の邪悪なメモ

マスコミの「日頃の行い」が悪くなければ
「マスコミだって本来は敵じゃなくて協力すべき相手なのでは」とか
「非ジャーナリストの方が頭数は多いし視点も多様なのだから
先に見つける事自体は別に不自然じゃない」
とかいう話になってもいいような気がする。

また、社会の変化の量と流量が増えているため見落としも生じる。
ジャーナリストのリソースも有限。

建設的な方向があるとするなら、
「非ジャーナリスト」の多くに視線により早く問題を発見
→「ジャーナリスト」が大きく取り上げて周知
というのもありなのでは?


ネットの出現による構造の変化と切り分けが必要?

従来: 特権的な立場にある人でないと 特定の情報にアクセスできないという状況があった。 現在・将来: 誰でもアクセスできる範囲が増えた。 技術的な環境の変化によるもの。

専門家は完璧であるべきか

従来はそうあるべきだった、「そういうものであった」 かもしれないが、今後は変わっていく、 変わらざるを得ないのでは。 今後「専門家」に求められるのは * 全体を俯瞰して、どういった情報が既知で どういった情報が既知でないのかを知っている。 既知な場合、その情報がどこにあるのか、いつ頃の事なのかを把握していて、 「~について知りたいんだけど」という人に案内できる。 現在では検索エンジンがその役割をカバーできていない。 ウェブ上にあっても不当にランクが低く設定されていたり、 スルーされやすい形で置かれていたり。 また、書籍などに載っている情報はウェブ上には一部しか出ていない。 * 「専門家」でない在野・一般の人が生み出した情報をまとめる・整理する。

ポッドキャストメモ

メモです。


配信側は「1item につき 1曲+メタデータ」の形でフィードを生成。

podcatcher: 一般的なpodcatcherと同じように、複数のフィードを取得し、 再生する。
公衆送信可能なコンテンツかどうかチェックし、 ユーザの操作で配信用のフィードに追加する。 公衆送信可能なコンテンツでなければ、podcatcher の仕様として再配信できないようにする。
recast?

配信は Dropbox を使うとラク。もちろん、ただのポッドキャストなので Dropbox以外のものでもいい。

関連記事

Emacs Lisp メモ / アドバイス: C-x 2 した後で開いたウィンドウに自動的に移動する

「開いたウィンドウに移動する」は other-window(C-x o)。 これを、C-x 2(split-window-vertically)を呼んだ後で自動的に実行するようにしたい。

とりあえずフックが使えるかどうか調べてみようと split-window-vertically のヘルプを 見てみたが、できるかどうかちょっと分からなかった。

そこで、フックに似た仕組みである「アドバイス」という機能を使う方向で調べてみたところ、 次のようになった。
「split-window-vertically の『後に』other-window を実行する」 の「後に」の部分は「after」で指定する。


(defadvice split-window-vertically
  (after other-window-after-split-window-vertically activate)
  (other-window 1))
(ad-activate 'split-window-vertically)

同じ要領で「C-x 3(split-window-horizontally)の後で other-window」もできる。

「エクスプローラで今開いているフォルダ」をショートカットキー一発で ckw+nyacus で開く(2010-03)

Windows XP SP3 で確認しました。

準備

以下、C:\foo を基本のディレクトリとします。 下線が付いてるパス部分を適宜読み替えてください。

まずは nyacus222a_mod.zip、 ckw-0.8.10-mod2-bin.zip を次のリンク先からダウンロードして解凍し、出てきたフォルダを C:\foo に置きます。

ckw.exe と nyacus.exe のパスは以下のようになります。

C:\foo\ckw-0.8.10-mod2-bin\ckw.exe
C:\foo\nyacus222a_mod\nyacus.exe

ckw.cfg

C:\foo\ckw-0.8.10-mod2-bin\ckw.cfg の以下の箇所を修正。

!編集前
Ckw*exec:  cmd.exe
Ckw*chdir: c:\

!編集後
Ckw*exec: C:\foo\nyacus222a_mod\nyacus.exe
!Ckw*chdir: c:\  ←コメントアウト

エクスプローラで開いているフォルダに移動して ckw を実行する JScript

C:\foo\ckw-nyacus.js として保存します。

var currentDir = new ActiveXObject('Shell.Application').Windows().Item().Document.Folder.Self.Path;
var shell = new ActiveXObject("WScript.Shell");
shell.CurrentDirectory = currentDir;
shell.Run( "C:\\foo\\ckw-0.8.10-mod2-bin\\ckw.exe", 1 );

ショートカットファイルの設定

ckw-nyacus.js のショートカットをデスクトップに作り、 ショートカットのプロパティから [ ショートカット - リンク先 ] に
C:\WINDOWS\system32\cscript.exe C:\foo\ckw-nyacus.js
と入力。
あとは好きなショートカットキーを設定し、 「実行時の大きさ」を「最小化」 にしておきます。


以上です。 ckw と nyacus を改造して公開してくださった hideden さんに感謝。

関連記事

テーマ:Windows 全般 - ジャンル:コンピュータ

「エクスプローラで今開いているフォルダ」をショートカットキー一発でコマンドプロンプトで開く(2010-03)

この方法の良い点は次の 2つです。

  • コンテキストメニューから「ここでコマンドプロンプトを開く」を選んだり「送る」を使わずに 1アクションで実行できる。
  • Windows標準の機能だけで実現できる。

Windows XP SP3 で確認しました。


まずは次の JScript を書きます。 ファイル名は herecmd.js とし、適当なとこに保存します。

var currentDir = new ActiveXObject('Shell.Application').Windows().Item().Document.Folder.Self.Path;
var shell = new ActiveXObject("WScript.Shell");
shell.CurrentDirectory = currentDir;
shell.Run("cmd.exe", 1);

次に、この herecmd.js のショートカットキーをデスクトップに作り、 ショートカットアイコンを右クリックして → プロパティー → 「ショートカット」タブ → ショートカットキー で好きなキーを割り当てます。

これで準備完了。
あとは割り当てたショートカットキーで呼び出すだけです!


※ 拡張子 .js の関連付けが標準の cscript.exe から変更されている場合は ショートカットファイルのプロパティ > 「ショートカット」タブ > 「リンク先」を
C:\WINDOWS\system32\cscript.exe C:\foo\herecmd.js
などとしてください。

ちなみに私は cmd.exe の代わりに NYACUS を使ってます。

関連記事

参考(外部リンク)

テーマ:Windows 全般 - ジャンル:コンピュータ

サクラエディタ: マクロで選択範囲の SQL文を整形する(要Ruby、anbt-sql-formatter使用)

SQL を整形(SQL崩し)する Rubyスクリプトを マクロ経由でサクラエディタから使うための手順です。

「整形したいSQL文を範囲選択 → マクロ実行」で整形できるようになります。

あらかじめ Rubyインタプリタをインストールしておく必要があります。

追記 20100909:
「気になるけど Ruby のインストールとかやったことないし……」という人向けにちょっとだけコメント → Ruby のインストールは簡単です。 バイナリの zip をダウンロードして解凍して中のディレクトリ bin にパスを通すだけで使えるようになります。 インストーラ付きのものもあります。

まずはここから anbt-sql-formatter をダウンロードし、 解凍して適当な場所に置きます。
以下では、解凍して出てきたフォルダをリネーム+移動して C:\anbt-sql-formatter となるように置き、 この中に bin, lib などがある状態として説明します。
※ setup.rb は使いません。


C:\anbt-sql-formatter\misc フォルダ内にある anbt-sql-formatter-for-sakura-editor.js の以下の箇所を修正します。
バックスラッシュを 2つ重ねる点に注意してください。

// ruby.exe の場所
var envPath = "C:\\ruby\\bin\\ruby.exe";

// サクラエディタのマクロを置いているフォルダ
var macroDir = "C:\\test\\sakuraW_r1714\\";

// anbt-sql-formatter のフォルダ
var asfHome = "C:\\anbt-sql-formatter\\";

修正した anbt-sql-formatter-for-sakura-editor.js をサクラエディタのマクロフォルダに移動します。
マクロフォルダはメニューから 設定>共通設定>「マクロ」タブ で確認・変更できます。


メニューから 設定>共通設定>「マクロ」タブ
マクロを登録したいスロットを選択。
「File:」で anbt-sql-formatter-for-sakura-editor.js を選択し、その右側の「設定」をクリックしてマクロを登録します。


これで準備完了です!
あとは、お好きなキーボードショートカットを割り当てておけば 一発で整形できるようになります。

関連記事

参考(外部リンク)

Yapra メモ: コマンド+パイプを使った処理との比較、モジュールの書き方など

注)断片的な情報を基にけっこう適当に書いてます。


たとえば Bash で次のような処理を行うとする。

$ cat in.txt | grep -v foo | write-to-file -o out.txt

概要としては(1)ファイルからデータを読み込み (2)データを加工し (3)データをファイルに書き込む という処理を行っている。

grep の -v(--invert-match) オプションは指定されたパターンにマッチしない行を出力させるためのオプション。

write-to-file というコマンドは架空のもので、 ふつうならリダイレクトを使うところだろうが、説明の都合上でっちあげた。 標準入力から渡されたデータを -o で指定されたファイルに書き込むというコマンドのつもり。

Yapra では「モジュール」がコマンドに、 設定ファイルのパラメータ(config: ~ の部分)がオプション指定に対応する。 そして、シェルスクリプトを書く代わりに次の設定ファイルを書く。

CCLedな曲を紹介・配信しているポッドキャストのリンク集

※PCから携帯電話用のページに辿り着いてしまう場合は こちらのPC用のページへどうぞ。


順番は適当です。気が向いた時に追加・修正します。

Disruptive Platypus - A blog about free netlabel music, focusing on the best of the electronic spectrum.

disruptiveplatypus.wordpress.com creativeCommons:license: なし

Magnatune

magnatune.com/podcasts フルートやシタールといった楽器ごとのフィードもあったりして面白い。 ↓ジャンル毎に分けていないものはこれ http://magnatune.com/podcasts/everything creativeCommons:license: あり

ISGM Music: Podcast Archives

http://www.gardnermuseum.org/music/podcast/archives.asp クラシックのコンサート。BY-NC-ND。 フィードは http://www.gardnermuseum.org/rss.xml 参考: 2006-09-22 CCニュース:クラシック音楽ポッドキャスト"The Concert":Lessig Blog (JP) - CNET Japan 2006-09-14 Isabella Stewart Gardner Museum Launches Free Classical Music Podcast – “The Concert” – Under a Creative Commons License - Creative Commons

Catching The Waves

http://feeds.feedburner.com/typepad/blinker/catching_the_waves

Phlow

http://phlow-magazine.com/

ccMixter

http://ccmixter.org/ http://ccmixter.org/api/query?datasource=topics&type=podcast&page=podcast&f=rss 15曲くらい/ファイル creativeCommons:license: なし

Uwe Hermann's Music Podcast

http://www.hermann-uwe.de/podcast-list

8bc - Online Chiptune Media Sharing

http://8bitcollective.com/ 新着がドバドバと流れてくる。 一律で BY-NC-SA になっているが、原著作者の許諾を得ずに ライセンスされていると思しきものも見受けられるので要注意。

traex.de

http://www.traex.de/ 3曲/ファイル 一次配布元URLがないので探すのが毎回一苦労。 ArtistServerSoundClick の曲が多いような気がする。

Starfrosch

http://starfrosch.ch/ ジャンルごとのフィードあり。

anbt radio

http://dl.dropbox.com/u/217014/radio/channel.xml 試験的にやってます。

ネットレーベル系

Sojus Records Network International Netlabel

www.sojusrecords.com すべて BY-NC-ND 3.0 ? creativeCommons:license: あり

Eastern Recordings

http://www.ear-recordings.nl/ ライセンスは archive.org の各配布ページで確認できる。 すべて BY-NC-ND 3.0 ? フィード内にライセンスのメタデータなし。

Kahvi Collective

http://www.kahvi.org/ CC BY-NC-ND 3.0 ライセンスは information の「License」タブで確認できる。 フィード内にライセンスのメタデータなし。

Bad Panda Records

http://badpandarecords.wordpress.com/ CC BY-NC-SA

Phonocake

http://www.phonocake.de/

Hattatsu Records

http://hattatsu-records.jp/

関連記事

参考(外部リンク)



** ホームに戻る

|
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。