在Emacs中复制并粘贴Python函数

时间:2015-12-17 14:16:40

标签: python emacs

我有一个类似的程序(这是一个愚蠢的例子来说明我的观点,它的作用并不是很重要)

count = 0

def average(search_term):
    average = 0
    page = 0
    current = download(search_term, page)
    while current:
        def add_up(downloaded):
            results = downloaded.body.get_results()
            count += len(results)
            return sum(result.score for result in results)
        total = average*count
        total += add_up(current)
        average = total/count
        print('Average so far: {:2f}'.format(average))
        page += 1
        current = download(search_term, page)

如果我将光标放在任何一行8-11上并按下一个组合键,我希望Emacs复制或终止add_up功能,然后我想将光标移动到第2行并按a键合并粘贴函数,并为其粘贴的上下文提供正确的缩进级别。

这是可能的,如果是的话,我该怎么做?

3 个答案:

答案 0 :(得分:3)

使用python-mode.el py-kill-defyank可以胜任。 但是,有一些限制。必须从内部def中调用py-kill-def。因此需要先从第11行向上。 插入后缩进也会产生一些问题:因为缩进是语法,有时Emacs无法知道需要哪个缩进。在下面的示例中,第一个缩进为4,add_up中的缩进为add_up可能不需要 - 但它是合法代码。在py-indent-and-forward正文中缩进第一行后,def average(search_term): average = 0 def add_up(downloaded): results = downloaded.body.get_results() count += len(results) return sum(result.score for result in results) page = 0 current = download(search_term, page) while current: total = average*count total += add_up(current) average = total/count print('Average so far: {:2f}'.format(average)) page += 1 current = download(search_term, page) 应该可以方便剩下的内容。

<ac:structured-macro ac:name="html"><ac:plain-text-body><![CDATA[<iframe src="http://YOURDOMAIN/download/attachments/98334/img_welcome.png?api=v2" noborder="0" width="830" height="800" scrolling="yes" seamless></iframe>]]></ac:plain-text-body></ac:structured-macro>

答案 1 :(得分:1)

对于这类事情,我通常使用expand-region,我选择将其绑定到C-=

使用您的示例我可以按add_up()一次选择C-=功能,正常杀死该区域(C-k),移至第2行,然后像往常一样猛拉({{1 }})。

根据您为Python配置的其他内容,您可能需要清理一些空格,否则可能会为您清理。例如,aggressive-indent会有所帮助。

一个手动选项是使用C-y

等内容重新粘贴粘贴的代码

答案 2 :(得分:1)

我一直在使用smart-shift(在Melpa中可用)来做这类事情。 global-smart-shift-mode启用(注意,它绑定键)。选择要移动的块(我使用像Chris这样的expand-region),默认的键绑定C-S-c <arrow>开始移动它。一旦你移动,箭头(没有C-S-c)进一步移动。水平移位使用主模式的缩进偏移量(python-indent-offset用于python.el)。