如何在Objective-C中清除控制台

8
我正在用Objective-C制作基于控制台的应用,该应用需要定期地清空控制台。这该如何实现?我在SO和Google上看到的所有方法都是让开发者用X-Code清除控制台,但这种方式不适用于我。

在Yahoo! Answers上,我找到了一个解决方案,告诉我按照以下步骤执行,但由于找不到文件而无法运行:

NSTask *task;
task = [[NSTask alloc]init];
[task setLaunchPath: @"/bin/bash"];

NSArray *arguments;
arguments = [NSArray arrayWithObjects: @"clear", nil];
[task setArguments: arguments];

[task launch];
[task waitUntilExit];
4个回答

6

尝试使用:

system( "clear" );

重要的头部信息:

#include <stdlib.h>

提示:Objective-C 仍然是 C,对吧?


更新:


如果出现"TERM environment variable not set."错误:

1)直接从终端运行程序(或者在 Xcode 中测试时忽略该错误;毕竟它本来就应该在正常终端中运行,不是吗?)

2)在您的 Scheme 设置中设置 TERM 变量。要设置为什么?只需在终端中运行以下命令即可查看 "TERM" 应该是什么:


DrKameleons-MacBook-Pro:Documents drkameleon$ echo $TERM
xterm-256color

enter image description here


Objective-C 仍然是 C,但我更喜欢“本地感觉”的解决方案 :) - houbysoft
1
@houbysoft 我也是;绝对的。但老实说,对于像system("clear")这样简单的事情来说,使用NSTask是否有点过头了?Cocoa的方式有时可能会显得冗长而不必要... :-) - Dr.Kameleon
这只是打印“未设置TERM环境变量。”并继续执行程序。 - Ky -
@Supuhstar 你看到的错误信息说 TERM 环境变量未设置,可能是因为你试图从 Xcode 中启动程序。-- http://stackoverflow.com/questions/8470184/what-does-term-environment-variable-not-set-mean - Dr.Kameleon
2
在“可执行文件”组中,选择您的程序的可执行文件并获取信息。在那里,有一个地方可以设置从Xcode运行时的环境变量。 - Ken Thomases
显示剩余4条评论

4

使用ncurses而不生成子进程的方法是:

#include <curses.h>
#include <term.h>
#include <unistd.h>

int main(void)
{
    setupterm(NULL, STDOUT_FILENO, NULL);
    tputs(clear_screen, lines ? lines : 1, putchar);
}

使用-lncurses编译。

setupterm()调用只需要执行一次。之后,使用tputs()调用来清除屏幕。


看起来很有前途,但我无法弄清楚如何添加命令行选项以使用XCode进行编译。 - Ky -
在构建设置的目标中,向其他链接器标志(OTHER_LDFLAGS)中添加“-lncurses”。 - Ken Thomases
`TERM environment variable not set.Debugger stopped. Program exited with status value:1` - Ky -
@Supuhstar:在应用程序运行的Scheme的参数选项卡的环境部分中设置一个环境变量“TERM”。Apple终端应用程序使用“xterm-256color”作为其值。 - JeremyP

3

为什么选择 /bin/bash

只需执行:

NSTask *task = [NSTask launchedTaskWithLaunchPath:@"/usr/bin/clear" arguments:[NSArray array]];

另外,还可以使用C语言的方法:

#include <stdlib.h>

...
system("/usr/bin/clear");
...

第一个什么也不做,第二个只是打印“未设置TERM环境变量”,然后继续执行程序。 - Ky -

1

你可以使用Apple Script

tell application "Console"
    activate
    tell application "System Events"
        keystroke "k" using command down
    end tell
end tell  

使用NSAppleScript类从Obj-C程序执行AppleScript。
NSAppleScript *lClearDisplay = [[NSAppleScript alloc] initWithSource:@"tell application \"Console\"\n \
                                activate\n \
                                tell application \"System Events\"\n \
                                keystroke \"k\" using command down\n \
                                end tell\n \
                                    end tell "];
NSDictionary *errorInfo;
[lClearDisplay executeAndReturnError:&errorInfo];

注意:
如果苹果更改或删除⌘k作为清除显示的键命令,那么脚本将会出现问题。


我如何在 Obj-C 程序中使用这个? - Ky -
编译错误:'errorInfo'未声明(在此函数中首次使用) - Ky -
不会在控制台上输出任何内容。抱歉 :/ - Ky -
这个 AppleScript 是为控制台应用程序而不是 Xcode 控制台而设计的,对我来说运行良好。打开 AppleScript 编辑器并运行即可。 - Parag Bafna
1
Command-K 删除 滚动缓冲区。clear 清除它,但保留滚动缓冲区。 - Ken Thomases

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接