如何更改 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
了解更多信息。
我正在 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
了解更多信息。