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

时间:2018-06-18 22:02:04

标签: windows shell emacs carriage-return linefeed

我正在使用Emacs和plink连接到Linux开发服务器的Windows 10机器上工作。 我可以使用aws configure在Emacs中启动shell 并使用M-x shell

将ssh发送到服务器

当我在键盘上按Enter键时,就像我按了两次而不是一次 plink server

我最初认为这与终端的无关转义字符有关,正如其他问题所表明的那样。打开一个Windows命令提示符并使用plink ssh到服务器输出这些无关的字符,我可以在我的bashrc中使用以下变量删除它们:

username@server>ls<enter> file1 file2 file3 username@server> username@server>

Windows命令提示符现在正确显示了plink会话,没有多余的转义字符。尽管如此,Emacs shell似乎仍然按下两次输入一次。

接下来,我假设输入密钥发送的字符有问题。

正在运行export PROMPT_COMMAND="" export PS1="\u@\H:\W> export TERM=""似乎解释了这个问题:

在真实的putty窗口和Windows命令提示符下,我在与服务器的ssh连接中获得了以下showkey输出:

showkey -a

在Emacs shell中我得到了这个输出

showkey -a Press any keys - Ctrl-D will terminate this program ^M 13 0015 0x0d

当我按下Enter键(DOS行结束格式)时,似乎Emacs shell正在发送回车符和换行符。然后输入被按下两次是有道理的。&#34;有没有办法在shell中改变这种行为?我已经看到使用showkey -a Press any keys - Ctrl-D will terminate this program ^M^J 13 0015 0x0d 10 0012 0x0a告诉Emacs使用Unix,Windows或Mac行结尾。但是这对我来说似乎并不适用,因为我在一个shell中。

1 个答案:

答案 0 :(得分:1)

对于每个劣等流程,Emacs为流程输入和流程输出应用独立的编码系统。

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

您可以使用 M-x set-buffer-process-coding-system交互地更改当前缓冲区的这些输入/输出编码系统。默认绑定到 C-x RET p

对于某些模式,您还可以使用挂钩自动执行此操作。例如:

(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-h i g (emacs)Communication Coding