在Emacs中重复输入变量名的快速方法?

时间:2013-07-31 18:23:51

标签: emacs elisp

我只是在第N次输入这种代码:

menu.add_item(spamspamspam, "spamspamspam");

我想知道是否有更快的方法。

我想要一种类似于yasnippet镜像的行为,除了 我不想创建一个片段:参数顺序不同 项目,项目,语言和语言。

唯一不变的是需要的变量名 在同一条线上重复了几次。

我想输入

menu.add_item($,"")

并使用引号之间的点,调用快捷方式并开始输入, 最后以 C-e 退出。

这对我来说似乎有利,因为没有额外的光标移动。 我知道如何做到这一点,但我想知道它是否已经完成, 或者如果可以做得更好/更快。

UPD毕竟是yasnippet方式。

感谢他们的回答。这确实是我最初想到的yasnippet代码:

(defun yas-one-line ()
  (interactive)
  (insert "$")
  (let ((snippet 
         (replace-regexp-in-string 
          "\\$" "$1"
          (substring-no-properties
           (delete-and-extract-region
            (line-beginning-position)
            (line-end-position))))))
    (yas/expand-snippet snippet)))

但我仍然希望看到更好/更快的东西。

3 个答案:

答案 0 :(得分:3)

yasnippet实际上可用于动态创建代码段:

(defun yas-one-line ()
  (interactive)
  (let ((snippet (delete-and-extract-region
                  (line-beginning-position)
                  (line-end-position))))
    (yas-expand-snippet snippet)))

现在只需输入:

menu.add_item($1,"$1")

并致电yas-one-line。上面的代码片段由yasnippet扩展!

答案 1 :(得分:2)

你可以尝试

(defvar sm-push-id-last nil)
(defun sm-push-id ()
  (interactive)
  (if (not sm-push-id-last)
      (setq sm-push-id-last (point))
    (text-clone-create sm-push-id-last sm-push-id-last
                       t "\\(?:\\sw\\|\\s_\\)*")
    (setq sm-push-id-last nil)))

之后您可以执行M-x sm-push-id RET , SPC M-x sm-push-id RET toto并插入toto, toto。显然,如果将sm-push-id绑定到方便的键组合,这将更有意义。此外,这仅适用于插入重复的标识符对。如果您需要插入其他内容,则必须调整正则表达式。使用太松散的正则表达式意味着克隆将倾向于过度使用它们的预期用途,因此它们可能会变得烦人(例如,您键入foo")而不仅foo而且")会被镜像到上一份)。

答案 2 :(得分:1)

录制宏。点击F3(或可能C-x (,取决于)开始录制。输入您想要的任何内容并运行您需要的任何命令,然后点击F4(或C-x ))完成。然后在下次要运行宏时再次点击F4。有关详细信息,请参阅Emacs手册的第17章(C-h i打开信息浏览器,Emacs手册位于列表顶部。)

因此,例如,您可以键入行的开头:

menu.add_item(spamspamspam

然后,使用该行末尾的点,记录此宏:

F3 C-SPC C-left M-w C-e , SPC " C-y " ) ; RET F4

这会复制该行的最后一个单词并将其粘贴回,但在引号内。