我在 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。