在emacs中使用正则表达式复制某些表达式

时间:2013-12-29 13:30:18

标签: regex emacs

假设我有以下几行:

def __init__(a,b,c):

我想把它变成这个:

def __init__(a,b,c):
    self.a = a
    self.b = b
    self.c = c

我有没有办法在emacs中做到这一点?我通常手动做这种事情,但我想知道是否有一些简短而方便的方法:)

我的第一步是复制“a,b,c”并用换行符替换“,”然后我被卡住了......

3 个答案:

答案 0 :(得分:1)

完全自动化的方法是auto-yasnippet扩展名。 你可以从MELPA获得它。

以下是步骤:

  1. 输入self.~a = ~a。 这里~是指向您想要替换的内容的前缀。

  2. 致电aya-create。 我把它绑定到 H-w ,因为它在精神上与 M-w 类似。 如果区域不活动,则该命令在当前行上工作,否则在该区域上工作。 在此之后,您将获得self.a = a作为您的来源和yasnippet 保存的模板类似于将文本保存到kill ring的方式。

  3. 现在转到新线并致电aya-open-line。 我将它绑定到 H-y ,因为它类似于 C-y 。 您填写字段b并再次致电aya-open-line以退出代码段。 如果片段中有多个,则此命令将移至下一个镜像。

  4. 再次使用c重复此操作。

  5. 这是一种稍微简短的方法,它只适用于单行代码段。 输入self.$ =并致电aya-create。然后输入aaya-open-line退出。 如您所见,$插入一个镜像,另一个镜像添加。

    您可以在https://github.com/abo-abo/auto-yasnippet找到更多使用示例。

答案 1 :(得分:1)

这是一个代码片段,可以完成你想要的,我认为,逐字:

(defun init-expand ()
  (interactive)
  (save-excursion
    (re-search-backward "(\\([^)]+\\))" nil t))
  (let ((params (split-string (buffer-substring (match-beginning 1) (match-end 1)) ",")))
    (loop for param in params
       do (progn
            (newline-and-indent)
            (insert (format "self.%s = %s" param param))))))

评估该方法(当光标位于右括号之后或之后为CMx)然后切换到你的python缓冲区(它是python,对吗?)并在结束:之后移动光标,最后调用该M-x init-expand函数会将这些参数设置为self。

虽然它对你的问题非常具体,因此不太便于携带,但它可能会帮助你弄清楚如何使用一些elisp函数来帮助你找到你能想到的其他助手。也就是说,我没有从abo-abo的回答中看到yasnippet,它提供了更好地实现这一目标的工具。

答案 2 :(得分:0)

启用yasnippt(https://github.com/capitaomorte/yasnippet)(我认为需要新版本),并提供以下代码段:

# -*- mode: snippet; require-final-newline: nil -*-
# name: init
# key: init
# --
def __init__ ($1):
    ${1:$(mapconcat (function (lambda (x) (if (string= x "") "" (concat "    self." x " = " x)))) (split-string yas-text ",") "\n")}
    $0

虽然没有结束新的一行。