【问题标题】:Emacs remote shellEmacs 远程外壳
【发布时间】:2010-11-11 04:09:28
【问题描述】:

我倾向于在 emacs 中运行我的 shell,但是当我使用它来 ssh 到另一台计算机时,这会破坏 tab-completion。有没有办法解决这个问题?

【问题讨论】:

  • 您能详细说明一下吗?您是否期望在特定于机器的路径(例如本地磁盘)上完成文件名?一般命令?

标签: shell emacs


【解决方案1】:

我使用 dired 来访问远程机器并在那里打开一个 shell。

这是我使用的函数,取自Tikhon Jelviss' emacs configuration并修改:

(defun anr-shell (buffer)
  "Opens a new shell buffer where the given buffer is located."
  (interactive "sBuffer: ")
  (pop-to-buffer (concat "*" buffer "*"))
  (unless (eq major-mode 'shell-mode)
    (dired buffer)
    (shell buffer)
    (sleep-for 0 200)
    (delete-region (point-min) (point-max))
    (comint-simple-send (get-buffer-process (current-buffer)) 
                        (concat "export PS1=\"\033[33m" buffer "\033[0m:\033[35m\\W\033[0m>\""))))

例子:

(anr-shell "/vagrant@localhost#2222:/vagrant/")

【讨论】:

    【解决方案2】:

    在缓冲区 A 中调用的 M-x shell 将切换到 shell 缓冲区 B;通常是 shell。不出所料,它会在必要时创建 B。前缀 arg 将导致它询问 B 的名称。如果 A 正在查看远程主机上的某些内容,则 shell 将在远程主机上运行。但前提是它无法找到现有的 B。此时文件名完成将起作用。

    在 emacs wiki 中有一些关于如何修改这个的注释。例如,参见this section 中的 my-shell 函数,它将扩展 B 的默认名称,以便远程文件获得远程 shell。我通过advising the shell function 做同样的事情。

    文件名自动完成将正常工作。命令自动完成?少这样。对我来说,它会阻止 emacs,然后实际上不起作用。

    【讨论】:

      【解决方案3】:

      我刚刚编写了一个小函数来打开远程主机上的 shell。在shell 之前的cd 调用使选项卡完成工作。

      这可能与您想要的不同,因为它会打开一个新的 shell 而不是在本地 shell 中进行 ssh'ing。除此之外,您还可以研究破解 emacs Directory Tracking(或看看还有谁拥有)。

      (defun remote-shell (&optional host)
        "Open a remote shell to a host."
        (interactive)
        (with-temp-buffer
          (let ((host (if host host (read-string "Host: "))))
            (cd (concat "/scp:" host ":"))
            (shell (concat "*" host "*")))))
      
      (defun myserver-shell () (interactive) (remote-shell "myserver"))
      

      【讨论】:

        【解决方案4】:

        在另一个线程中,有人提到了我从未使用过的 eshell,但我使用 SSH 进行了尝试,并且正在发生各种不错的集成。是时候学习 eshell 了。

        【讨论】:

          【解决方案5】:

          我认为我遇到了类似的问题,并通过在删除机器上编辑我的 ~/.bash_login 并附加来解决它

          export TERM=xterm
          

          我使用 OS X,但在连接到 Linux (Debian Lenny) 时遇到问题

          【讨论】:

            【解决方案6】:

            如果您的键映射出现意外行为,您可以尝试 M-x ansi-term 来托管您的 shell。话虽如此,我无法重现您在设置中描述的问题。

            【讨论】:

              【解决方案7】:

              试试:

              M-x cd /hostname:/current/path/in/the/shell
              

              这应该设置 ange-ftp(或 tramp),然后路径的 TAB 完成应该对该 shell 正常工作 - 直到您登录到另一台机器。

              您可以设置一个 comint 进程过滤器来识别您何时键入 ssh 以自动为您执行此操作,但这很难做到,因为它应该在您退出 ssh 会话时恢复,但不会被欺骗exit 的其他用途。

              对于自动化解决方案,我建议增加 the approach I personally use 以使 Emacs 与 shell 缓冲区的当前工作目录保持同步。只需在主机名中添加一点额外信息,然后使用它来设置主机名和路径,如上所示。

              【讨论】: