smultron

Smultron-3.5.1+NKFCocoa公開します

なんとかできました。オリジナルと違う点は次のとおり。まだまだバギーですので問題があればご連絡ください。

Smultron-3.5.1+NKFCocoa途中経過

NKFCocoaのSmultronへの組み込みは実装方針だけは決めたもののなかなか手がつけられずにいたのですがようやく取りかかりはじめました。NKFCocoaによってもとのエンコードで書き出せないコードに変換されてしまう可能性があるため、その救済手段としてエンコードを指定して保存できるようなインタフェース(JeditXのような)を考えていたのですが、考えてみたらSmultronにも[テキストエンコーディング]メニューで編集中のドキュメントのエンコードを変更することはできるんですよね。あまり使ったことがないので今回のためにソースを読んでみるまで気がつきませんでした。

で、まぁそんならやめちゃおうかとも考えたのですがそれも業腹なのでとりあえず [別名で保存...」時にはエンコードを指定できるよう修正することにしました。僕自身も気がつかなかったようにメニューでエンコードを変更するというSmultornオリジナルの実装はあまり一般的ではなくてどちらかといえば新規保存時にエンコードを指定するほうがUIとしては優れているのかな?

NSSavePanelのカスタマイズはカスタマイズ用のビューをセットするだけという単純なもので簡単です。エンコードを選択するポップアップを含んだビューを作成しそいつをsetAccessoryViewします。後はどこでやるかなんですが、Smultronではドキュメントクラスに「開く...」や「保存...」を実装しておらず、「ファイル」とか「編集」毎にメニューコントローラクラス作成し、これらをコントロールしていますのでそこらあたりで...

NSSavePanel image

近日中に公開する予定です。

Smultron-3.5.1 + NKFCocoaの仕様検討中

年度末ドタバタしている中SmultronへのNKFCocoaを組み込み中です。迷っているのはUnicode変換表にない文字を含むファイルの扱い。一応、NKFCocoaによるエンコードの判定そのものは組み込んだのですが、Shift_JISを正しく判定することができているにも関わらず読み込めないファイルがいくつかあって収まりが悪い。

NKFCocoa.Framework公開します

愛用のエディタSmultronのエンコーディング自動判定に手を入れはじめてからずいぶん時間が経ちますが、年末にフト「nkf使えないかな?」って思い立ってNKFCocoaなるものを作成しました。名前どおりnkfのcocoaラッパーです。Cocoaの開発では日本語関連のメソッドは相変わらずの状況なので、まあ多少の役には立つかなと思います。ベースはnkf-2.0.8です。

Smultronの場合だったら、いままでごちゃごちゃやっていたところを

NSError* error = nil;
encoding = [textData guessByNKF:&error];
if (error != nil)
  {
    NSAlert *theAlert = [NSAlert alertWithError:error];
    [theAlert runModal];
    encoding = 0;
  }

程度に集約できてすっきり。APIの詳細は、ドキュメントを参照してください。

ひとつだけショックだったのはnkfではBOMなしUTF-16の自動判定には対応していなかったですね。まあ、それ以外は概ねやりたいことはできました。お悩みの方、バグ含みですがよかったらお試しください。

Smultron 文字コード判定 2022-JPの追加。

メール関連のテキストを扱う必要があってSmultronでテキストを開こうとしたら予想どおりの文字化け。これまで文字コードの判定には何度か手を入れてきたけれど、ISO-2022-JPは特に何もしてこなかったので、今回はISO-2022-JP対応コードを書いてみました。

Smultron本体のエンコード判定方法の流れはv10.4で追加された新しいメソッド、NSString stringWithContentsOfFile:usedEncoding error:を使うように変わっていて、ここで変換してうまくいかなければguessEncodingFromData:textDataを使うように変更になっていますが、このメソッドSJIS/EUCがダメでちょっとつかえません。

string = [NSString stringWithContentsOfFile:path usedEncoding:&encoding error:&error];
if (error != nil || string == nil) {
  if (textData == nil) {
    textData = [[NSData alloc] initWithContentsOfFile:path];
  }
  encoding = [SMLText guessEncodingFromData:textData];
  if (encoding == 0 || encoding == -1) {
    encoding = [[SMLDefaults valueForKey:@"EncodingsPopUp"] integerValue];
  }
}

なので、このメソッドの使用を後回しにしてこれまでどおりguessEncodingFromData:textDataを優先してエンコードを判定、まず判定したエンコードを用いて変換してみる。それでダメな場合にこちらを使うという流れに修正しました。

NSStringEncodingの定義について

Smultronアップデートの度、例の文字コード変換処理のパッチを当てているんですが、最近いまひとつ変換精度が低い。あらためて調べてみるとなんとMacの日本語環境のデフォルトで作成したテキストがちゃんと変換できていないことが判明しました。

smultornでHTMLのプレビューができた

GW最終日、皆が疲れ切って早く寝て時間ができたのでSmultronのローカライズをシコシコやっていたらプレビュー機能が実装されていることに気が付きました。静的なHTMLを作成する時は先日購入したばかりのSkEditを使っていたのですがこれでSmultronだけでいけるようになるのかな?skEditを使う主な理由がコード補完とスニペットなんだけれどどちらもSmultronでサポートされているし、skEditはまだ使い始めて日が浅く便利さをまだ実感していないのかも知れないけれど、いろんな作業を一つのエディタでこなす方がやっぱ効率がいいよなぁ。お金払っちゃったので捨てる訳じゃないけれど今後はますますSmultron依存度が高まりそう。

それにしてもメニュー周りのローカライズをやってみたら実にいろんな機能が盛り込まれていることを再認識して実に有意義。そのアプリを使い倒すためにあえてローカライズをしてみるってことも有効な手だてかも知れません。もひとつ、Smultronの場合はソースが公開されていますから使いませんでしたがソースの公開されていないアプリでもローカライズする方法があるって事も今回知りました。Appleのサイト Localization Toolsでそのためのツールが公開されているんです。ちょっとだけ使ってみましたが簡単にローカライズできます。このツールの存在を知ったのもこのたびのオマケでちょっと得した気分。

Smultronのエンコード自動判定

マックのエディタSmultronはとても気に入っていて長らく愛用しているのですが、文字コードの判定がクロスプラットフォーム(Linux/Win/MAc)で作業する僕にとって不都合が多くて自動判定の部分を修正して使っているのですが、バージョンアップの度毎この修正作業が結構面倒なのが玉に瑕。(しかもこのSmultron、非常にアップデートが頻繁)

Smultronエディタ

MacOSXでRubyコードを書くのにはSmultronを愛用しています。最初はターミナルでviしていたのですがやっぱり日本語の入力が気に入らなくて(表示だけできてもしかたないじゃん)使っていたのですが、Smultronにも少し問題があって、エンコーディングを自動判定にしておいても全然自動判定してくれないんですね。ずっとバグなのかなぁ?って疑問で昨日ドキュメントを調べてみようと思い立ちWebをのぞいてみるとソースが公開されていました。
で、ソースを見たらhtmlの"charset"とxmlの"encoding"、UTF8と16の判定しかしていませんでした。しかもこのどれかにマッチしない場合いきなりNSISOLatin1StringEncodingでencodingするんですね。ここのNSISOLatin1StringEncodingで失敗してはじめてNSString defaultCStringEncodingを使うみたい。僕の場合、MacOSXの時はUTF8でコードを書いて会社から持ち帰るコードやテスト用のデータなんかはSJISなので開くたびアラートがあがってエンコーディング設定を選択し直していたので非常に面倒です。で、変更しちゃいました。本来、自動判定しているコードに自分のよく使うShiftJISとかEUCJPとかを追加するべきなんでしょうがObjectiveCはあまりよく知らないしCocoaもちょっと自信がありませんので最後の部分でNSISOLatin1StringEncodingしているところをNSString defaultCStringEncodingに、アラート用のフラグもこのエンコードに失敗したときセットするよう変更しました。これで、めでたく会社から持ち帰りのRubyスクリプトの変更が楽になりました。あとは、会社のLINUX用スクリプトのEUCですかね。こちらはちゃんとコードを書かないとダメそうです。
しかし、2バイト文字文化圏のプログラマはかならずこういうしなくても良いような(?)苦労をさせられますね。UNICODEが登場しても解決しないというかむしろ複雑になっているような気がします...

コンテンツの配信