我有一个类似的程序(这是一个愚蠢的例子来说明我的观点,它的作用并不是很重要)
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键合并粘贴函数,并为其粘贴的上下文提供正确的缩进级别。
这是可能的,如果是的话,我该怎么做?
答案 0 :(得分:3)
使用python-mode.el py-kill-def
和yank
可以胜任。
但是,有一些限制。必须从内部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)。