From 40203d95d3c479a4dfd6b7c40f632a4f9d373b01 Mon Sep 17 00:00:00 2001 From: buddygr <80158767+buddygr@users.noreply.github.com> Date: Mon, 24 Jan 2022 15:23:06 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E6=AD=A3bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正了退格不能跨行消除的bug,修正中文换行末尾缺字符的bug --- .../emulatorview/TerminalEmulator.java | 40 +++++++++++++++++-- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/termemulator/src/main/java/jackpal/androidterm/emulatorview/TerminalEmulator.java b/termemulator/src/main/java/jackpal/androidterm/emulatorview/TerminalEmulator.java index 612f57c3..bb7cee51 100644 --- a/termemulator/src/main/java/jackpal/androidterm/emulatorview/TerminalEmulator.java +++ b/termemulator/src/main/java/jackpal/androidterm/emulatorview/TerminalEmulator.java @@ -766,8 +766,9 @@ private void process(byte b, boolean doUTF8) { } break; - case 8: // BS - setCursorCol(Math.max(0, mCursorCol - 1)); + case 8: // BS 退格 + //乘着船 修改:修正了不能跨行消除的bug + doBackspace(); break; case 9: // HT @@ -867,6 +868,30 @@ private void process(byte b, boolean doUTF8) { } } + private void doBackspace(){ //退格 by 乘着船 + char[] line; //目标字符串行 + int i; //计数变量 + int width=0; //单字符宽度 + int tWidth=0; //累计字符宽度 + if (mCursorCol<=0) { //跨行退格 + line = mScreen.getScriptLine(mCursorRow-1);//目标行:上一行 + //定位光标到:上一行最后一个字符 + setCursorRowCol(mCursorRow-1,line.length-1); + } else { //本行退格 + line = mScreen.getScriptLine(mCursorRow);//目标行:本行 + } + for (i=0;i=光标当前位置 + if(tWidth>=mCursorCol){ + width-=tWidth-mCursorCol;//修正末尾误差 + break; + } + } + setCursorCol(mCursorCol-width);//定位当前行光标列位置 + } + private boolean handleUTF8Sequence(byte b) { if (mUTF8ToFollow == 0 && (b & 0x80) == 0) { // ASCII character -- we don't need to handle this @@ -1862,7 +1887,12 @@ private void emit(int c, int style) { int width = UnicodeTranscript.charWidth(c); if (autoWrap) { - if (mCursorCol == mColumns - 1 && (mAboutToAutoWrap || width == 2)) { + /*乘着船 修改: + 修正中文换行末尾缺字符的bug, + 剩一个字符时,或者上次操作剩两个以下字符时(mAboutToAutoWrap变量), + 立即换行,避免下个字符是中文,导致超出范围显示不全 + */ + if ((mCursorCol >= mColumns - 1) || mAboutToAutoWrap) { mScreen.setLineWrap(mCursorRow); mCursorCol = 0; mJustWrapped = true; @@ -1895,7 +1925,9 @@ private void emit(int c, int style) { } if (autoWrap) { - mAboutToAutoWrap = (mCursorCol == mColumns - 1); + //乘着船 修改:修正中文换行末尾缺字符的bug, + //剩两个或一个字符时,即可换行,避免下个字符是中文,导致超出范围显示不全 + mAboutToAutoWrap = (mCursorCol >= mColumns - 2); //Force line-wrap flag to trigger even for lines being typed if (mAboutToAutoWrap) From a950224b073032cfd2bab9b18868a49331a7ac2c Mon Sep 17 00:00:00 2001 From: buddygr <80158767+buddygr@users.noreply.github.com> Date: Fri, 25 Feb 2022 23:05:16 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=5F=5Fdoc=5F=5F=E4=B8=BAN?= =?UTF-8?q?one=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- qpython/src/main/java/org/qpython/qpy/console/ScriptExec.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qpython/src/main/java/org/qpython/qpy/console/ScriptExec.java b/qpython/src/main/java/org/qpython/qpy/console/ScriptExec.java index 9a23d02d..8639940b 100644 --- a/qpython/src/main/java/org/qpython/qpy/console/ScriptExec.java +++ b/qpython/src/main/java/org/qpython/qpy/console/ScriptExec.java @@ -212,7 +212,7 @@ public String[] getPyEnv(Context context, String path, String term, String pyPat env[14] = "PYTHONSTARTUP="+filesDir+"/lib/python2.7/site-packages/qpy.py"; } - env[6] = "PYTHONOPTIMIZE=2"; + env[6] = "PYTHONOPTIMIZE=1";//修复__doc__为None的问题 File td = new File(externalStorage+"/cache"); if (!td.exists()) { From b1aec6a461134df4b4f9f039cc115bcd31607c25 Mon Sep 17 00:00:00 2001 From: buddygr <80158767+buddygr@users.noreply.github.com> Date: Fri, 25 Feb 2022 23:43:29 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E7=BB=88=E7=AB=AF=E7=9A=84=E9=80=80=E6=A0=BCbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../emulatorview/TerminalEmulator.java | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/termemulator/src/main/java/jackpal/androidterm/emulatorview/TerminalEmulator.java b/termemulator/src/main/java/jackpal/androidterm/emulatorview/TerminalEmulator.java index bb7cee51..d04712f3 100644 --- a/termemulator/src/main/java/jackpal/androidterm/emulatorview/TerminalEmulator.java +++ b/termemulator/src/main/java/jackpal/androidterm/emulatorview/TerminalEmulator.java @@ -16,17 +16,15 @@ package jackpal.androidterm.emulatorview; +import android.util.Log; + import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CodingErrorAction; -import java.util.LinkedList; import java.util.Locale; -import java.util.Stack; - -import android.util.Log; /** * Renders text into a screen. Contains all the terminal-specific knowledge and @@ -67,6 +65,7 @@ public void setKeyListener(TermKeyListener l) { private TranscriptScreen mMainBuffer; private TranscriptScreen mAltBuffer; private TranscriptScreen mScreen; + private byte backSpaceType;//退格模式 /** * The terminal session this emulator is bound to. @@ -675,11 +674,16 @@ public void append(byte[] buffer, int base, int length) { //Log.d(EmulatorDebug.LOG_TAG, "In: '" + EmulatorDebug.bytesToString(buffer, base, length) + "'"); - - if (EmulatorDebug.bytesToString(buffer, base, length).endsWith(">>> ")) { + //乘着船 修改:不同终端不同退格模式 + String s = EmulatorDebug.bytesToString(buffer, base, length); + if (s.contains("\\x08\\x08 \\x08\\x08")) + backSpaceType = 1;//传统退格模式 + else + backSpaceType = 0;//自动化退格模式 + if (s.endsWith(">>> ")) { sb = new StringBuffer(); } else if (sb != null) { - sb.append(EmulatorDebug.bytesToString(buffer, base, length) + sb.append(s .replace("\\x0d", "") .replace("\\x0a", "") .replace("\\x08", "")); @@ -869,6 +873,11 @@ private void process(byte b, boolean doUTF8) { } private void doBackspace(){ //退格 by 乘着船 + if (backSpaceType == 1){ //传统退格模式 + setCursorCol(Math.max(mCursorCol-1,0)); + return; + } + //自动化退格模式 char[] line; //目标字符串行 int i; //计数变量 int width=0; //单字符宽度