モブ沢工房

プログラミングとかLinux関連(特にOSSのグラフィックツール関連)とかレトロゲームとか3Dプリンタやら日曜大工等、色々。

Lazarusに日本語を入れるための簡易プログラムを作成してみた

この記事はfc2から引っ越した記事です

%sLazarusというのはFree Pascal向けの統合開発環境であり、かつてのBoland Delphiに類似したオープンソースプロジェクトであります。

中々高速でエディタの反応も良いのですが、残念ながらうちの環境では日本語が入りません。表示は問題ないのですが。
何か設定が悪いのか、それともそういう仕様なのか。以前MacOS上で試した時も同じでしたので仕様の可能性大。

まぁ、「外部ツール」でgvimなりgeditなり起動させて、そちらで編集する…というのでも良いのですが。
しかし、ソースコードではコメントに入れるぐらいなので、一行の簡易エディタがあればいいわけです。
そこで、コロンブスの卵的に安易なのをpythonで作ってみました。
要pygtk(2.4以上)、pythonは2.x系で作っています。いいかげん、そろそろ3.x系に移行しないとなぁ…

手軽にファイルで上げて終わりにしたいところなのですが、例のごとく、まだおいらのwebサイトが全然出来上がっていないという、一体何をしているんだ状態なので、ソースコードで上げておきますね…

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import pygtk
pygtk.require("2.0")
import gtk


class Myclass:

def __init__(self):
self.win = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.win.set_title("clipedit")
self.win.set_resizable(True)
self.win.show()
self.win.connect("destroy",self.destroy)
self.win.resize(800,32) # お好みでドゾー

# widgets baseically added this self.basebox
self.basebox = gtk.VBox(False,8)
self.basebox.show()
self.win.add(self.basebox)
txtbuf=gtk.TextBuffer()
#txtbuf.set_text(initial_text)
t_frame=gtk.Frame()
t_frame.set_shadow_type(gtk.SHADOW_IN)
t_frame.show()

txtview=gtk.TextView(txtbuf)
txtview.set_wrap_mode(gtk.WRAP_CHAR) # Multiline text
txtview.show()
t_frame.add(txtview)
self.basebox.add(t_frame)
self.txtbuf=txtbuf
self.txtview=txtview
self.txtview.grab_focus()
self.txtview.connect("key-release-event",self.key_release)



def destroy(self, widget, data=None):
gtk.main_quit()

def main(self):
gtk.main()

def key_release(self,widget,event):
if ((event.state & gtk.gdk.CONTROL_MASK) == gtk.gdk.CONTROL_MASK) and (event.keyval==gtk.keysyms.Return):
raw_text=self.txtbuf.get_text(self.txtbuf.get_start_iter(),self.txtbuf.get_end_iter())
t=gtk.Clipboard()
out=''
raw_lines=raw_text.split('\n')
while len(raw_lines)>1 and raw_lines[-1]=='':
raw_lines=raw_lines[:-1]

if len(raw_lines) > 1:
raw_text="\n".join(raw_lines)
else:
raw_text=raw_lines[0]
t.set_text(raw_text)
self.destroy(self.win)
elif event.keyval==gtk.keysyms.Escape:
self.destroy(self.win)


if __name__ == '__main__':
m=Myclass()
m.main()




ごくごく簡易なテキストエディタです。そしてこのテキストエディタは、CTRL+ENTERを押すとクリップボードにテキストを自動で格納して終了します。
ESCキーで何もせずに、入力したテキストは破棄して終了(キャンセル)です。


これは何をするものかというと、
shot_140402_212627_6220.jpg
こんなふうにLazarusのエディタがありますが、これに対してあらかじめ外部ツールを設定しておくわけです。
shot_140402_212923_5103.jpg
こんな感じにショートカットキーで(この場合はAlt+E)で起動するようにしておき…
shot_140402_212645_2435.jpg
入力してCTRL+Enterで閉じます。
shot_140402_212712_5509.jpg
ショートカットキーで起動した場合はエディタに直に戻ってこれる(ここ重要)ので、その場で即座にCTRL+Vでペーストする、と。

とりあえず実用の足しにはなるだろう、と考えました。
オープンソースなので頑張ってエディタを改良することも考えましたが、そろそろubuntuも14.04LTSになることですし、奮闘の結果、本家では既に対応していたというオチは避けたいものです。

実はというか上のスクショ内のソースを見ても分かるとおり、Lazarusは今のところ全くといっていいほど使っていないのですが、興味だけはずっと前から持っているわけです。

なにしろPascalはシンプルでコンパイルも速いし、ネイティブだし、C言語ライブラリとのリンクもそれなりに簡単そうですからね。あとLua組み込み用ライブラリも既にあるようだし。使用ユーザーも多くてかつてからの実績も豊富と思います。
ついでに言うとオブジェクトだけでなく構造体も使えるのは、ゲーム作りを考えると嬉しいですね。オブジェクトだけだと結構、コンストラクタ呼び出しのコストがバカにならないので…

それよりなにより、懸念していることは…
ちょっと話は変わってきますが
monodevelopの便利さ、なのであります。

あまりにも良くなってきたmono / monodevelopに過剰に依存していると、何かMicrosoft絡みで突然monoが終了なんてことが起きたら大変なことになりますので、こうやって選択肢は常に増やしておいたほうがいいかと。

まぁ、最悪の場合、C言語+VIM+gdbとか、NetbeansC言語プラグインを使うとか、Netbeans+Javaに行くとか、他にも色々な選択肢はあるので、そう思いつめることもないのですが、まぁ一応。

