有些注定了被遗忘的话,也就有的注定了属于沉静的自私.

Arduino IDE 中文注释修改

来自森亮号航海见识 {SLboat Insight;}
跳转至: 导航搜索

简介

Arduino 1.0x不能输入中文注释,中文符号,这很令人沮丧!
所以在这里我们编译Arduino IDE本身,起因是该死的中文输入问题。

遗憾

  • 尚未在Windows里编译,当前只是Mac下编译的pde移植到Windows下
  • 尚未提交到官方,尽管那帮家伙估计也不会理会这玩意。

有趣

  • 在繁体输入法里这种问题看起来并不存在
我們是可以的,一般人用注音較多 或者 無蝦米-eric60111

todo

  • ant dist的直接注入修改版本号?
  • 同步到官方的V1.0.5
哈,一个阻碍!->Mac 10.9/没有了ant
  • 提交到官方补丁,就像有些兄弟说的,但是官方是同步processing的呢
  • 将Processing也进行补丁-它挺好玩的
  • 当选择内容,再输入的时候不会删除掉原来的内容,而英文会
SLboat-Screen 2012-11-07 21.31.47.png
由于整个过程在输入的时候就发生了,看起来是原始源码的处理有问题
  • 多个窗口的时候,第二个窗口的输入框会移位,尚不确定原版是否也这样是
    • 似乎并非多个窗口引发,而是其他奇怪的因素

@done

  • 已更新到1.0.4-更新源码库到1.03去,毕竟有新的玩意了

赞助森亮号

如果你认为这玩意对你带来了一些影响,你可以赞助我们即便0.1元那也是一份赞助:赞助

补丁

MacOS

当前补丁版本
Arduino V1.0.4 [SLboat MOD]
补丁下载
文件:Pde jar mod for SLboat.zip
使用方法
1.将这个包释放到Mac里的Arduino应用程序内部,位于:
/Applications/Arduino.app/Contents/Resources
SLboat-Screen 2012-11-05 2.03.02.png
2.替换它-是的。

Windows

  • 注意当前用的是Mac下的库编译,待环境搭建后,再次彻底编译,如果遇到bug告知我们。
当前补丁版本
Arduino V1.0.4
补丁下载
文件:Pde jar mod for SLboat.zip
备份方法
备份arduino-1.0\lib里的pde.jar
它的效果
JustCapIt2666.jpg
使用方法
解压补丁中的文件到 arduino-1.0\lib 里进行替换
JustCapIt2665.jpg
JustCapIt2667.jpg

更新列表

  • 2013-4-5 已经同步到官方最新的V1.0.4版本
  • 2012-11-5 加上SLboat Mod标识,这样出Bug的话能够确定是这个引起的
  • 2012-11-5 初次发布

提交给官方

已尝试提交,祝它好运
http://code.google.com/p/arduino/issues/detail?id=1090
补丁文件
文件:Thepatch foarduino chinese ime.zip

中文效果

SLboat-Screen 2012-11-05 1.55.46.png

修改

  • 只需要修改一处地方位于:
Arduino-1.0.4/app/src/processing/app/syntax/im/CompositionTextManager.java
  • 修改文件内容的一个函数-endCompositionText,加入一些内容,最终就像下面的:
