【发布时间】:2010-11-11 04:09:28
【问题描述】:
我倾向于在 emacs 中运行我的 shell,但是当我使用它来 ssh 到另一台计算机时,这会破坏 tab-completion。有没有办法解决这个问题?
【问题讨论】:
-
您能详细说明一下吗?您是否期望在特定于机器的路径(例如本地磁盘)上完成文件名?一般命令?
我倾向于在 emacs 中运行我的 shell,但是当我使用它来 ssh 到另一台计算机时,这会破坏 tab-completion。有没有办法解决这个问题?
【问题讨论】:
我使用 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/")
【讨论】:
在缓冲区 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,然后实际上不起作用。
【讨论】:
我刚刚编写了一个小函数来打开远程主机上的 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"))
【讨论】:
在另一个线程中,有人提到了我从未使用过的 eshell,但我使用 SSH 进行了尝试,并且正在发生各种不错的集成。是时候学习 eshell 了。
【讨论】:
我认为我遇到了类似的问题,并通过在删除机器上编辑我的 ~/.bash_login 并附加来解决它
export TERM=xterm
我使用 OS X,但在连接到 Linux (Debian Lenny) 时遇到问题
【讨论】:
如果您的键映射出现意外行为,您可以尝试 M-x ansi-term 来托管您的 shell。话虽如此,我无法重现您在设置中描述的问题。
【讨论】:
试试:
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 缓冲区的当前工作目录保持同步。只需在主机名中添加一点额外信息,然后使用它来设置主机名和路径,如上所示。
【讨论】: