1

我正在使用 Ubuntu 12.04 和 Octave:

$ octave
octave:1> _

我将编辑器设置为 gedit:

octave:1> edit editor "gedit %s"

我编辑一个函数:

octave:2> edit someFunction

gedit 按预期打开 someFunction.m 并在 gedit 仍然打开文件时提示返回:

octave:3> _

我运行其他一些长期运行的功能:

octave:3> runAllTests

在 runAllTests 执行时,我按 CTRL-C 中断它。

观察到的行为是 runAllTests 被中断并且 gedit 被杀死。

预期的行为是 runAllTests 被中断并且 gedit 没有被杀死。

有谁知道在这种情况下如何阻止 CTRL-C 杀死 gedit ?或者,是否有另一种方法可以在不杀死 gedit 的情况下中断 runAllTests?

4

4 回答 4

2

那个设定:

edit editor "gedit %s &"

导致 octave 将编辑器置于“后台”,因此 CTRL-C 不会影响它并具有预期的行为。

于 2012-06-28T06:31:40.440 回答
0

尝试:

edit mode async

它指定了编辑命令的异步执行模式

于 2012-06-29T16:11:36.307 回答
0

问题是 CTRL+C 也是一个复制命令。IT 可能需要在 Octave GUI Xoctave中进行定制。他们声称可以进行定制。

于 2013-04-03T15:33:31.110 回答
0

不幸的是,在使用命令行 (octave-cli) 时,使用 '&' 将分叉进程置于后台是不够的。

GNU Octave 开发网页上有一个关于此问题的错误。

当然,这不仅仅是编辑器的问题,任何新的分叉进程都会受到影响。例如

octave> system("$TERM&")

在新窗口中创建一个终端,该终端将被后续的<ctrl-c>.

我提出了一个基于 shell 的解决方法。这包括添加额外的“背景分叉”层,这将保护最终终端(或文本编辑器或其他)免受发送到八度音阶的信号的影响。简而言之,我启动了一个终端,该终端在后台启动了另一个终端,我从中杀死了第一个终端(这样它就不会打扰我们)。

创建一个可执行文件:

term-kill.sh
-----------------------------
#!/bin/sh
$TERM&
sleep 0.01
kill $1
-----------------------------

(请注意,sleep在后者被杀死之前,第二个终端没有时间与第一个终端分离的命令)。然后,命令

octave> system("$TERM -e term-kill.sh $$&")

创建一个不会被杀死的终端。

要打开文本编辑器,只需考虑可执行文件

term-edit-kill.sh
------------------------
#!/bin/sh
$TERM -e $EDITOR $1&
sleep 0.01
kill $2
------------------------

并通过改变八度edit命令

octave> EDITOR('$TERM -e term-edit-kill.sh %s $$')

注意:我假设您的系统知道如何查找term-kill.shand term-edit-kill.sh,并且变量$TERMand$EDITOR存在并且适合您的需要。终端仿真器必须支持该-e选项。

于 2017-08-07T12:17:27.230 回答