首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Emacs中复制和粘贴Python函数

在Emacs中复制和粘贴Python函数
EN

Stack Overflow用户
提问于 2015-12-17 22:16:40
回答 3查看 572关注 0票数 1

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

代码语言:javascript
复制
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行,按下某个组合键并将该函数粘贴到那里,缩进级别与粘贴的上下文相对应。

这是可能的吗?如果可能,我将如何实现?

EN

回答 3

Stack Overflow用户

发布于 2015-12-19 17:18:14

使用python-mode.el、py-kill-defyank就可以了。但是,也有一些限制。必须从有问题的定义内部调用py-kill-def。所以需要先从第11行开始向上。在insert之后缩进也会带来一些问题:因为缩进是语法,所以有时Emacs不知道需要哪种缩进。在下面的例子中,在add_up中缩进4和8可能是不需要的,但是这是合法的代码。在缩进add_up正文中的第一行之后,py-indent-and-forward应该可以方便地处理剩下的行。

代码语言:javascript
复制
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)
票数 3
EN

Stack Overflow用户

发布于 2015-12-18 03:27:35

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

在您的示例中,我可以通过按一次C-=来选择add_up()函数,正常终止区域(C-k),移动到第2行,然后像往常一样拉(C-y)。

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

一种手动选择是使用诸如C-x C-x M-\之类的东西重新压缩粘贴的代码。

票数 1
EN

Stack Overflow用户

发布于 2015-12-18 05:49:22

我一直在使用smart-shift (在梅尔帕提供)来做这类事情。启用global-smart-shift-mode (注意,它绑定了密钥)。选择你想要移动的块(我会像Chris一样使用expand-region ),默认的键绑定C-S-c <arrow>开始移动它。一旦你移动了,箭头(没有C-S-c)会移动得更远。水平移位使用主模式的缩进偏移量(对于python.el为python-indent-offset)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34336766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档