我倾向于在emacs中运行我的shell,但是当我使用它来ssh到另一台计算机时,这会破坏tab-completion。有办法解决这个问题吗?
答案 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/")