【问题标题】:How do I clear the console in Objective-C如何在 Objective-C 中清除控制台
【发布时间】:2012-04-22 09:09:55
【问题描述】:

我正在使用 Objective-C 制作一个基于控制台的应用程序,它依赖于能够定期清除控制台。如何才能做到这一点?我在 SO 和 Google 上看到的只是让开发人员使用 X-Code 清除控制台的方法,但这不会这样做。

我在 Yahoo! 上找到的一个解决方案答案告诉我执行以下操作,但由于找不到文件而无法运行:

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

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

[task launch];
[task waitUntilExit];

【问题讨论】:

    标签: objective-c macos cocoa console console-application


    【解决方案1】:

    你可以使用苹果脚本

    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];
    

    注意:
    如果 Apple 更改或删除 ⌘k 作为清晰显示的关键命令,这将破坏脚本。

    【讨论】:

    • 如何在 Obj-C 程序中使用它?
    • 编译错误:'errorInfo' undeclared (first use in this function)
    • 对控制台没有任何作用。对不起:/
    • 这个applescript适用于控制台应用程序而不是xcode控制台,它对我来说工作正常。打开applescript编辑器并运行。
    • Command-K 删除回滚缓冲区。 clear 清除它,但保持回滚缓冲区完好无损。
    【解决方案2】:

    尝试使用:

    system( "clear" );
    

    重要标题:

    #include <stdlib.h>
    

    提示:Objective-C 还是 C,对吧?


    更新:


    如果出现“未设置TERM环境变量。”错误:

    1) 直接从终端运行程序(或者在 Xcode 中测试时忽略错误;无论如何它应该在普通终端中运行,对吧?)

    2) 在 Scheme 的设置中设置 TERM 变量。 到什么?只需在终端中运行它,看看“TERM”应该是什么:

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

    【讨论】:

    • Objective-C 仍然是 C,但我更喜欢“本地感觉”的解决方案 :)
    • @houbysoft 我也是;确实。但老实说,对于像system("clear") 这样简单的事情,使用NSTask 是不是太多了? Cocoa 方式有时可能过于冗长...... :-)
    • 所有这些都是打印“未设置TERM环境变量”。并继续该计划
    • @Supuhstar “您看到的错误消息表明未设置 TERM 环境变量,可能是因为您尝试从 Xcode 中启动程序。” -- stackoverflow.com/questions/8470184/…
    • 在“可执行文件”组中,为您的程序选择可执行文件并获取信息。在那里,有一个地方可以在从 Xcode 运行时设置环境变量。
    【解决方案3】:

    在不产生子进程的情况下执行此操作的方法是使用 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 进行编译
    • 将“-lncurses”添加到目标的其他链接器标志 (OTHER_LDFLAGS) 构建设置中。
    • TERM environment variable not set. Debugger stopped. Program exited with status value:1
    • @Supuhstar:在运行应用程序的方案中参数选项卡的环境部分设置环境变量TERM。苹果终端应用使用xterm-256color作为其值
    【解决方案4】:

    为什么是/bin/bash

    只要做:

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

    或者,使用 C 方式:

    #include <stdlib.h>
    
    ...
    system("/usr/bin/clear");
    ...
    

    【讨论】:

    • 第一个什么都不做,第二个只是打印“未设置TERM环境变量”。并继续该计划。
    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 2011-02-28
    相关资源
    最近更新 更多