1. 环境
- macOS Sierra 10.12.5
- vscode 1.20.0 最新版
2. 如何重现这个问题
在使用中文输入法输入中文的时候,一直按后退键,例如输入sfsf
,当你按了4下后退键时,你会发现,搜狗输入法弹出框虽然消失了,但是页面上还会剩下一个s
, 这是你如何再次按一下后退的话,s
就会变成bs
, 变成隐藏字符。这个一般是右边有markdown渲染插件时才会出现。
从更确切的角度说,是你的编辑器一旦开了webview,就会出现这个问题,即使是vscode的欢迎页,也是webview,也会导致这个问题。所以最好在写代码时尽量关闭webview。
3. 如何让隐藏字符现身
Mac版的vscode控制字符一般是不会显示出来的,可以用一下的方法让其显示出来
"editor.renderControlCharacters": true
在编辑器中显示的像很小的BS
, 表示backspace的意思。一般是在输入时,按了后退或者删除会偶尔出现这个字符。
4. 隐藏的控制字符会出现什么问题?
4.1. 控制字符在github上会出现问号
例如下图的的和同字之间就是出现一个隐藏字符,在github上就会出现一个带有背景的问号。
4.2. 控制字符在Hexo NexT Local Search 会导致search.xml渲染失败,搜索框一直在转圈
如果你使用浏览器打开search.xml,会发现解析报错
5. 如何解决
5.1. 手动删除隐藏字符
可以使用替换,先复制一个隐藏字符,然后把隐藏字符替换成空
5.2. 使用插件 Remove backspace control character
Remove backspace control character
在本家chromium已被合并,因此,在8月上旬发行的vscode 1.15将会重新确定(vscode 1.15, electron 1.7.4)。事实上,到现在这个问题还是没解决的
特点
格式化程序,用于删除打开的文档中包含的控制字符。要被删除的控制字符默认如下。
/[\u0000]|[\u0001]|[\u0002]|[\u0003]|[\u0004]|[\u0005]|[\u0006]|[\u0007]|[\u0008]|[\u000b]|[\u000c]|[\u000d]|[\u000e]|[\u000f]|[\u0010]|[\u0011]|[\u0012]|[\u0013]|[\u0014]|[\u0015]|[\u0016]|[\u0017]|[\u0018]|[\u0019]|[\u001a]|[\u001b]|[\u001c]|[\u001d]|[\u001e]|[\u001f]|[\u001c]|[\u007f]/gm
用法
- "editor.formatOnSave": true 如果被设定,保存时启动
- "editor.formatOnType": true 在被设定的情况下,进行变换时;输入时启动
5.3. 坐等官方给出更好的解决方案
官方这个bug依然还是open
状态。Using IME with markdown preview enabled, press ESC/BACKSPACE leads in control characters #37114
5.4. 关闭所有webview
这个问题一般出现在标签页含有webview时发生,所以在升级到vscode最新版后,在写代码时要注意,不要开启任何有webview的标签页,其中包括
- 关闭markdown渲染插件实时渲染的功能
- 关闭vscode欢迎页标签页
6. 为什么官方不直接解决这个问题?
- vscode底层使用了electron,这是
electron
的Backspace can not erase the last one character during Japanese IME conversion (macOS) #9173bug, electron不解决这个问题,vscode就不会解决。 - electron底层使用了chromium, 这是
chromium
的Two backspaces required to delete last character in webview inputbug, chromium不解决,elctron就无法解决。 - 综上,截止文章写出之时,这个问题依然没解决。
7. 参考
- Mac 上的 VSCode 编写 Markdown 总是出现隐藏字符?
- Hexo next 主题的 local search 功能失效,点击搜索链接无法弹出叠加层
- Backspace can not erase the last one character during Chinese/Japanese IME conversion (macOS) #24981
- Backspace can not erase the last one character during Japanese IME conversion (macOS) #9173
- Two backspaces required to delete last character in webview input
- 控制字符
- Using IME with markdown preview enabled, press ESC/BACKSPACE leads in control characters #37114
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。