windows - 如何更改 emacs shell 中使用的行尾样式(回车/换行)?
问题描述
我正在使用 Emacs 和 plink 连接到 Linux 开发服务器的 Windows 10 机器上工作。我可以在 Emacs 中使用M-x shell
和 ssh 启动一个 shell 到服务器plink server
当我在键盘上按回车时,就像我按了两次而不是一次回车
username@server>ls<enter>
file1 file2 file3
username@server>
username@server>
正如其他问题所表明的那样,我最初认为这与终端的无关转义字符有关。打开 Windows 命令提示符并使用 plink 向服务器 ssh 输出这些无关字符,我可以在我的 bashrc 中使用以下变量删除它们:
export PROMPT_COMMAND=""
export PS1="\u@\H:\W>
export TERM=""
Windows 命令提示符现在可以正确显示 plink 会话,没有多余的转义字符。尽管如此,Emacs shell 似乎仍然按一次回车键两次。
接下来,我假设回车键发送的字符有问题。
运行showkey -a
似乎可以解释问题:
在一个真正的 putty 窗口和 Windows 命令提示符下,我在与服务器建立 ssh 连接时得到了以下 showkey 输出:
showkey -a
Press any keys - Ctrl-D will terminate this program
^M 13 0015 0x0d
在 Emacs shell 我得到这个输出
showkey -a
Press any keys - Ctrl-D will terminate this program
^M^J 13 0015 0x0d
10 0012 0x0a
当我按下回车(DOS 行结束格式)时,Emacs shell 似乎正在发送回车和换行。那么输入是“按两次”是有道理的。有什么办法可以改变 shell 中的这种行为吗?我见过使用set-buffer-file-coding-system
来告诉 Emacs 使用 Unix、Windows 或 Mac 行尾。但这似乎对我不起作用,因为我在壳里。
解决方案
对于每个劣质进程,Emacs 对进程输入和进程输出应用独立的编码系统。
在您的情况下,用于流程输入的编码系统将是“dos”系统,从而导致将 CRLF 对发送到 EOL 流程。
您可以使用M-x set-buffer-process-coding-system
交互方式为当前缓冲区更改这些输入/输出编码系统。默认绑定到C-xRETp
对于某些模式,您还可以使用挂钩自动执行此操作。例如:
(add-hook 'shell-mode-hook 'my-shell-mode-hook)
(defun my-shell-mode-hook ()
"Custom `shell-mode' behaviours."
(set-buffer-process-coding-system 'utf-8-unix 'iso-latin-1-unix))
根据交互式提示,第一个参数是“进程输出的编码系统”,第二个参数是“进程输入的编码系统”。
有关C-hig (emacs)Communication Coding
更多信息,请参阅。
推荐阅读
- java - 在Java中查找2个数组中匹配元素的数量
- python - 使用 PUT 请求
进入 etcd 导致空值 - swift - 呈现控制器时呈现加载图像的延迟
- uwp - GetThumbnailsAsync 的内存问题
- javascript - 将值恢复到 tokeninput 字段 - jquery 错误
- sql-server - 将 Postman 与 SQL Server Management Studio 集成
- regex - 使用正则表达式解析括号之间的信息
- php - PHP 无法在 Mac OS 10.13 上运行
- ios - 无法更改共享扩展导航栏标题颜色(Swift)
- r - 包含未在闪亮中完全生成的反应项目的列表