输入'/<任意内容>:'模式后Emacs卡顿的调试求助
/myhost:时卡顿的调试步骤 我之前也碰到过类似的Tramp卡顿问题,结合你的情况(ssh/scp正常、未修改配置),给你几个具体的调试和排查方向:
临时禁用Tramp补全,定位问题根源
卡顿提示是Making completion list...,大概率是Tramp在尝试生成远程主机的补全选项时卡住了。你可以先临时关闭补全规则验证:
在scratch缓冲区输入以下代码,按C-x C-e执行:(setq tramp-completion-rules nil)之后再尝试
C-x C-f /myhost:,如果不再卡顿,就说明问题出在补全逻辑上,接下来可以针对性排查补全相关的配置或远程主机的响应问题。开启Tramp调试日志,追踪卡顿时的操作
打开详细的Tramp日志,能清楚看到卡顿发生在哪个执行环节:
执行以下代码开启调试:(setq tramp-verbose 10)再次触发卡顿操作后,查看
*tramp/ssh myhost*(或对应主机名的Tramp日志缓冲区),里面会记录每一步的远程命令调用,比如是否卡在获取远程目录列表、用户信息等步骤上,这能帮你精准定位问题点。排查主机名解析问题
有时候Tramp的反向解析或DNS查询会导致延迟,你可以试试直接用远程主机的IP地址代替主机名,比如C-x C-f /192.168.x.x:,如果不再卡顿,说明是本地或远程的DNS解析出现了问题,比如DNS服务器超时、主机名反向解析失败等。切换Tramp连接方法验证
虽然你说ssh和scp功能正常,但Tramp对不同连接方法的调用逻辑可能有差异,试试临时切换到scp方法:(setq tramp-default-method "scp")再尝试连接,如果卡顿消失,可能是ssh相关的Tramp配置(比如连接复用)出了问题,可以进一步检查
~/.ssh/config里的配置是否有异常。清理Tramp缓存文件
缓存文件损坏也可能导致异常卡顿,关闭Emacs后,删除Tramp的缓存目录(一般是~/.emacs.d/tramp),重新打开Emacs再尝试连接,看是否恢复正常。手动验证远程命令的响应速度
Tramp在生成补全列表时会执行一些远程命令,比如获取用户目录、列表根目录等,你可以手动在命令行执行这些命令,看是否有延迟:ssh myhost 'ls -d /*' ssh myhost 'cat /etc/passwd | cut -d: -f1'如果这些命令执行卡顿,那问题出在远程主机本身,比如主机负载过高、磁盘IO缓慢等,和Emacs无关。
内容的提问来源于stack exchange,提问作者Timur

