2008-08-13 21 views
6

对于上下文,我是一个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的框外进行思考。我会尝试你的建议。

回答

5

您可以使用宏,只是做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后使用命名宏一遍又一遍。

1

@Justin:

当执行一个宏,这是一个有点不同的...增量搜索将只发生一次,你将不得不再次执行宏如果您想再次搜索。你可以做更强大和更复杂的事情,例如搜索关键字,跳到行首,标记,到行尾,Mw(复制),然后跳转到另一个缓冲区,然后Cy(粘贴),然后跳回到另一个缓冲区并结束你的宏。然后,每次执行宏时,都会将一行复制到下一个缓冲区。

关于emacs宏,真的很酷的事情是它会在它看到铃声时停止......当你无法匹配增量搜索(等等)时会发生这种情况。所以上面的宏,你可以做C-u 1000 C-x e,它将执行宏1000次......但是由于你做了搜索,它只会复制1000行,或者直到搜索失败!这意味着如果有100个匹配,它只会执行100次宏。

编辑:检查C-HF高亮线匹配正则表达式,这将显示一个命令的帮助,突出显示所有符合正则表达式...我不知道如何撤消突出显示虽然...反正您可以使用存储的宏来突出显示所有匹配的正则表达式,然后使用另一个宏查找下一个宏...?

进一步编辑:用MX unhighlight,正则表达式将撤消突出,你必须虽然进入最后的正则表达式(但它默认为您用来突出的正则表达式)

1

一般来说,定义在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模块似乎并没有设置好你想要做的事情。但是你可以用它来做类似的事情。

2

我已经开始与字面解决您的问题,

(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模式下工作。正常开始搜索,然后按组合键插入预定义的字符串。

相关问题