D言語とかGo言語とかも悪くないんですがねぇ…こう、一向にメインストリームになってこない感が。特にD言語には期待しているのですけど。

%sLazarusというのはFree Pascal向けの統合開発環境であり、かつてのBoland Delphiに類似したオープンソースプロジェクトであります。

中々高速でエディタの反応も良いのですが、残念ながらうちの環境では日本語が入りません。表示は問題ないのですが。
何か設定が悪いのか、それともそういう仕様なのか。以前MacOS上で試した時も同じでしたので仕様の可能性大。

まぁ、「外部ツール」でgvimなりgeditなり起動させて、そちらで編集する…というのでも良いのですが。
しかし、ソースコードではコメントに入れるぐらいなので、一行の簡易エディタがあればいいわけです。
そこで、コロンブスの卵的に安易なのをpythonで作ってみました。
要pygtk(2.4以上)、pythonは2.x系で作っています。いいかげん、そろそろ3.x系に移行しないとなぁ…

手軽にファイルで上げて終わりにしたいところなのですが、例のごとく、まだおいらのwebサイトが全然出来上がっていないという、一体何をしているんだ状態なので、ソースコードで上げておきますね…

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import pygtk
pygtk.require("2.0")
import gtk


class Myclass:

def __init__(self):
self.win = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.win.set_title("clipedit")
self.win.set_resizable(True)
self.win.show()
self.win.connect("destroy",self.destroy)
self.win.resize(800,32) # お好みでドゾー

# widgets baseically added this self.basebox
self.basebox = gtk.VBox(False,8)
self.basebox.show()
self.win.add(self.basebox)
txtbuf=gtk.TextBuffer()
#txtbuf.set_text(initial_text)
t_frame=gtk.Frame()
t_frame.set_shadow_type(gtk.SHADOW_IN)
t_frame.show()

txtview=gtk.TextView(txtbuf)
txtview.set_wrap_mode(gtk.WRAP_CHAR) # Multiline text
txtview.show()
t_frame.add(txtview)
self.basebox.add(t_frame)
self.txtbuf=txtbuf
self.txtview=txtview
self.txtview.grab_focus()
self.txtview.connect("key-release-event",self.key_release)



def destroy(self, widget, data=None):
gtk.main_quit()

def main(self):
gtk.main()

def key_release(self,widget,event):
if ((event.state & gtk.gdk.CONTROL_MASK) == gtk.gdk.CONTROL_MASK) and (event.keyval==gtk.keysyms.Return):
raw_text=self.txtbuf.get_text(self.txtbuf.get_start_iter(),self.txtbuf.get_end_iter())
t=gtk.Clipboard()
out=''
raw_lines=raw_text.split('\n')
while len(raw_lines)>1 and raw_lines[-1]=='':
raw_lines=raw_lines[:-1]

if len(raw_lines) > 1:
raw_text="\n".join(raw_lines)
else:
raw_text=raw_lines[0]
t.set_text(raw_text)
self.destroy(self.win)
elif event.keyval==gtk.keysyms.Escape:
self.destroy(self.win)


if __name__ == '__main__':
m=Myclass()
m.main()




ごくごく簡易なテキストエディタです。そしてこのテキストエディタは、CTRL+ENTERを押すとクリップボードにテキストを自動で格納して終了します。
ESCキーで何もせずに、入力したテキストは破棄して終了(キャンセル)です。


これは何をするものかというと、
shot_140402_212627_6220.jpg
こんなふうにLazarusのエディタがありますが、これに対してあらかじめ外部ツールを設定しておくわけです。
shot_140402_212923_5103.jpg
こんな感じにショートカットキーで(この場合はAlt+E)で起動するようにしておき…
shot_140402_212645_2435.jpg
入力してCTRL+Enterで閉じます。
shot_140402_212712_5509.jpg
ショートカットキーで起動した場合はエディタに直に戻ってこれる(ここ重要)ので、その場で即座にCTRL+Vでペーストする、と。

とりあえず実用の足しにはなるだろう、と考えました。
オープンソースなので頑張ってエディタを改良することも考えましたが、そろそろubuntuも14.04LTSになることですし、奮闘の結果、本家では既に対応していたというオチは避けたいものです。

実はというか上のスクショ内のソースを見ても分かるとおり、Lazarusは今のところ全くといっていいほど使っていないのですが、興味だけはずっと前から持っているわけです。

なにしろPascalはシンプルでコンパイルも速いし、ネイティブだし、C言語ライブラリとのリンクもそれなりに簡単そうですからね。あとLua組み込み用ライブラリも既にあるようだし。使用ユーザーも多くてかつてからの実績も豊富と思います。
ついでに言うとオブジェクトだけでなく構造体も使えるのは、ゲーム作りを考えると嬉しいですね。オブジェクトだけだと結構、コンストラクタ呼び出しのコストがバカにならないので…

それよりなにより、懸念していることは…
ちょっと話は変わってきますが
monodevelopの便利さ、なのであります。

あまりにも良くなってきたmono / monodevelopに過剰に依存していると、何かMicrosoft絡みで突然monoが終了なんてことが起きたら大変なことになりますので、こうやって選択肢は常に増やしておいたほうがいいかと。

まぁ、最悪の場合、C言語+VIM+gdbとか、NetbeansC言語プラグインを使うとか、Netbeans+Javaに行くとか、他にも色々な選択肢はあるので、そう思いつめることもないのですが、まぁ一応。

D言語とかGo言語とかも悪くないんですがねぇ…こう、一向にメインストリームになってこない感が。特にD言語には期待しているのですけど。