带有xmlstarlet和tramp的Flymake会挂起emacs

时间:2013-11-10 15:51:45

标签: emacs tramp flymake

我在Emacs配置中启用了flymake。 在本地它工作正常,但当我尝试用tramp打开一个远程html文件时,Emacs挂起,我必须杀死它。

我试着用gdb检查,堆栈的顶部如下:

#0  0x00007fcee786c83c in __pselect (nfds=<optimized out>, readfds=<optimized out>, writefds=<optimized out>, exceptfds=<optimized out>, timeout=<optimized out>, sigmask=<optimized out>)
at ../sysdeps/unix/sysv/linux/pselect.c:79
#1  0x00000000004d02f7 in xg_select (fds_lim=13, rfds=0x7fff4d830210, wfds=0x0, efds=0x0, timeout=0x7fff4d830460, sigmask=0x0) at xgselect.c:48
#2  0x00000000005947f3 in wait_reading_process_output (time_limit=<optimized out>, nsecs=0, read_kbd=0, do_display=false, wait_for_cell=12096626, wait_proc=<optimized out>, just_wait_proc=1) at process.c:4633
#3  0x0000000000597429 in Faccept_process_output (process=56383997, seconds=<optimized out>, millisec=<optimized out>, just_this_one=<optimized out>) at process.c:4026

所以看起来由于某种原因,远程机器上的xmlstarlet进程,但我不明白为什么。

flymake使用的命令应为xmlstarlet val filename.html,该命令在命令行中没有任何问题。配置flymake以使用其他程序(如tidy或xmllint)不会改变任何内容。

关于我能做些什么来调试问题的任何建议?

修改

事实上,过了一会儿(至少1分钟),命令就完成了。启动后,不再等待相同的缓冲区,并且flymake按预期工作。

系统详情

我从Ubuntu 12.04机器连接。我试图连接到FreeBSD 9.3机器,但我在DragonflyBSD机器上遇到了同样的问题。远程shell在两个系统上都是zsh,但将其更改为bash并没有帮助。

堆栈跟踪

这是我得到的完整lisp堆栈跟踪。

https://gist.github.com/mrighele/8371399

flymake-html-initemacs wiki

中显示的tramp_perl_file_truename () { function> \perl5 -e ' function quote> use File::Spec; function quote> use Cwd "realpath"; function quote> sub recursive { function quote> my ($volume, @dirs) = @_; function quote> my $real = realpath(File::Spec->catpath( function quote> $volume, File::Spec->catdir(@dirs), "")); function quote> if ($real) { function quote> my ($vol, $dir) = File::Spec->splitpath($real, 1); function quote> return ($vol, File::Spec->splitdir($dir)); function quote> } function quote> else { function quote> my $last = pop(@dirs); function quote> ($volume, @dirs) = recursive($volume, @dirs); function quote> push(@dirs, $last); function quote> return ($volume, @dirs); function quote> } function quote> } function quote> $result = realpath($ARGV[0]); function quote> if (!$result) { function quote> my ($vol, $dir) = File::Spec->splitpath($ARGV[0], 1); function quote> ($vol, @dirs) = recursive($vol, File::Spec->splitdir($dir)<sive($vol, File::Spec->splitdir($dir)) <sive($vol, File::Spec->splitdir($dir)); function quote> $result = File::Spec->catpath($vol, File::Spec->catdir(@di<>catpath($vol, File::Spec->catdir(@dir <>catpath($vol, File::Spec->catdir(@dirs), ""); function quote> } function quote> if ($ARGV[0] =~ /\/$/) { function quote> $result = $result . "/"; function quote> } function quote> print "\"$result\"\n"; function quote> ' "$1" 2>/dev/null function> } 2>/dev/null; echo tramp_exit_status $? tramp_exit_status 0

有趣的是,当我发送信号时,文件缓冲区的内容会被以下内容覆盖,不确定是否有任何兴趣。

{{1}}

1 个答案:

答案 0 :(得分:1)

尝试以下方法:

(setq debug-on-event 'sigusr2)

然后当Emacs被冻结时,从shell执行kill -USR2 <emacspid>。这应该有希望给你一个lisp级别的回溯,这将有助于追踪问题。