如何更改 emacs shell(回车 return / 换行符)中使用的行尾样式?

How can I change which line ending style is used in the emacs shell (Carriage return / line feed)?

我正在 windows 10 机器上工作,使用 Emacs 和 plink 连接到 Linux 开发服务器。 我可以使用 M-x shell 在 Emacs 中启动 shell 并通过 plink server

连接到服务器

当我在键盘上按 enter 时,就像我按了两次 enter 而不是一次 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 window 和 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

当我按回车键时,Emacs shell 似乎在发送一个回车符 return 以及一个换行符(DOS 行结束格式)。那么 enter 是 "pressed twice." 是有道理的 有什么方法可以改变 shell 中的这种行为吗?我见过使用 set-buffer-file-coding-system 告诉 Emacs 使用 Unix,Windows 或 Mac 行尾。但这似乎对我不起作用,因为我在 shell。

对于每个下级进程,Emacs 为进程输入和进程输出应用独立的编码系统。

在您的情况下,用于流程输入的编码系统将是一个 "dos" 系统,导致 CRLF 对被发送到 EOL 流程。

您可以使用 M-x set-buffer-process-coding-system 为当前缓冲区交互更改这些 input/output 编码系统。默认绑定到 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))

根据交互式提示,第一个参数是 "Coding-system for output from the process",第二个参数是 "Coding-system for input to the process"。

参见C-hig (emacs)Communication Coding了解更多信息。