就上下文而言,我是emacs新手。我已经使用了很长时间,但是已经越来越多地使用了(我非常喜欢)。我对lisp也很满意,但是对elisp不太熟悉。
我需要做的是将正则表达式绑定到键盘组合,因为我经常使用此特定的正则表达式。
我一直在做什么:
1 2
| M-C-s ^.*Table\\(\\(.*\
\\)*?GO\\) |
注意,我在上面使用了换行符,但是我发现对于isearch-forward-regexp,您确实需要用C-q Q-j的结果替换正则表达式中的\
。这将插入文字换行符(不结束命令),使我可以将换行符放入表达式中并跨行进行匹配。
如何将其绑定到组合键?
我隐约地理解我需要创建一个elisp函数,该函数使用表达式执行isearch-forward-regexp,但是我对细节不了解。我搜索了google,发现大多数文档有点令人困惑。
如何在emacs中将正则表达式绑定到组合键?
到目前为止,迈克·斯通(Mike Stone)的答案是最好的-并不是我一直在寻找的东西,但是它可以满足我的需求
编辑-这种工作方式有效,但是在存储了宏之后,当我稍后再使用它时,我无法将其与C-x e一起使用。 (即,如果我重新引导emacs,然后键入M-x macro-name,然后再键入C-x e,我会在小型缓冲区中收到一条消息,例如\\'no last kbd macro \\'或类似的东西)
@Mike Stone-感谢您提供的信息。我试图创建一个像这样的宏:
1
| C-x( M-C-s ^.*Table\\(\\(.*C-q C-J\\)*?GO\\) C-x) |
这创建了我的宏,但是当我执行我的宏时,并没有获得我通常使用isearch-forward-regexp时获得的突出显示。相反,它只是跳到表达式的下一个匹配项的末尾。因此,这对于我需要的并不是真正的工作。有什么想法吗?
编辑:看起来我可以使用宏来做我想要的事情,我只需要在isearch-forward-regexp框外思考。我会尝试您的建议。
您可以使用宏,只需执行C-x(然后对宏执行所有操作,然后对C-x进行)akbd结束宏,然后C-x e将执行最后定义的宏。然后,您可以使用M-x name-last-kbd-macro为其命名,以便为它分配一个名称,然后可以使用M-x TESTIT调用它,然后使用M-x insert-kbd-macro存储定义。这会将宏放入当前缓冲区,然后可以将其存储在.emacs文件中。
示例:
将定义一个宏以键入" abc",然后按回车键。
立即执行上述宏3次(首先执行e,然后执行2 e将再次执行两次)。
1
| M-x name-last-kbd-macro testit |
将宏命名为" testit"
执行刚刚命名的宏(打印" abc",然后返回)。
在当前缓冲区中放置以下内容:
1 2
| (fset 'testit
[?a ?b ?c return]) |
然后可以将哪个保存在您的.emacs文件中,以在重新启动emacs之后一遍又一遍地使用命名的宏。
我已经开始从字面上解决您的问题,
1 2 3 4 5 6 7 8 9 10 11
| (defun search-maker (s)
`(lambda ()
(interactive)
(let ((regexp-search-ring (cons ,s regexp-search-ring)) ;add regexp to history
(isearch-mode-map (copy-keymap isearch-mode-map)))
(define-key isearch-mode-map (vector last-command-event) 'isearch-repeat-forward) ;make last key repeat
(isearch-forward-regexp)))) ;`
(global-set-key (kbd"C-. t") (search-maker"^.*Table\\\\(\\\\(.*\\\
\\\\)*?GO\\\\)"))
(global-set-key (kbd"<f6>") (search-maker"HELLO WORLD")) |
(kbd ...)中的键盘序列开始新的空白搜索。要实际搜索您的字符串,请根据需要再次按最后一个键。所以C-. t t t或<f6> <f6> <f6>。该解决方案基本上是一种技巧,但是如果您想尝试一下,我会把它留在这里。
以下可能是最接近您需要的内容,
1 2 3 4 5 6 7 8 9
| (defmacro define-isearch-yank (key string)
`(define-key isearch-mode-map ,key
(lambda ()
(interactive)
(isearch-yank-string ,string)))) ;`
(define-isearch-yank (kbd"C-. t")"^.*Table\\\\(\\\\(.*\\\
\\\\)*?GO\\\\)")
(define-isearch-yank (kbd"<f6>")"HELLO WORLD") |
按键组合现在仅在isearch模式下可用。您可以正常开始搜索,然后按组合键以插入预定义的字符串。
通常,要在Emacs中定义自定义键绑定,请编写
1
| (define-key global-map (kbd"C-c C-f") 'function-name) |
毫无疑问,
define-key是定义新密钥的功能。 global-map是全局键映射,而不是每种模式下的单独映射。 (kbd"C-c C-f")返回表示键序列C-c C-f的字符串。还有其他方法可以执行此操作,包括直接输入字符串,但这通常是最简单的方法,因为它采用了正常的书面表示形式。 'function-name是函数名称。
现在,除非已经定义了函数,否则您将需要在使用它之前对其进行定义。为此,请写
1 2 3 4
| (defun function-name (args)
(interactive)
stuff
...) |
defun定义了一个功能-使用C-h f defun获取更多特定信息。 (interactive)并没有真正的函数调用。它告诉编译器可以由用户使用M-x function-name并通过键绑定调用该函数。
现在,特别是对于交互式搜索,这很棘手; isearch模块似乎并没有针对您要执行的操作进行设置。但是您可以使用它来执行类似的操作。
@Justin:
执行宏时,这有点不同...增量搜索将只执行一次,如果要再次搜索,则必须再次执行宏。但是,您可以执行更强大和复杂的操作,例如搜索关键字,跳转到行的开头,标记,转到行的末尾,Mw(要复制),然后跳转到另一个缓冲区,然后是Cy(粘贴) ),然后跳回到另一个缓冲区并结束宏。然后,每次执行宏时,您都会将一行复制到下一个缓冲区。
有关emacs宏的真正酷的事情是,它会在看到铃声时停止运行……这是由于您无法匹配增量搜索(以及其他原因)而发生的。因此,在上面的宏中,您可以执行C-u 1000 C-x e,该宏将执行该宏1000次...但是由于您进行了搜索,因此它只会复制1000行,或者直到搜索失败!这意味着如果有100个匹配项,它将仅执行宏100次。
编辑:请查看C-hf Highlight-lines-matching-regexp,它将显示命令来突出显示与正则表达式匹配的所有内容。可以使用存储的宏突出显示所有与正则表达式匹配的内容,然后使用另一个宏查找下一个正则表达式...?
进一步编辑:M-x unhighlight-regexp将取消突出显示,尽管您必须输入最后一个正则表达式(但默认为您用来突出显示的正则表达式)