假设我有以下几行:
def __init__(a,b,c):
我想把它变成这个:
def __init__(a,b,c):
self.a = a
self.b = b
self.c = c
我有没有办法在emacs中做到这一点?我通常手动做这种事情,但我想知道是否有一些简短而方便的方法:)
我的第一步是复制“a,b,c”并用换行符替换“,”然后我被卡住了......
答案 0 :(得分:1)
完全自动化的方法是auto-yasnippet
扩展名。
你可以从MELPA获得它。
以下是步骤:
输入self.~a = ~a
。
这里~
是指向您想要替换的内容的前缀。
致电aya-create
。
我把它绑定到 H-w ,因为它在精神上与 M-w 类似。
如果区域不活动,则该命令在当前行上工作,否则在该区域上工作。
在此之后,您将获得self.a = a
作为您的来源和yasnippet
保存的模板类似于将文本保存到kill ring的方式。
现在转到新线并致电aya-open-line
。
我将它绑定到 H-y ,因为它类似于 C-y 。
您填写字段b
并再次致电aya-open-line
以退出代码段。
如果片段中有多个,则此命令将移至下一个镜像。
再次使用c
重复此操作。
这是一种稍微简短的方法,它只适用于单行代码段。
输入self.$ =
并致电aya-create
。然后输入a
和aya-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
虽然没有结束新的一行。