首页 > 解决方案 > 使用C语言在vi/vim中打开文件

问题描述

你好!我是 C 语言的新手,很抱歉。我的程序必须创建一个新的文本编辑器实例(例如 vi) - 并在其中打开一个文件,用户将给出其名称作为调用程序的参数。如果用户没有提供要打开的文件名,则应该打开一个“空”笔记本。

我已经用 C 语言打开了 vi 编辑器。我只需要知道是否可以使用 C 语言在 vi 或 vim 中打开文件?

有我的代码

#include <stdio.h>
#include <unistd.h>

int main (int argc, char *argv[]) {

    FILE *fp;
    int childpid;
    int count1 = 0, count2 = 0;

    fp = fopen(argv[1], "a");

    if(fp == NULL) {
        char *exe_name = "vi", *message = "Empty notebook is running.";
        char *exe_args[] = { exe_name, message, argv[0], NULL };
        execv("/usr/bin/vi", exe_args);
    }

    printf("Before it forks");

    sleep(5);

    childpid = fork();

    if(childpid == 0) {
        printf("This is a child process\n");
        while(count1 < 10) {
            printf("Child Process: %d\n", count1);
            sleep(1);
            count1++;
        } 
    } else {
        printf("This is the parent process\n");
        while(count2 < 20) {
            printf("Parent Process: %d\n", count2);
            sleep(1);
            count2++;
        } 
    }
    fclose(fp);
    return 0;
}

十分感谢!

标签: clinuxvim

解决方案


是的,你绝对可以!但是,我首先要检查一下您是如何打开“空”笔记本的。您exec_args[]包含以下内容:

["vi", "Empty notebook is running.", argv[0], "\0"]

argv[0]是您的 C 可执行文件的名称,因此假设它是a.out. 因此,当execv()被调用时,您实际上是在运行以下命令:

/usr/bin/vi Empty\ notebook\ is\ running a.out 

您正在打开两个文件进行编辑,一个名为“Empty notebook is running”的文件。(注意斜杠以转义上面命令中的空格),以及您制作的 C 可执行文件。我不认为你打算打开这两个,因为你通常不应该弄乱实际的可执行文件。此外,一旦您对“空笔记本正在运行”进行更改。文件,下次运行程序时,您将看到这些更改!

所以,我建议你根本不要传递文件名。这样,vi就好像用户自己从未传入文件名一样打开。

要打开现有文件(仅此而已),您只需else在文件描述符检查中添加和子句即可。因此,代码可能类似于:

if(fp == NULL)
{
    char *exec_args[] = {"vi", NULL};
    execv("/usr/bin/vi", exec_args);
}
else
{
    char *exec_args[] = {"vi", argv[1], NULL};
    execv("/usr/bin/vi", exec_args);
}



推荐阅读