搜公众号
推荐 原创 视频 Java开发 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库
Lambda在线 > ExASIC > Emacs如何在当前verilog文件中根据选中的文本快速查找并高亮显示

Emacs如何在当前verilog文件中根据选中的文本快速查找并高亮显示

ExASIC 2019-01-31
举报

我们在写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如何在当前verilog文件中根据选中的文本快速查找并高亮显示》的版权归原作者「ExASIC」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

举报