我有一个看起来像这样的程序(这是一个愚蠢的例子来说明我的观点,它的作用并不是很重要)
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行,按下某个组合键并将该函数粘贴到那里,缩进级别与粘贴的上下文相对应。
这是可能的吗?如果可能,我将如何实现?
发布于 2015-12-19 17:18:14
使用python-mode.el、py-kill-def和yank就可以了。但是,也有一些限制。必须从有问题的定义内部调用py-kill-def。所以需要先从第11行开始向上。在insert之后缩进也会带来一些问题:因为缩进是语法,所以有时Emacs不知道需要哪种缩进。在下面的例子中,在add_up中缩进4和8可能是不需要的,但是这是合法的代码。在缩进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)发布于 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-\之类的东西重新压缩粘贴的代码。
发布于 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)。
https://stackoverflow.com/questions/34336766
复制相似问题