129 public void endCompositionText(AttributedCharacterIterator text, int committed_count) {//好了结束输入在这里,会删除一些输入中的玩意
130     /*
131      * If there are no committed characters, remove it all from textarea.
132      * This case will happen if a user delete all composing characters by backspace or delete key. 
133      * If it does, these previous characters are needed to be deleted.
134      */
135     //System.out.println("最终时候的长度是 "+committed_count);
136     if(committed_count == 0){ //当提交是0的时候,一般是取消了输入,这时候删除所有的提交文字
137       removeNotCommittedText(text);
138     }
139       
140       /* 让中文输入法不再被屏蔽,森亮号大船,2012-11-04。
141       * 代码很不整齐,是的,但是它放在这里能让中文输入法工作
142        * 比较问题,单个符号的输出,即便没有上次输入也不行。
143        */
144       if (committed_count > 0) {
145           // 处理单个符号没有初始化的情况
146           if (prevComposeString==""){
147               //System.out.println("修理烂摊子");
148               initialCaretPosition = textArea.getCaretPosition();
149           }
150           //替换子串的缓存
151           StringBuffer unCommitedStringBuf = new StringBuffer(committed_count);//字符串缓存
152           // int textLength = committed_count; //这里的长度就是计数器咯,实际看起来0没有意义这里是不是要也没所谓,看起来这里需要叠加起来计算
153           char c; //一个叠加字符咯
154           //从提交的计数器开始算起,而这里似乎总是0,问题在于一直在产生着触发,看起来必须0开始索引替换,c的属性未结束的时候就完毕
155           for (c = c = text.setIndex(0); c != AttributedCharacterIterator.DONE
156                && committed_count > 0; c = text.next(), --committed_count) {
157               // System.out.println("调试--这次叠加字符 "+c);
158               unCommitedStringBuf.append(c);
159           }
160           String unCommittedString = unCommitedStringBuf.toString(); //到这里已经把输入的子串替换了
161           //System.out.println("这里一个有趣的输出是,啊哈接近吧"+unCommittedString);
162           //看起来是在这里替换的
163           try {
164               textArea.getDocument().remove(initialCaretPosition,  prevComposeString.length()); //删除旧位置,后面的应该就是长度了
165               textArea.getDocument().insertString(initialCaretPosition, unCommittedString, null); //插入新东西
166               if(committed_count > 0){
167                   initialCaretPosition = initialCaretPosition + committed_count;
168               }
169           } catch (BadLocationException e) {
170               e.printStackTrace();
171           }
172       }
173     /* 到这里中文的处理已经全部完成了 
174      * 当代码很神奇的时候这里看起来就是发生了这样的事情
175      */
176     CompositionTextPainter compositionPainter = textArea.getPainter().getCompositionTextpainter(); //看起来就是合并层了
177     compositionPainter.invalidateComposedTextLayout(initialCaretPosition + committed_count);
178     prevComposeString = "";
179     isInputProcess = false; //不在输入了
180     //System.out.println("输入完了吧!"+isInputProcess); //调试信息的一个
181   }
  • 好了现在去编译就行了!

再次编译使用

  • 编译带版本号
cd /build
ant dist
  • 寻找到的pde.jar
/app/pde.jar
  • 寻找到的最终生成文件
/build/{plamfort}/dist
  • 修改标题有特殊标记
Arduino IDE 标题更改

最终研究的注释和修改源码

基于V1.0.1版本:
文件:Arduino im mod for chinaime by slboat.zip

探索

  • 看起来最终的补丁可以在pde.jar里面。
  • 整个探索花费时间-一天一夜到现在是凌晨1:36。
  • 加上校验一切成功!!
  • 一个新的bug,当输入取消但的时候依然赋错-看起来是校验引起的,加一层处理
  • 问题是初始化所引起的,重新置位初始化,一切看起来不错!
SLboat-Screen 2012-11-05 1.20.38.png
  • 通过检查是否处理过一次可以过滤掉单个,但是导致了问题-这是官方就有的问题-没有任何输出,看起来是没有绘制任何层。
  • 第一个版本修改成功,能够输入中文,但是也有一个问题,那就是没有组词的时候依然会移到上次的位置
SLboat-Screen 2012-11-05 0.40.28.png
  • 还需要再长一点删除字符
SLboat-Screen 2012-11-05 0.21.31.png
  • 现在需要一个完整的替换
  • 设置索引很重要,现在已经获得输入内容了
SLboat-Screen 2012-11-04 23.46.49.png
  • 但是我想结束输入有些不同的可能是起始位置,这里没有得到最后的效果。
  • 每次输入触发一个个事件的时候都在进行叠加,实际上我们的输入法也是,所以最终的叠加也做了前面的工作-输入法做的
SLboat-Screen 2012-11-04 23.25.36.png
SLboat-Screen 2012-11-04 23.25.32.png
  • 看起来所有有关输入的和还未输入的都在事件的text里面
