在Emacs中尝试使用终端

3 投票
2 回答
1529 浏览
提问于 2025-04-15 16:20

我在使用emacs的时候遇到了很多问题,特别是想让终端正常工作:

    M-x term

我安装了cygwin,并且调整了我的.emacs文件,添加了一些路径:

    (setenv "PATH" (concat "c:/cygwin/bin;" (getenv "PATH")))
    (setq exec-path (cons "c:/cygwin/bin" exec-path))
    (require 'cygwin-mount)
    (cygwin-mount-activate)
    (add-hook 'comint-output-filter-functions
    'shell-strip-ctrl-m nil t)
    (add-hook 'comint-output-filter-functions
    'comint-watch-for-password-prompt nil t)
    (setq explicit-shell-file-name "bash.exe")
    ;; For subprocesses invoked via the shell
    ;; (e.g., "shell -c command")
    (setq shell-file-name explicit-shell-file-name)

但是现在当我启动终端时,屏幕上只显示空白,而且程序似乎“卡住”了。

当我启动:

    M-x shell

确实可以启动bash这个命令行工具,浏览文件夹也没问题(用cd、ls、cp、rm等命令)。不过,当我尝试打开Python命令行时,它又卡住了,我输入一些东西后,命令行就崩溃了。我这样做是不是有什么大问题,或者有没有人能给我指个方向,告诉我网上有什么解决办法?(我已经查了很多资料。)

另外,使用SSH时也出现了错误:

“伪终端无法分配,因为标准输入不是终端。”

2 个回答

1

SSH 还会出现这样的错误:

“伪终端不会被分配,因为标准输入不是一个终端。”

为了解决这个问题,在 NTEmacs(不是 Cygwin 的 Emacs)中,我做了以下几步:

  1. 安装 Cygwin 的 gcc。
  2. 用它把 fakecygpty.c 编译成 fakecygpty.exe。
  3. 在 Emacs 的命令行中运行 fakecygpty ssh my_server,而不是直接运行 ssh my_server(如果 fakecygpty 在你的路径中,这样做最简单)。

我在 *shell* 中测试了这个,使用了 cmd、Cygwin bash 和 git bash,结果都很好。我的理解是,fakecygpty.c 让 NTEmacs 看起来像一个有效的 Cygwin 终端,这样 SSH 就愿意和它通信。关于 fakecygpty 和 NTEmacs 下的 SSH 的更多信息。


你还可以通过在 init.el 中添加以下内容,让 NTEmacs 正常通过 SSH 编辑文件:

(eval-after-load "tramp"
  '(progn
     (add-to-list 'tramp-methods
                  (mapcar
                   (lambda (x)
                     (cond
                      ((equal x "sshx") "cygssh")
                      ((eq (car x) 'tramp-login-program) (list 'tramp-login-program "fakecygpty ssh"))
                      (t x)))
                   (assoc "sshx" tramp-methods)))
     (setq tramp-default-method "cygssh")))

我还需要把我的 Tramp 更新到 2.2.7,才能从 NTEmacs 通过 SSH 编辑文件。

希望这能帮到某些人。 :)

3

你是不是在用默认的 'Cygwin Bash Shell'?这个是会在Windows的命令提示符里启动的,屏幕大小不能拖动调整。这个壳子非常糟糕,因为它底层是Windows的组件。你可以试试用rxvt,或者一些putty的变种。

如果这些都设置好了,那问题可能是termcap的问题。有些人把他们的Cygwin的TERM变量设置成'xterm',因为很多远程机器上没有安装像rxvt-cygwin-native这样的termcap。这样在本地覆盖它会导致一些程序在进行各种终端操作时出问题。

在你的~/.bash_profile文件里,你可以把终端设置成这样:export TERM=rxvt-cygwin-native

想了解更多关于rxvt的内容,可以看看我的rxvt安装指南和小贴士

撰写回答