首页 > 解决方案 > 如何更改 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 行尾。但这似乎对我不起作用,因为我在壳里。

标签: windowsshellemacscarriage-returnlinefeed

解决方案


对于每个劣质进程,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更多信息,请参阅。


推荐阅读