将C++注释(//)替换为C注释(/* */)的emacs指令

4

有没有一种简便的方法可以在emacs中将C++注释(//)替换为C注释(/* */)?

是否有人编写了一个elisp函数来完成这项任务?

或者可以应用某种聪明的正则表达式吗?

2个回答

5

使用query-replace-regex或类似的函数,使用以下搜索字符串:^\(.*?\)//\(.*\)$,并使用以下替换字符串:\1/* \2 */


如果行中的第一个 // 在字符串内部怎么办? - Tom
是的,这可能是一个问题,但这将需要使用完全功能的C/C++解析器。这就是为什么我写了关于query-replace-regex的原因;-) - Alex Ott
如果这是个真正的问题,你可以将其包装在一些elisp中,并使用syntax-ppss来查看你是否在一个字符串里面。只是说一下 :) - scottfrazer
我认为,正确的方法是获取语义结果并通过程序的解析树进行处理;-) - Alex Ott
你不需要完全解析就能识别字符串,这就是该问题所需的所有语法信息。 - Tom

2
这个C程序将文件sample.txt中所有连续出现的'//'注释转换为'/* ...*/',并将结果保存到output.txt中。
#include <stdio.h>
#include<string.h>
void trimLeading(char * string);
int main(int argc, char* argv[])
{

FILE* file = fopen("sample.txt", "r");
FILE* fp = fopen("output.txt", "w"); //to create file if it does not exist and to empty file if it exists.
fclose(fp);
if(file==NULL) {
perror("Error opening file sample.txt.");
}
if(fp==NULL) {
perror("Error opening file output.txt.");
}
/* should check the result */
long pos;
char line[256];
char buff[256];
int flag=0;     //flag=1,when multi-line comment occurs in input file.
int line_length=0;

while (fgets(line, sizeof(line), file)) {

      trimLeading(line);
      while((strlen(line)==0)){
                    fgets(line,sizeof(line),file);
                    trimLeading(line);

                }
        //line_length=strlen(line);
        //printf("%d",line_length);
    strcpy(buff,line);

    if(strstr(buff,"//")){ 
        trimLeading(buff);
        //printf("\nbuff=%s,line=%s,flag=%d\n",buff,line,flag);
        if((buff[0]=='/')&&(buff[1]=='/')) {

            /*******************/
            if(flag==0){
                /*look at next line*/
                pos = ftell(file);
                fgets(line,sizeof(line),file);
                trimLeading(line);
                //line_length=strlen(line);
                //printf("%d",line_length);
                while((strlen(line)==0)){
                    fgets(line,sizeof(line),file);
                    trimLeading(line);

                }
                fseek( file,pos, SEEK_SET );
                //printf("line==%s,flag=%d",line,flag);
                if((line[0]=='/')&&(line[1]=='/') ){
                    flag=1;
                    buff[0]='/';
                    buff[1]='*';
                    /*write output to file output.txt*/
                    fp = fopen("output.txt", "a");
                    fseek( fp,0, SEEK_END);
                    fprintf(fp, "%s",buff);
                    fclose(fp);
                    /************/
                    printf("%s", buff); 
                } else{
                    /*write output to file output.txt*/
                    fp = fopen("output.txt", "a");
                    fseek( fp,0, SEEK_END);
                    fprintf(fp, "%s",buff);
                    fclose(fp);
                    /************/
                    printf("%s",buff);
                }
            }else if(flag==1){
                    buff[0]='*';
                    buff[1]='*';
                /*look at next line*/
                    pos = ftell(file);
                    fgets(line,sizeof(line),file);
                    trimLeading(line);
                    //line_length=strlen(line);
                    //printf("%d",line_length);
                    while((strlen(line)==0)){
                        fgets(line,sizeof(line),file);
                        trimLeading(line);

                    }
                    fseek( file,pos, SEEK_SET );
                    //printf("line==%s,flag=%d",line,flag);
                    //printf("line[0]=%c,line[1]=%c",line[0],line[1]);
                    if(!((line[0]=='/')&&(line[1]=='/') )){
                        strcat(buff,"*/ \n");
                        flag=0;
                        //printf("\nFLAG1==%d\n",flag);
                    }
                /*write output to file output.txt*/
                    fp = fopen("output.txt", "a");
                    fseek( fp,0, SEEK_END);
                    fprintf(fp, "%s",buff);
                    fclose(fp);
                    /************/
                    printf("%s", buff); 
                }


        } else{
            /*write output to file output.txt*/
                    fp = fopen("output.txt", "a");
                    fseek( fp,0, SEEK_END);
                    fprintf(fp, "%s",buff);
                    fclose(fp); 
                    /************/
            printf("%s",buff);
            flag=0;
            //printf("\nFLAG2==%d\n",flag);
        }

    } else {
            pos = ftell(file);
            trimLeading(line);
            line_length=strlen(line);
            //printf("%d",line_length);
            while((strlen(line)==0)){
                fgets(line,sizeof(line),file);
                    trimLeading(line);

            }
            fseek( file,pos, SEEK_SET );
        //printf("line==%s,flag=%d",line,flag);
        /*write output to file output.txt*/
                    fp = fopen("output.txt", "a");
                    fseek( fp,0, SEEK_END);                     
                    fprintf(fp, "%s",buff);
                    fclose(fp);
                    /************/
        printf("%s",buff);  
        flag=0;
        //printf("\nFLAG3==%d\n",flag);
    }
}



fclose(file);

return 0;
}
void trimLeading(char * string)
{
int lastSpaceIndex, i, j;

lastSpaceIndex = 0;

/* Finds the last index of whitespace character */
while(string[lastSpaceIndex] == ' ' || string[lastSpaceIndex] == '\t' || string[lastSpaceIndex] == '\n')
{
    lastSpaceIndex++;
}


/* Shifts all trailing characters to its left */
i = 0;
while(string[i + lastSpaceIndex] != '\0')
{
    string[i] = string[i + lastSpaceIndex];
    i++;
}
string[i] = '\0'; //Make sure that string is NULL terminated
}

Sample.txt:

#include<stdio.h>
int main()
{

  int a=10,b=20,c=0;
  //samplea
  //sampleb
  //samplec

          ///////sampled


c=a+b;
//samplee 
 return 0;
}

我很感激你在这里的努力,但标签/标题表明emacs - 看看emacs解决方案是多么简单! - bph

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