怎样在emacs中进行多文件字符串查找/替换
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样在emacs中进行多文件字符串查找/替换相关的知识,希望对你有一定的参考价值。
你好,你的代码已经改好了,问题不大,都是一些细节。已经编译运行确认:)
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
int Count=0;
int findNum(char *str)
int i=0,t1=0;
FILE *p;
char ch;
if((p=fopen("image.gl","rb"))==NULL)
printf("\\n打开文件失败\\n");
exit(4);
while((ch=fgetc(p))!=EOF)
if(ch==str[t1])
t1++;
else
t1=0;
if(t1>=strlen(str))
printf("找到字符串%s位置为%d\\n",str,i-strlen(str)+1);
Count = i-strlen(str)+1;
i=1;
break;
i++;
fclose(p);
if(!i) return 0;
return i;
int main(void)
FILE *in,*out;
char *str1="1234567";
char *str2="abcdef";
int i=0,j=0,t1=0,t2=0;
char ch;
if((t1=findNum(str1))==0)
printf("没有找到字符串%s\\n请按任意键退出\\n",str1);
return -1;
if((t2=findNum(str2))==0)
printf("没有找到字符串%s\\n请按任意键退出\\n",str2);
return -2;
if((in=fopen("image.gl","rb"))==NULL)
printf("\\n打开文件失败\\n");
exit(2);
if((out=fopen("image_new.gl","wb"))==NULL)
printf("\\n创建新文件失败\\n");
exit(3);
i=0;
/* start copy */
while((ch=getc(in))!=EOF)
if(t1||t2)
if(Count<=80)
if(i<=Count) fputc(\'0\',out);
else fputc(ch,out);
else
if((i>=(Count-80))&&(i<=Count)) fputc(\'0\',out);
else fputc(ch,out);
i++;
fclose(in);
fclose(out);
printf("替换完成!\\n任意键关闭!\\n");
getch();
如果觉得还行,请加分哦:) 参考技术A
M-x find-name-dired RET
Select root of my project
Enter *.rb as the filenames to match
Press "t" to select all files found
Press "Q" (shift Q) to start the search/replace
Enter "transaction" as the query, then enter "invoice" as the replacement.
Emacs如何在当前verilog文件中根据选中的文本快速查找并高亮显示
我们在写verilog代码时常常有这样的需求:看看当前的信号或变量在哪里出现过。如果用emacs自带的incremental search(就是不停的按C-s)可以实现。但有两个问题。一是复制需要搜索的关键字到mini-buffer,或者手动输入一长串字符串,比较麻烦。二是不停的按C-s手指头会疼。所以我在想有没有更好的办法来解决。
分析需求
我的思路如下:
1. 获取当前选中的文本,即需要搜索和高亮的关键字
2. 把关键字和正在编辑的文件名传递给外部命令grep
3. 抓取grep的结果,并显示在新的window中
4. 并高亮grep结果中的关键字
实现过程
上面的过程看起来很复杂,所以我们写了一个elisp函数来实现。
1(defun grep-current-buffer ()
2 "grep string in current buffer"
3 (interactive)
4 (progn
5 ;;grep
6 (setq filename (buffer-file-name))
7 (setq selected-text (buffer-substring-no-properties (region-beginning) (region-end)))
8 (setq grep-result (shell-command-to-string (concat "grep -w -B 1 -A 1 -n " selected-text " " filename)))
9 ;;print to *grep*
10 (switch-to-buffer-other-window (get-buffer-create "*grep*"))
11 (insert (concat filename "\n\n"))
12 (insert grep-result)
13 ;;highlight
14 (setq face 'hi-yellow)
15 (hi-lock-face-buffer selected-text face)
16 )
17)
第6行:用buffer-file-name取得当前正在编辑的文件名
第7行:用buffer-substring-no-properties取得当前选中的文本,其中region-beginning和region-end是选中文件的开头和结尾。
第8行:用shell-command-to-string来调用外部命令,并取得外部的结果。
传递给外部grep的参数如下,
grep -w -B 1 -A 1 -n selected-text filename
-w //匹配完整字符串
-B 1 //前面额外显示一行
-A 1 //后面额外显示一行
-n //显示行号
selected-text //要搜过的字符串
filename //指定在当前文件中搜索
第10行:在新window中打开临时的buffer,取名为*grep*
第11行:往*grep*中写入文件名
第12行:往*grep*中写入grep的结果
第14-15行:在*grep*中高亮显示选中的字符串
绑定快捷键
把上面的elisp函数写到~/.emacs中,并绑定快捷键win+g,如下
(global-set-key (kbd "s-g") 'grep-current-buffer)
最终效果
欢迎关注ExASIC
分享数字集成电路设计中的经验和方法
分享让工作更轻松
以上是关于怎样在emacs中进行多文件字符串查找/替换的主要内容,如果未能解决你的问题,请参考以下文章