代码之家  ›  专栏  ›  技术社区  ›  CodeSmith

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

  •  2
  • CodeSmith  · 技术社区  · 7 年前

    我正在使用emacs和plink连接到linux开发服务器的windows 10机器上工作。 我可以在emacs中使用 M-x shell 通过ssh连接到服务器 plink server

    当我按键盘上的回车键时,就好像我按了两次回车键而不是一次 username@server>ls<enter> file1 file2 file3 username@server> username@server>

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

    export PROMPT_COMMAND="" export PS1="\u@\H:\W> export TERM=""

    windows命令提示符现在正确地显示了plink会话,没有多余的转义字符。尽管如此,emacs外壳似乎仍然按两次enter键一次。

    接下来,我假设回车键发送的字符有问题。

    运行 showkey -a 似乎可以解释这个问题:

    在一个真正的putty窗口和windows命令提示符中,在与服务器的ssh连接中,我得到了以下showkey输出:

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

    在emacs外壳中,我得到这个输出

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

    当我按enter(dos行尾格式)时,emacs shell似乎正在发送回车和换行。那么enter被“按下两次”是有意义的。有没有办法改变shell中的这种行为?我看到了 set-buffer-file-coding-system 告诉emacs使用unix、windows或mac行结尾。但这对我来说似乎不管用,因为我是个空壳。

    1 回复  |  直到 7 年前
        1
  •  1
  •   phils    7 年前

    对于每个劣质过程,emacs对过程输入和过程输出应用独立的编码系统。

    在您的情况下,输入到进程的编码系统将是一个“dos”系统,从而导致crlf对被发送到进程以进行eols。

    你可以使用 M—X set-buffer-process-coding-system 以交互方式为当前缓冲区更改这些输入/输出编码系统。默认绑定到 C-X 雷特

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

    (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 G (emacs)Communication Coding 更多信息。