« iOS等のブラウザにJavaScriptを送信して実行できるXiangpian(コマンドラインオプション編) | メイン | Emacsでの見た目そのままにソースコードをブラウザで開くコマンドを作った »

iOS等のブラウザにJavaScriptを送信して実行できるXiangpian(CUIモード編)

これまで、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」を実行すると終了することは覚えておいてください。

基本編で説明したブックマークレットを実行します。
status>
open

「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モードで使用しているライブラリの情報源を列挙しておきます。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

Google

タグ クラウド