IEx/Erlang REPL退格键删除整符号而非单字符,如何恢复正常?
解决IEx/Erl退格删除整个符号的问题及两者共同点
恢复正常退格功能的方法
临时生效(单次会话)
在IEx或Erl中执行以下命令:
io:setopts([{edit_mode, raw}]).
如果是IEx,也可以用Elixir语法:
:io.setopts([edit_mode: :raw])
执行后,退格键就会恢复为逐字符删除的正常行为。
永久生效(所有会话)
- 针对Erl和IEx通用:在用户主目录创建
.erlang文件,添加以下内容:io:setopts([{edit_mode, raw}]). - 仅针对IEx:在用户主目录创建
.iex.exs文件(如果已存在则修改),添加::io.setopts([edit_mode: :raw])
下次启动IEx或Erl时,配置会自动加载。
问题根源
Erlang/OTP默认使用emacs编辑模式(并非指Emacs编辑器,是Erlang实现的类Emacs编辑绑定),该模式下退格键默认绑定backward-kill-word操作,会删除到最近的词边界。Erlang/Elixir的语法符号(如{、}、#等)会被识别为词边界,因此会出现误删整个符号块的情况。切换到raw模式后,退格键直接发送单个字符删除信号,与普通REPL行为一致。
IEx与Erl的共同点
- 共享Erlang/OTP终端处理核心:IEx是运行在Erlang虚拟机(BEAM)上的Elixir应用,其终端交互完全依赖Erlang的
io模块和底层终端处理逻辑,因此两者的输入行为完全同步。 - 默认编辑模式一致:都默认启用Erlang的
emacs编辑模式,快捷键绑定、输入处理规则完全相同。 - 配置互通:影响终端行为的环境变量(如
$TERM)、Erlang IO配置参数,对两个REPL的作用完全一致。
内容的提问来源于stack exchange,提问作者Patrick Bucher
相关产品推荐
相关产品推荐

