Emacs tramp 模式 - 文件名自动完成不起作用

Emacs tramp 模式 - 文件名自动完成不起作用

我在 Emacs 中使用 tramp 模式通过 ssh 编辑文件。但问题是在远程 shell 上我将 ls 别名为“ls --color”。Tramp 使用 ls 进行自动完成,但无法解析彩色编码的 ls 输出。

提到的解决方案https://www.gnu.org/software/tramp/#Frequently-Asked-Questions是通过删除别名来禁用 ls 输出的颜色。我不想这样做,因为对我来说这是一个主要功能。

有没有办法重新定义 tramp 如何发出 ls 命令,以便我可以保留我的 shell 配置并仍然使用 tramp 的文件名完成功能。

编辑1:看来问题出在其他方面。我尝试按照 @chepner 的建议将别名更改为“ls --color=auto”,然后改为简单的“ls”。但仍然不起作用。我该如何进一步解决问题?

答案1

重新定义您的别名为 read

alias ls="ls --color=auto"

这样,ls只有当它感觉到正在向终端写入时,才会对其输出进行着色。我不熟悉tramp,但这应该足够了。

答案2

我还会做的另一件事是看看周围是否有任何东西表明你处于“流浪模式”

说、做:

printenv | sort > ~/notramp.txt

然后在 emacs/tramp-mode 中:

printenv | sort > ~/withtramp.txt

比较两个环境文件,看看有什么不同。

然后,在你的 ~/.bashrc 中,你可以输入

if [ -z "$TRAMPFLAG" ]
then
    alias ls='ls --color=auto'
fi

答案3

Tramp 发送以下 Perl 代码片段以获取文件补全

\perl5 -e 'sub case {
 my $str = shift;
 if ($ARGV[2]) {
  return lc($str);
 }
 else {
  return $str;
 }
}
opendir(d, $ARGV[0]) || die("$ARGV[0]: $!\nfail\n");
@files = readdir(d); closedir(d);
foreach $f (@files) {
 if (case(substr($f, 0, length($ARGV[1]))) eq case($ARGV[1])) {
  if (-d "$ARGV[0]/$f") {
   print "$f/\n";
  }
  else {
   print "$f\n";
  }
 }
}
print "ok\n"
' /home/ '' 0

由于缺少库,远程主机上的 perl5 损坏。解决方案是手动修复损坏的 perl5。这一切都归功于迈克尔·阿尔比努斯

答案4

Tramp 使用复杂的技术来实现跨各种系统的移植,但并非万无一失。通常,为了提供远程文件名补全等功能,tramp 实际上会在远程主机上运行适度的 perl 脚本。因此,请检查以确保已在远程主机上安装、配置并可用 perl 5。

相关内容