在 emacs 中转换字符串和 grep 的 lisp?
The lisp that convert string and grep in emacs?
我有一个格式为
的文件
abc|<hoge>
a|<foo> b|<foo> c|<foo>
family|<bar> guy|<bar>
a|<foo> comedy|<bar> show|<foo>
action|<hoge>
并希望在 emacs 上按原始搜索字符串(例如“喜剧节目”而不是 a|<foo> comedy|<bar> show|<foo>
)。
我相信在 lisp 上使用 grep 是最简单的答案,但我还没有弄清楚如何做。有大佬解惑一下吗?
好吧,grep
是一个单独的程序(您也可以使用)。在 Emacs 中,您将使用函数 search-forward-regexp
,您可以使用 M-x
(按住 Meta
,通常是 Alt
键,然后按 运行 18=]) 然后键入 search-forward-regexp
并按 Return
.
然后您需要输入正则表达式进行搜索。简而言之,您似乎想忽略 |<
某些东西 >
,在 Emacs 的各种正则表达式中是:
|<[a-z]+>
因此您可以搜索例如
a|<[a-z]+> comedy|<[a-z]+> show|<[a-z]+>
您可以创建一个 Lisp 函数以这种方式转换字符串,方法是在空格处拆分字符串并添加正则表达式序列:
(defun find-string-in-funny-file (s) ; Define a function
"Find a string in the file with the |<foo> things in it." ; Document its purpose
(interactive "sString to find: ") ; Accept input if invoked interactively with M-x
(push-mark) ; Save the current location, so `pop-global-mark' can return here
; (usually C-u C-SPC)
(goto-char 0) ; Start at the top of the file
(let ((re (apply #'concat ; join into one string…
(cl-loop
for word in (split-string s " ") ; for each word in `s'
collect (regexp-quote word) ; collect that word, plus
collect "|<[a-z]+> ")))) ; also the regex bits to skip
(search-forward-regexp ; search for the next occurrence
(substring re 0 (- (length re) 2))))) ; after removing the final space from `re'
您可以在(在线)Emacs Lisp 手册中探索这些函数的作用;例如,从菜单 "Help→Describe→Function" 中选择或按 C-h f
(Control+h
,然后按 f
)并键入 interactive
(RET) 以获取该手册的文档特殊形式。
如果将上面的(defun)
粘贴到*scratch*
缓冲区,并将光标定位在末尾最后的)
之后,就可以按C-j
求值它,并且该功能将一直存在,直到您关闭 Emacs。
如果您将其保存在名为 something .el
的文件中,您可以在以后使用 M-x
load-file
再次加载它。
如果您随后加载 "funny" 文件并键入 M-x
find-string-in-funny-file
,它将在您的文件中搜索您的字符串,并将光标留在该字符串上。如果找不到,您会看到一条消息。
BUGS:功能不及壮观的风格
我有一个格式为
的文件abc|<hoge>
a|<foo> b|<foo> c|<foo>
family|<bar> guy|<bar>
a|<foo> comedy|<bar> show|<foo>
action|<hoge>
并希望在 emacs 上按原始搜索字符串(例如“喜剧节目”而不是 a|<foo> comedy|<bar> show|<foo>
)。
我相信在 lisp 上使用 grep 是最简单的答案,但我还没有弄清楚如何做。有大佬解惑一下吗?
好吧,grep
是一个单独的程序(您也可以使用)。在 Emacs 中,您将使用函数 search-forward-regexp
,您可以使用 M-x
(按住 Meta
,通常是 Alt
键,然后按 运行 18=]) 然后键入 search-forward-regexp
并按 Return
.
然后您需要输入正则表达式进行搜索。简而言之,您似乎想忽略 |<
某些东西 >
,在 Emacs 的各种正则表达式中是:
|<[a-z]+>
因此您可以搜索例如
a|<[a-z]+> comedy|<[a-z]+> show|<[a-z]+>
您可以创建一个 Lisp 函数以这种方式转换字符串,方法是在空格处拆分字符串并添加正则表达式序列:
(defun find-string-in-funny-file (s) ; Define a function
"Find a string in the file with the |<foo> things in it." ; Document its purpose
(interactive "sString to find: ") ; Accept input if invoked interactively with M-x
(push-mark) ; Save the current location, so `pop-global-mark' can return here
; (usually C-u C-SPC)
(goto-char 0) ; Start at the top of the file
(let ((re (apply #'concat ; join into one string…
(cl-loop
for word in (split-string s " ") ; for each word in `s'
collect (regexp-quote word) ; collect that word, plus
collect "|<[a-z]+> ")))) ; also the regex bits to skip
(search-forward-regexp ; search for the next occurrence
(substring re 0 (- (length re) 2))))) ; after removing the final space from `re'
您可以在(在线)Emacs Lisp 手册中探索这些函数的作用;例如,从菜单 "Help→Describe→Function" 中选择或按 C-h f
(Control+h
,然后按 f
)并键入 interactive
(RET) 以获取该手册的文档特殊形式。
如果将上面的(defun)
粘贴到*scratch*
缓冲区,并将光标定位在末尾最后的)
之后,就可以按C-j
求值它,并且该功能将一直存在,直到您关闭 Emacs。
如果您将其保存在名为 something .el
的文件中,您可以在以后使用 M-x
load-file
再次加载它。
如果您随后加载 "funny" 文件并键入 M-x
find-string-in-funny-file
,它将在您的文件中搜索您的字符串,并将光标留在该字符串上。如果找不到,您会看到一条消息。
BUGS:功能不及壮观的风格