2011-01-22

Zen Coding for Notepad++(0.6.1): 標準の言語以外の設定を登録する(JavaScript, PHP)

標準ではHTML, CSS, XML, XSL, HAMLしかスニペット等を設定できませんが、JavaScriptとPHPの設定も入れてみたかったので方法を調べていました。

Zen Coding.jsを見てみると3955行目にknow_syntaxesという変数があったので、それにJavaScriptとPHPを追加したらそれぞれの設定ができるようになりました。

 var know_syntaxes = {
  'html': 1,
  'css': 1,
  'xml': 1,
  'xml': 1,
  'haml': 1,
  'js': 1, // JavaScript
  'php': 1 // PHP
 };

確認のため、Zen Coding.jsのzen_settings内か、my_zen_settings内にJavaScriptとPHPの設定をしてみます。下記の例ではmy_zen_settings内にJavaScriptとPHPの設定をしています(my_zen_settingsについてはZen Coding for Notepad++(0.6.1): Zen Codingの自分用コードを別ファイルに書く を参照して下さい)。

/* var */ my_zen_settings = {

/* ... 略 ... */

  'js': {
    'snippets': {
      'fn': 'function(){|}'
    }
  },
  'php': {
    'snippets': {
      'echo': '<?php echo | ?>'
    }
  }
};

Notepad++を再起動し、成功していれば.jsファイル内ではjsの設定で、.phpファイル内ではphpの設定で展開ができるはずです。

追記: ただ、上記例のようなHTML内でも使うスニペットなどはHTMLの設定に入れたほうがいいかも知れません。

Zen Coding for Notepad++(0.6.1): NppScriptingでincludeされるjsファイル内の日本語が文字化けするのを回避する

Notepad++でZen-Codingの自分用のコードが書けるようにできたのでいろいろコードを付け加えてみたんですが、日本語を入れたら一部の文字が化けてしまったので回避方法を考えました。

A. NppScriptingのstart.jsのinclude()を修正する

文字が化ける原因を調べたところ、jsファイルを読み込んでいるstart.jsのinclude()にはUTF-8でファイルを保存するようコメントがあるんですが、

  1. ファイルをASCIIで読み込む ( fso.OpenTextFile(file,1, false,0) )
  2. 読み込んだデータをUTF-8(コードページ65001)でデコードする ( var scr = Editor.decodeFrom(65001,f.ReadAll()) )
  3. ファイルの内容を実行 ( eval(scr) )

というようにファイルを読み込んでいて、UTF-8でデコードするところでデコードに微妙に失敗していました。

そのため、ファイルを読み込む方法をUTF-8で直に読み込むように修正します。つまりstart.jsの

var fso = new ActiveXObject("Scripting.FileSystemObject");
function include(file){
 if (fso.FileExists(file)){
  var f = fso.OpenTextFile(file,1, false,0);
  var scr = Editor.decodeFrom(65001,f.ReadAll());
  if (scr && scr.length>0){

を、

var fso = new ActiveXObject("Scripting.FileSystemObject");
var f = new ActiveXObject("ADODB.Stream");
f.Charset = "UTF-8";
function include(file){
 if (fso.FileExists(file)){
//  var f = fso.OpenTextFile(file,1, false,0);
//  var scr = Editor.decodeFrom(65001,f.ReadAll());
  f.Open();
  f.LoadFromFile(file);
  var scr = f.ReadText();
  if (scr && scr.length>0){

に修正します。

B. ファイル内の日本語をUnicodeエスケープする

日本語を直に使わずにUnicodeエスケープ(例: 「あいう」→「\u3042\u3044\u3046」)して保存しても文字化けがなくなります。楽にUnicodeエスケープ/アンエスケープできるように、ファイル内の日本語(というかASCII文字以外の文字)をUnicodeエスケープするスクリプトを作りました。

上記スクリプトをunicode_escape.jsなどと名前をつけて保存して、includesフォルダ(おそらく C:\Program Files\Notepad++\plugins\NppScripting\includes )に置くと下記のことができるようになります(Notepad++の標準機能でUnicodeエスケープ/アンエスケープできるか調べたんですがわからなかったので、取りあえずのものです)。

  • メニューバーに「my」という項目が追加され、Unicodeエスケープとアンエスケープの項目が置かれる
  • Ctrl+Uでファイル内のASCII文字以外の文字のUnicodeエスケープを行う
  • Ctrl+Shift+UでUnicodeエスケープのアンエスケープを行う

2011-01-18

Zen Coding for Notepad++(0.6.1): Zen Codingの自分用コードを別ファイルに書く

Notepad++(5.8.6)でZen Codingの自分用のコードを本体のZen Coding.jsに書きたくなかったので別ファイルに書く方法を探したところ、Zen Coding.jsを少し修正したら上手くいったようなので手順を書き残しておきます。

1. Zen Coding.jsのコードを一部変更する

変更するのはZen Coding.jsの2254行目です。

if ('my_zen_settings' in this) {

if ('my_zen_settings' in this || typeof my_zen_settings !== 'undefined') {

に変更します。これによって、どこかにmy_zen_settings変数があればmy_zen_settingsを含めた設定が使われるようになります。

上記変更は2251行目に倣って
if ('my_zen_settings' in this || my_zen_settings) {

でもよいですが、これだとmy_zen_settings変数がどこにもないときにはNotepad++起動時にエラーになるようになるので注意して下さい。

2. my_zen_settings.jsファイルを作成する

Zen Coding.jsを入れたところと同じところ(おそらくデフォルトの状態なら「C:\Program Files\Notepad++\plugins\NppScripting\includes」)にmy_zen_settings.jsファイルを作成します。

ファイル名は「my_zen_settings.js」でなくてもよいですが、includeの順番がZen Coding.jsより前でないとZen Coding.jsがmy_zen_settings変数を認識できないのでファイル名がZen Coding.jsの前になるようにする必要はあります。

3. my_zen_settings.jsファイルに設定を書く

Zen Coding.js冒頭にあるzen_settingsと同じ構造で、自分用のコードを書いていきます。ただmy_zen_settings変数はグローバル変数にしないとZen Coding.js側に認識してもらえないので、varを付けずに変数宣言を行います。下のような感じで書いていきます。

/*var */ my_zen_settings = {
 'html': {
  'snippets': {
   'test': '<strong>test!</strong>'
  }
 }
};

EC studio デザインブログさんの Zen-Codingでさらにコーディングを1.5倍くらい速くするためのカスタマイズ方法 に、Aptanaでの設定方法と併せてmy_zen_settingsの例がありますのでそちらが参考になります。

4. Notepad++を再起動する

一旦Notepad++を終了して、再度立ち上げてみて下さい。成功していればmy_zen_settingsに書いたコードをCtrl+Eで展開するなどできます。

以上です。my_zen_settingsをグローバル変数にしないといけないのが少し引っかかりますが、何か問題が起きたらまた追記します。