问题:Emacs适用于Python的批量缩进
如果我想在代码块中添加try / except,则在Emacs中使用Python,我经常发现我必须逐行缩进整个代码块。在Emacs中,如何立即缩进整个块。
我不是经验丰富的Emacs用户,但是发现它是通过ssh工作的最佳工具。我在命令行(Ubuntu)上使用Emacs,而不是作为gui,如果有什么不同的话。
回答 0
如果您正在使用Emacs编程Python,那么您可能应该使用python-mode。使用python-mode,在标记代码块之后,
C-c >
或C-c C-l
将区域右移4个空格
C-c <
或C-c C-r
将区域向左移动4个空格
如果您需要将代码缩进两个级别,或者需要一定程度的缩编,则可以在命令前加上一个参数:
C-u 8 C-c >
将区域右移8个空格
C-u 8 C-c <
将区域向左移动8个空格
另一种选择是使用M-x indent-rigidly
绑定到C-x TAB
:
C-u 8 C-x TAB
将区域右移8个空格
C-u -8 C-x TAB
将区域向左移动8个空格
用于文本矩形而不是文本行的矩形命令也很有用。
例如,在标记矩形区域后,
C-x r o
插入空格以填充矩形区域(有效地向右移动代码)
C-x r k
杀死矩形区域(有效地将代码向左移动)
C-x r t
提示输入一个字符串来替换矩形。输入C-u 8 <space>
后将输入8个空格。
PS。使用Ubuntu,要将python-mode设置为所有.py文件的默认模式,只需安装该python-mode
软件包。
回答 1
除了默认情况下indent-region
映射到C-M-\
的,矩形编辑命令对Python很有用。将区域标记为正常,然后:
C-x r t
(string-rectangle
):将提示您输入要插入每行的字符;非常适合插入一定数量的空格C-x r k
(kill-rectangle
):删除矩形区域;非常适合去除压痕
您也可以C-x r y
(yank-rectangle
),但这很少有用。
回答 2
indent-region
映射C-M-\
应该可以解决问题。
回答 3
我一直在使用此功能来处理缩进和缩进:
(defun unindent-dwim (&optional count-arg)
"Keeps relative spacing in the region. Unindents to the next multiple of the current tab-width"
(interactive)
(let ((deactivate-mark nil)
(beg (or (and mark-active (region-beginning)) (line-beginning-position)))
(end (or (and mark-active (region-end)) (line-end-position)))
(min-indentation)
(count (or count-arg 1)))
(save-excursion
(goto-char beg)
(while (< (point) end)
(add-to-list 'min-indentation (current-indentation))
(forward-line)))
(if (< 0 count)
(if (not (< 0 (apply 'min min-indentation)))
(error "Can't indent any more. Try `indent-rigidly` with a negative arg.")))
(if (> 0 count)
(indent-rigidly beg end (* (- 0 tab-width) count))
(let (
(indent-amount
(apply 'min (mapcar (lambda (x) (- 0 (mod x tab-width))) min-indentation))))
(indent-rigidly beg end (or
(and (< indent-amount 0) indent-amount)
(* (or count 1) (- 0 tab-width))))))))
然后将其分配给键盘快捷键:
(global-set-key (kbd "s-[") 'unindent-dwim)
(global-set-key (kbd "s-]") (lambda () (interactive) (unindent-dwim -1)))
回答 4
我是Emacs的新手,因此此答案可能对您毫无用处。
到目前为止,所提到的答案都没有覆盖字面量如dict
或的重新缩进list
。例如,如果您剪切并粘贴了以下文字并需要对其进行合理的缩进,则M-x indent-region
or或M-x python-indent-shift-right
company不会提供帮助:
foo = {
'bar' : [
1,
2,
3 ],
'baz' : {
'asdf' : {
'banana' : 1,
'apple' : 2 } } }
感觉M-x indent-region
应该在中做一些明智的事情python-mode
,但是还不是这样。
对于将文字放在方括号中的特定情况,在相关行上使用TAB即可获得所需的内容(因为空格不起作用)。
因此,在这种情况下,我一直在快速记录键盘宏,例如<f3> C-n TAB <f4>
F3,Ctrl-n(或向下箭头),TAB,F4,然后重复使用F4来应用宏可以节省几次击键。或者,您可以将C-u 10 C-x e
其应用10次。
(我知道这听起来不多,但是尝试重新缩进100行垃圾文字而不丢失向下箭头,然后不得不上升5行并重复一遍;)。
回答 5
我使用以下代码段。当选项卡处于非活动状态时,在选项卡上缩进当前行(通常如此);当选择处于非活动状态时,它将使整个区域向右缩进。
(defun my-python-tab-command (&optional _)
"If the region is active, shift to the right; otherwise, indent current line."
(interactive)
(if (not (region-active-p))
(indent-for-tab-command)
(let ((lo (min (region-beginning) (region-end)))
(hi (max (region-beginning) (region-end))))
(goto-char lo)
(beginning-of-line)
(set-mark (point))
(goto-char hi)
(end-of-line)
(python-indent-shift-right (mark) (point)))))
(define-key python-mode-map [remap indent-for-tab-command] 'my-python-tab-command)
回答 6
回答 7
我普遍做这样的事情
;; intent whole buffer
(defun iwb ()
"indent whole buffer"
(interactive)
;;(delete-trailing-whitespace)
(indent-region (point-min) (point-max) nil)
(untabify (point-min) (point-max)))