Emacs远程shell

时间:2009-07-15 21:17:05

标签: shell emacs

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

7 个答案:

答案 0 :(得分:9)

尝试:

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缓冲区的当前工作目录保持同步。只需在主机名中添加一些额外的信息,然后使用它来设置主机名和路径,如上所示。

答案 1 :(得分:2)

在另一个帖子中,有人提到我从未使用的eshell,但我尝试使用SSH,并且正在进行各种良好的集成。是时候学习eshell了。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我有一个类似的问题我想通过在删除机器上编辑我的〜/ .bash_login来解决它并追加

export TERM=xterm

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

答案 4 :(得分:0)

我刚写了一个小函数来打开远程主机上的shell。 cd之前shell调用可让标签完成工作。

这可能与您想要的不同,因为它在本地shell中打开一个新shell而不是ssh'ing。除此之外,您可以查看黑客电子邮件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"))

答案 5 :(得分:0)

在缓冲区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然后实际上无法正常工作。

答案 6 :(得分:0)

我使用 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/")