2

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

menu.add_item(spamspamspam, "spamspamspam");

我想知道是否有更快的方法来做到这一点。

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

唯一不变的是变量名需要在同一行重复多次。

我想输入

menu.add_item($,"")

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

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

UPD 毕竟是 yasnippet 方式。

感谢thisirs的回答。这确实是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)))

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

4

3 回答 3

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 扩展!

于 2013-07-31T21:45:02.957 回答
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而且还会")镜像到以前的副本上)。

于 2013-08-01T03:38:02.123 回答
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

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

于 2013-07-31T18:54:14.663 回答