简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:为Emacs改造目前最快的搜索文本的工具:ripgrep。
需求:只搜索 /home路径下的.java和.cpp文件中的"native_tagSocketFd"字符串.
2.基本搜索
<1>.rg命令实现
# rg -g '*.{java,cpp}' native_tagSocketFd /home
<2>.rg搜索"."开头的隐藏文件
# rg -g '*.{java,cpp,c,h,aidl,hal,rc,bp,mk,cc,xml}' --color=always --no-heading --line-number --with-filename --ignore-case --no-ignore --hidden "native_tagSocketFd"
Or
# rg -g '*.{java,cpp}' --hidden "native_tagSocketFd"
<3>.rg搜索忽略搜索cts、out、prebuilts目录
# rg -g '*.{java,cpp,c,h,aidl,hal,rc,bp,mk,cc,xml}' --color=always --no-heading --line-number --with-filename --ignore-case --no-ignore --hidden "MediaCodecList" -g '!out' -g '!cts' -g '!prebuilts'
<3>.可以将/usr/bin/rg放在shell命令中执行,加上参数
# /usr/bin/rg $1 --color=always --no-heading --line-number --with-filename --ignore-case --no-ignore --hidden
注意:将$1放在尾部会报错!文章来源:https://www.toymoban.com/news/detail-616877.html
3.emacs改造ripgrep
<1>.elisp调用rg(即ripgrep)命令实现
(defun rg-grep ()
(interactive)
;;读取字符串
(setq arg (read-string ": "))
;;调用rg命令搜索
(shell-command (concat "rg -g '*.{java,cpp}' " arg " /home"))
)
<2>.改造ripgrep.el
v1.0 输入搜索字段
(defun ripgrep-regexp (regexp &optional args)
(interactive
(list (read-from-minibuffer "Ripgrep search for: " (thing-at-point 'symbol))))
(compilation-start
(mapconcat 'identity
(append
;;可以过滤搜索的文件格式.
'("rg" "-g '*.{java,cpp,c,h,aidl,hal,rc,bp,mk,cc}' --color=always" "--no-heading" "--line-number" "--with-filename" "--ignore-case" "--no-ignore")
;;搜索的字段,可以是正则表达式
(list (shell-quote-argument regexp))
;;搜索的默认路径
'("/home")
) " ")
'ripgrep-search-mode)
)
v2.0 输入搜索字段 + 目录
(defun ripgrep-regexp (regexp directory &optional args)
(interactive
(list (read-from-minibuffer "Ripgrep search for: " (thing-at-point 'symbol))
(read-directory-name "Directory: ")
))
(setq default-directory directory)
(compilation-start
(mapconcat 'identity
(append
;;可以过滤搜索的文件格式.
'("rg" "-g '*.{java,cpp,c,h,aidl,hal,rc,bp,mk,cc}' --color=always" "--no-heading" "--line-number" "--with-filename" "--ignore-case" "--no-ignore")
;;搜索的字段,可以是正则表达式
(list (shell-quote-argument regexp))
;;搜索的默认路径
;;'("/home")
'(".")
) " ")
'ripgrep-search-mode)
)
v3.0
;;v5.0 输入搜索字段,默认cd到/home目录,解决输入 '("/home") 时,显示全路径,导致过长的问题。
(defun ripgrep-regexp (regexp &optional args)
(interactive
(list (read-from-minibuffer "Ripgrep search for: " (thing-at-point 'symbol))
))
;;其实就是cd到指定的目录后,在当前目录开始搜索.
(setq default-directory "/home")
(compilation-start
(mapconcat 'identity
(append
;;可以过滤搜索的文件格式.
'("rg" "-g '*.{java,cpp,c,h,aidl,hal,rc,bp,mk,cc}' --color=always" "--no-heading" "--line-number" "--with-filename" "--ignore-case" "--no-ignore")
;;搜索的字段,可以是正则表达式
(list (shell-quote-argument regexp))
;;搜索的默认路径
;;'("/home")
'(".")
) " ")
'ripgrep-search-mode)
;;恢复当前路径
(setq default-directory (file-name-directory (buffer-file-name)))
)
注意:要强制 rg 搜索所有文件,可以使用 --no-ignore 选项,意思是:不要忽略当前目录下的文件,可以递归查找。文章来源地址https://www.toymoban.com/news/detail-616877.html
到了这里,关于Emacs之改造最快文本搜索工具ripgrep(一百一十九)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!