これまで、Xiangpianの基本的な使い方や、詳しい設定方法、起動時のオプションの指定の仕方を説明してきました。
今回は、バージョン0.0.5を実際に操作し、CUIモードの使い方を説明します。制御される端末はiOSを用いています。
それでは、CUIモードで起動します。「java -cp lib -jar Xiangpian-0.0.5.jar -u c -c」を実行してください。ANSIカラーに対応していない端末であれば、「java -cp lib -jar Xiangpian-0.0.5.jar -u c」を実行します。
% java -cp lib -jar Xiangpian-0.0.5.jar -u c -c
2011-07-01 23:19:25.583:INFO::jetty-7.1.6.v20100715
2011-07-01 23:19:25.745:INFO::Started SelectChannelConnector@0.0.0.0:40320
';;' is necessary for the command as the prefix.
;;display [startLineNumber [length]] | display multilines stack code.
;;clear | clear multilines stack code.
;;execute | execute multilines stack code. (don't execute when parse error)
;;execute_force | execute multilines stack code by force. (execute even when parse error)
;;insert lineNumber insertCode | insert code into specify point.
;;replace lineNumber replaceCode | replace code as specify point.
;;remove lineNumber | remove code from specify point.
;;exit | exit application.
;;help | display help.
%
起動時にコマンドのヘルプが表示されます。コマンドについては後述しますが、「;;exit」を実行すると終了することは覚えておいてください。
基本編で説明したブックマークレットを実行します。
「open」が表示され接続したことが確認できました。ここで「location」を入力しenterしてください。
% location
command>
location
%
result>
{
"hostname": "www.kanasansoft.com",
"hash": "",
"href": "http://www.kanasansoft.com/",
"protocol": "http:",
"port": "",
"host": "www.kanasansoft.com",
"pathname": "/",
"search": ""
}
%
locationの値が表示されました(JSONの解析ライブラリはJSONICを使用しています)。実際には全ての値が返ってくるのではなく、JavaScriptのJSON.stringifyの出力に対応しているものだけです。locationはプロパティですが、関数や文も実行できます。
% (function(){return "foo";})();
command>
(function(){return "foo";})();
%
result>
"foo"
% if(Math.random()>0.5){"foo";}else{"bar";}
command>
if(Math.random()>0.5){"foo";}else{"bar";}
%
result>
"foo"
% if(Math.random()>0.5){"foo";}else{"bar";}
command>
if(Math.random()>0.5){"foo";}else{"bar";}
%
result>
"bar"
%
無理矢理ワンライナーで書く必要もありません。構文解析を行なって、文が終っていないと判断すると次の入力を待ちます(構文解析のライブラリにRhinoを使っています)。
% if(Math.random()>0.5){
% "foo";
% }else{
% "bar";
% }
command>
if(Math.random()>0.5){
"foo";
}else{
"bar";
}
%
result>
"foo"
%
入力したコードは履歴に保存されています。カーソルキーの上下かcontrol+Pやcontrol+Nで履歴を辿ることができます(こちらはJLineというライブラリを使っています)。
コマンド
コマンドは補完機能に対応しています。コマンドのprefix(既定値は「;;」)を入力した後にtabを押すと、補完機能が実行されます。
% ;; <= ここでTABを押すと一覧が表示される
;;clear ;;display ;;execute
;;execute_force ;;exit ;;help
;;insert ;;remove ;;replace
% ;;d <= ここでTABを押すとdisplayが補完される
編集用のコマンドについては、以下の一連の流れを見てください。
複数行の入力途中に、入力ミスに気づいた場合は入力を修正することができます。
% if(Math.random()>0.5){
% }else{
% "bar";
% ;;display
0 : if(Math.random()>0.5){
1 : }else{
2 : "bar";
% ;;replace 0 if(Math.random()>0.1){
% ;;display
0 : if(Math.random()>0.1){
1 : }else{
2 : "bar";
%
% ;;display
0 : if(Math.random()>0.1){
1 : }else{
2 : "bar";
% ;;insert 1 "foo";
% ;;display
0 : if(Math.random()>0.1){
1 : "foo";
2 : }else{
3 : "bar";
%
% ;;display
0 : if(Math.random()>0.1){
1 : "foo";
2 : }else{
3 : "bar";
% ;;remove 3
% ;;display
0 : if(Math.random()>0.1){
1 : "foo";
2 : }else{
%
% ;;display
0 : if(Math.random()>0.1){
1 : "foo";
2 : }else{
% ;;clear
do you clear really? y/n
clear all.
% ;;display
%
複数行入力で編集を行なった場合、構文解析は行なわれません。このため、文が終っていても実行されません。
% ;;display
0 : if(Math.random()>0.1){
1 : "foo";
2 : }else{
% ;;replace 2 }
% ;;display
0 : if(Math.random()>0.1){
1 : "foo";
2 : }
%
このような場合には、次のようにすると構文解析と実行処理が走ります。
% ;;display
0 : if(Math.random()>0.1){
1 : "foo";
2 : }
% ;;execute
command>
if(Math.random()>0.1){
"foo";
}
%
result>
"foo"
%
構文解析を無視して実行したい場合は以下のようにします。
% if(Math.random()>0.1){
% ;;execute_force
command>
if(Math.random()>0.1){
%
error>
SyntaxError: Parse error
%
コマンドのprefixの既定値は「;;」ですが、これはXiangpianの起動時に変更することができます。
% java -cp lib -jar Xiangpian-0.0.5.jar -u c -c --command-prefix "#"
2011-07-02 00:32:50.472:INFO::jetty-7.1.6.v20100715
2011-07-02 00:32:50.541:INFO::Started SelectChannelConnector@0.0.0.0:40320
'#' is necessary for the command as the prefix.
#display [startLineNumber [length]] | display multilines stack code.
#clear | clear multilines stack code.
#execute | execute multilines stack code. (don't execute when parse error)
#execute_force | execute multilines stack code by force. (execute even when parse error)
#insert lineNumber insertCode | insert code into specify point.
#replace lineNumber replaceCode | replace code as specify point.
#remove lineNumber | remove code from specify point.
#exit | exit application.
#help | display help.
% #help
'#' is necessary for the command as the prefix.
#display [startLineNumber [length]] | display multilines stack code.
#clear | clear multilines stack code.
#execute | execute multilines stack code. (don't execute when parse error)
#execute_force | execute multilines stack code by force. (execute even when parse error)
#insert lineNumber insertCode | insert code into specify point.
#replace lineNumber replaceCode | replace code as specify point.
#remove lineNumber | remove code from specify point.
#exit | exit application.
#help | display help.
%
JavaScriptの入力を邪魔しないようなprefixになるように注意してください。
ライブラリ
CUIモードで使用しているライブラリの情報源を列挙しておきます。