public void inputMethodTextChanged(InputMethodEvent event) { //输入输入法文字变动,看起来你太敏感了呢,这是IMF里的框架-有趣吧。
AttributedCharacterIterator text = event.getText(); //获得输入的文本- 获取已提交文本和撰写文本的组合。
getText
public AttributedCharacterIterator getText()
获取已提交文本和撰写文本的组合。从索引 0 到索引 getCommittedCharacterCount() - 1 的字符为已提交文本,其余字符为撰写文本。
返回:
文本。对于 CARET_POSITION_CHANGED 始终为 null;如果没有任何撰写文本或已提交文本,则对于 INPUT_METHOD_TEXT_CHANGED 可能为 null。
  • 得到了调试信息!,通过注入
System.out.println("HelloWorld!");
SLboat-Screen 2012-11-04 22.41.14.png
SLboat-Screen 2012-11-04 22.41.23.png
  • 追踪到了这里,试试看这个补丁,处理的是InputMethodSupport.java:
73   public void inputMethodTextChanged(InputMethodEvent event) { //输入输入法文字变动,看起来你太敏感了呢,这是IMF里的框架-有趣吧。
74     AttributedCharacterIterator text = event.getText();
75     committed_count = event.getCommittedCharacterCount(); //看起来是输入总字数
76     if(isFullWidthSpaceInput(text)){ //看起来这是中文有关的玩意
77       textManager.insertFullWidthSpace();
78       caretPositionChanged(event);
79       return;
80     }
81     if(isBeginInputProcess(text, textManager)){ //已经开始输入法了,是的它能认出来
82       textManager.beginCompositionText(text, committed_count);//细微的区别就是begin这玩意,committed_count看起来是输入了中文的计数-对中文来说
83       caretPositionChanged(event);
84       return;
85     }
86     if (isInputProcess(text)){ //还在输入过程中
87       textManager.processCompositionText(text, committed_count);
88       caretPositionChanged(event);
89       return;
90     }
91     //textManager.endCompositionText(text, committed_count); //看起来不正常结束的时候就是在这里咯
92     textManager.processCompositionText(text, committed_count); //一个测试补丁
93     caretPositionChanged(event);
94   }
  • 小孩子看着大人的世界总是看起来一起有合理的理由的。
  • Java想到安卓,这玩意就是靠这个体系来运作的吧,真神奇
  • 输入法的events看起来有这些玩意:
SLboat-Screen 2012-11-04 20.19.53.png
  • 看起来太多的东西都是输入法里的API,比如
inputMethodTextChanged
  • 一个中文有关的输入法方面的API介绍
http://www.goomoon.com/school/java/index.html?java/awt/event//class-useInputMethodListener.html
  • 源码里提到了使用了一个IMF库:
http://java.sun.com/j2se/1.5.0/docs/guide/imf/
  • FullWidthSpace看起来指的是全角字符
  • 那么还有一个问题是什么,那就是发生了替换,当被认为是许可得时候,输入被替换了。
  • 即便是原始的输入法处理,可以注意到并不是不能用输入法,而是必须逐个选词,而且总会抛弃最后一个。
SLboat-Screen 2012-11-04 19.40.04.png
    • 看起来它分不清怎么才是真正的输入结束,还是在输入进程里。
  • 那么输入法的处理一定遇到麻烦了。
  • 试图去掉输入法支持,修改InputMethodSupport.java,的确有效果,输入法变得不能输入不能显示了。
29 public InputMethodSupport(JEditTextArea textArea) {
30     textManager = new CompositionTextManager(textArea);
31     //textArea.enableInputMethods(true);
32     //textArea.addInputMethodListener(this);
33   }
  • 但是在processing里2010年就已经支持了呢[1]
  • 可是据传五笔可以输入,那是因为没有选字过程吧。
  • 而这个InputMethodSupport.java在0018里是完全还不存在的。
  • 看起来跟这里有关系:
Arduino-1.0.1/app/src/processing/app/syntax/im/InputMethodSupport.java
import processing.app.syntax.JEditTextArea;

/**
 * Support in-line Japanese input for PDE. (Maybe Chinese, Korean and more)
 * This class is implemented by Java Input Method Framework and handles
 * If you would like to know more about Java Input Method Framework,
 * Please see http://java.sun.com/j2se/1.5.0/docs/guide/imf/
 * 
 * This class is implemented to fix Bug #854.
 * http://dev.processing.org/bugs/show_bug.cgi?id=854
 *  
 * @author Takashi Maekawa (takachin@generative.info)
 */
  • 在查看源码最近的变更,可以排除掉中间那个玩意:
SLboat-Screen 2012-11-04 19.13.12.png
  • 一处极可能有关的地方,灵感来自Processing的源码[2]
Arduino-1.0.1/app/src/processing/app/syntax

发布版本

  • 在build.xml里找到了dist参数,可以发布特定版本
SLboat-Screen 2012-11-05 0.27.13.png

困扰

  • 已发现可以强制指定,但是需要在目标系统编译
SLboat-Screen 2012-11-05 1.42.43.png
  • 似乎只能根据目标系统版本,如何到别的平台呢
看起来只有封装方式和系统有关,jar是几乎通用的,尚未确定

调试与修改

土方法、真方法

  • 进入编译目录
CD Arduino IDE/Arduino-1.0.1/build
  • 执行
ant run
  • 等着打开吧

第一次修改尝试

  • 修改一个工具栏的随意图标大小
SLboat-Screen 2012-11-04 17.51.06.png
  • 编译并且运行
ant run
  • 得出来一个怪异的工具栏,啊哈!
SLboat-Screen 2012-11-04 17.53.13.png
  • 那么涉及核心的玩意就在这里了:
/Users/sen/tools/Arduino IDE/Arduino-1.0.1/app/src/processing

有趣

  • 源码里包含了eclipse项目文件,看起来是这样的,文件是
.project
  • 菜单看起来是一个一个画出来的。
  • 源码的编译并不是太麻烦嘛。
  • Arduino用的是它的源码至少看起来它是这样,而它的源码编译指导是:
http://code.google.com/p/processing/wiki/BuildInstructions
  • 有个Process的玩意到底是啥子,去到官网下载这玩意:
http://processing.org/download/
  • 如此相似的界面,这里面有什么关系
SLboat-Screen 2012-11-04 17.39.51.png
  • 这玩意是啥子,core的库
SLboat-Screen 2012-11-04 16.58.19.png
  • 编译了0018的源码,但是看起来在MAC也搞不了中文阿
SLboat-Screen 2012-11-04 16.55.55.png

编译源码成功

  • git太慢了可能因为子文件居多
  • 直接下载zip包,在github页面
https://nodeload.github.com/arduino/Arduino/zip/1.0.1
  • 进入下载解压后的build文件夹,执行ant,看起来可以了
SLboat-Screen 2012-11-04 1.58.35.png
SLboat-Screen 2012-11-04 1.58.46.png
SLboat-Screen 2012-11-04 2.00.03.png

好奇

  • 源码在哪里
所有的都是源码
  • 如何组织呢
组件包、组件

见识

BuildingArduino - arduino 沿途见识[3]

Mac OS X
On Mac OS X, install Apple's Developer Tools and git.

Linux
On Linux, you need the Sun Java SDK, avr-gcc, avr-g++, avr-libc, make, ant, and git.

2. Grab the code from GitHub
this grabs the code as an anonymous user.

 # grab the code, it'll take a while
 git clone git://github.com/arduino/Arduino.git
 # (maybe even a long while for you dialup and international folks)

3. Build It
Use the command line.

 cd /path/to/arduino/build
 ant

  1. if everything went well, you'll have no errors. (feel free to make
  2. suggestions for things to include here for common problems)


  1. then to run it

ant run

  1. each time you make a change, use ant to build the thing
  2. and run to get it up and running.

Updating to the Latest Version
Each time you want to update to latest version from svn:

cd /path/to/arduino
git pull
git update
If new folders have been added, or you're gettin odd errors, use:

ant clean


引用信息

以下是[Arduino IDE 中文注释修改]所有用到的引用信息,向这些伟大的家伙致敬:
  1. ^ http://code.google.com/p/processing/source/detail?spec=svn6687&r=6687
  2. ^ http://code.google.com/p/processing/source/browse/trunk/processing/app/src/processing/app/syntax/im/CompositionTextManager.java?r=10207
  3. ^ BuildingArduino - arduino