如何将正则表达式绑定到emacs中的组合键?
对于上下文,我是一个emacs新手。我没有使用它很长时间,但一直在使用它越来越多(我喜欢它很多)。此外,我对lisp很满意,但对elisp不太熟悉。如何将正则表达式绑定到emacs中的组合键?
我需要做的是将正则表达式绑定到键盘组合,因为我经常使用这个特定的正则表达式。
我一直在做什么:
M-C-s ^.*Table\(\(.*\n\)*?GO\)
请注意,我用新行上面,但是我发现,isearch-forward-regexp
,你真的需要的结果更换\n
在正则表达式Cq Qj。这插入了一个文字换行符(无需结束命令),使我可以将换行符放入表达式并跨行匹配。
我该如何将它绑定到一个组合键?
我隐约明白,我需要创建一个elisp函数执行isearch-forward-regexp
与表达式,但我对细节模糊。我搜索谷歌,发现大多数文件是有点混乱。
如何将正则表达式绑定到emacs中的组合键?
斯通过的最好的答案迄今 - 不正是我一直在寻找,但它为我需要什么
编辑 - 这种类型的工作,但储存后这个宏,当我以后回去使用它时,我不能在Cx e中使用它。 (即,如果我重新启动Emacs和然后键入的Mx宏名称,然后CXè,我像“没有最后骨节病宏”或类似的小缓冲区得到一个消息)
@迈克斯通 - 感谢您的信息。我试图创建宏象这样:
C-x(M-C-s ^.*Table\(\(.*C-q C-J\)*?GO\) C-x)
这造成我的宏,但是当我执行我的宏我没有得到相同的高亮当我使用isearch-forward-regexp
,我正常地获得。相反,它只是跳到下一个表达式匹配的结尾。所以这不适合我需要的东西。有任何想法吗?
编辑:它看起来像我可以使用宏来做我想做的,我只需要在isearch-forward-regexp
的框外进行思考。我会尝试你的建议。
您可以使用宏,只是做C-X(然后对宏做的一切,然后C-X)结束宏,然后C-Xè将执行最后定义的宏。然后,您可以使用的Mx名字,最后大骨节病宏它可以让你指定一个名字给它,然后你就可以用的Mx的TestIt调用,然后将其存储使用的Mx插入 - 大骨节病宏定义命名这会将宏放入当前缓冲区,然后您可以将其存储在您的.emacs
文件中。
实施例:
C-x(abc *return* C-x)
将定义一个宏输入 “ABC”,然后按返回。
C-xeee
立即执行上述宏3次(首先执行它,然后跟随2个e将执行两次以上)。
M-x name-last-kbd-macro testit
名称宏 “调用testIt”
M-x testit
执行刚刚命名的宏(打印的 “ABC”,然后返回)。
M-x insert-kbd-macro
提出在当前缓冲区执行以下操作:
(fset 'testit
[?a ?b ?c return])
然后将其保存在您的.emacs
文件重新启动的emacs后使用命名宏一遍又一遍。
@Justin:
当执行一个宏,这是一个有点不同的...增量搜索将只发生一次,你将不得不再次执行宏如果您想再次搜索。你可以做更强大和更复杂的事情,例如搜索关键字,跳到行首,标记,到行尾,Mw(复制),然后跳转到另一个缓冲区,然后Cy(粘贴),然后跳回到另一个缓冲区并结束你的宏。然后,每次执行宏时,都会将一行复制到下一个缓冲区。
关于emacs宏,真的很酷的事情是它会在它看到铃声时停止......当你无法匹配增量搜索(等等)时会发生这种情况。所以上面的宏,你可以做C-u 1000 C-x e,它将执行宏1000次......但是由于你做了搜索,它只会复制1000行,或者直到搜索失败!这意味着如果有100个匹配,它只会执行100次宏。
编辑:检查C-HF高亮线匹配正则表达式,这将显示一个命令的帮助,突出显示所有符合正则表达式...我不知道如何撤消突出显示虽然...反正您可以使用存储的宏来突出显示所有匹配的正则表达式,然后使用另一个宏查找下一个宏...?
进一步编辑:用MX unhighlight,正则表达式将撤消突出,你必须虽然进入最后的正则表达式(但它默认为您用来突出的正则表达式)
一般来说,定义在Emacs的自定义键绑定,你会写
(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
是一个符号,它是该函数的名称。现在
,除非你的函数已经定义,你会希望你使用此之前定义它。要做到这一点,写
(defun function-name (args)
(interactive)
stuff
...)
defun
定义一个函数 - 使用C-h f defun
更具体的信息。 (interactive)
没有真正的函数调用;它告诉编译器,用户可以使用M-x function-name
并通过键绑定来调用函数。
现在,尤其是互动搜索,这是非常复杂的, isearch
模块似乎并没有设置好你想要做的事情。但是你可以用它来做类似的事情。
我已经开始与字面解决您的问题,
(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\\(\\(.*\\n\\)*?GO\\)"))
(global-set-key (kbd "<f6>") (search-maker "HELLO WORLD"))
从(kbd ...)
键盘序列开始一个新的空白搜索。要真正寻找你的字符串,你按最后一个关键再多次,因为你需要。所以C-. t t t
或<f6> <f6> <f6>
。解决方案基本上是一种破解,但如果你想试验它,我会把它留在这里。
以下可能是最接近你需要什么,
(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\\(\\(.*\\n\\)*?GO\\)")
(define-isearch-yank (kbd "<f6>") "HELLO WORLD")
的关键连击现在只能在ISEARCH模式下工作。正常开始搜索,然后按组合键插入预定义的字符串。