在 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:功能不及壮观的风格