adb shell: 无法使用 ESCAPE 键

adb shell: can't use the ESCAPE key

我想在运行 adb shell 时使用 vi。启动 "vi" 很容易。但是我发现ESC键好像打不通,无法退出插入模式

更广泛地说,我似乎根本无法将 ESC 字符发送到 adb shell。我已经非常彻底地扫描了网络,但没能找到有类似问题的人(更不用说答案了)。

我在三星 S4 上运行 VRUFNK1。在 PC 端,我在 Windows.

下从 Cygwin 运行 "adb shell" 命令

想法???


更新:这里有一些可能的线索。

  1. adb shell 似乎不是问题所在。我可以在运行的文件中捕获 ESC
    od -cb > file,所以ESC好像是进入adb下正在运行的程序shell。
  2. 所有命令都在我的 "adb shell" 中得到回显(好像 set -v 打开了,但实际上没有)。
  3. 我注意到输入似乎没有从我的 cygwin shell 在 "raw mode" 中发送到 adb shell -- 也就是说,我输入的任何文本都会在本地缓冲,直到我点击 carriage return——然后整行被发送。我不确定为什么这会使 ESC 无效,但肯定 vi 不希望以这种方式接收输入,这可能表明我的环境中存在异常情况。

与#1 类似,bash (Bash X) 似乎收到了它,尽管来自 bash 的回显非常奇怪。我可以使用 ESC 在我的 bash shell (Bash X) 中输入 "edit mode" 来滚动浏览我的历史记录(我已经运行 set -o vi),但是体验很奇怪.当我按下 ESC,k 时,屏幕上没有任何变化,但我在命令历史记录中的位置上升了一个梯级(应该如此);随后按 'k' 会导致 'k' 回显到屏幕(而不是我的历史列表中的相关命令)。当我最终按下回车 return 时,我的历史列表中的正确命令被执行 (!)。


更新 2:进展……
我尝试将 "adb shell" 中的 stty 值设置为与我的 cygwin bash shell 中的相同,但没有任何效果。

我也试过这个:Avoiding escape timeout issues in vim 但没有用。

部分解决方案: 在 ESC 后立即输入 <cr> 在 "vi" 有效时——ESC 被接受,我可以退出编辑器。尴尬了,编辑window还是不能用(好像TERM设置错了),不过这就是进步了

此外,当我 ssh 进入时一切正常。shell 由 telnet 服务器启动;与直接在设备上使用终端仿真器的情况类似。 Ssh 有自己的服务器,然后分叉 shell。在 "adb shell" 的情况下,shell 由 /sbin/adbd 分叉——据我所知,该环境只是有些不寻常之处。这对我来说是一大步——至少现在我可以使用我的 PC 在设备上进行全屏编辑(而不是直接在 S4 的小屏幕上编辑)。感谢 Jack Palevich 的建议。

此时我只能想到两件事:

  1. 尝试对某人的设备运行 adb shell(但设备必须运行 root,这样我才能运行 Busybox 的 "vi")(顺便说一句,"vi" 的版本不是问题 -- 它在 ssh 上运行良好。)
  2. 作为其他人在我的设备上的 "adb shell" 中运行 "vi",从他们的主机(最好是之前在某处成功运行 "adb shell" 和 vi 的人。

我开始认为它根本行不通。


更新 3:来自 XDA 开发人员的信息
我在 XDA 开发者论坛上找到了一些相关帖子。人们似乎长期以来(至少从 2010 年开始)就遇到了这个问题。我没有找到任何解决方案。

XDA Link 1
XDA Link 2
XDA Link 3

还有一段列出了符合我经验的各种 perceived/proposed adb shell 错误,这里:

Proposed ADB Shell Bugs

你是对的 - 它在 Windows 或 Cygwin shell 下根本不起作用。我发现使它工作的最简单方法是使用 PuTTYTray

在链接的线程中查看 my answer 以获取说明和其他详细信息。

另一个解决方案:使用 Windows PowerShell 而不是 cygwin。 'o'、'esc' 和“:wq”等命令在这里工作得很好。