Python的Emacs批量缩进

在Emacs中使用Python,如果我想添加一个try /除了一段代码,我经常发现我不得不逐行缩进整个块。 在Emacs中,你怎样一次缩进整个块。

我不是一个有经验的Emacs用户,但只是发现它是通过SSH工作的最佳工具。 我在命令行(Ubuntu)上使用Emacs,而不是gui,如果这有什么区别的话。

如果你使用Emacs编程Python,那么你应该使用python模式。 使用python模式,在标记代码块之后,

Cc >Cc Cl将区域向右移动4个空格

Cc <Cc Cr将区域向左移动4个空格

如果您需要通过两级缩进来转移代码,或者您可以在命令前加上一个参数,则可以使用一些任意数量的代码:

Cu 8 Cc >将区域向右移动8个空格

Cu 8 Cc <将区域向左移动8个空格

另一种select是使用Mx indent-rigidly绑定到Cx TAB

Cu 8 Cx TAB将区域向右移动8个空格

Cu -8 Cx TAB将区域向左移动8个空格

对矩形文本操作而不是文本行的矩形命令也很有用。

例如,在标记一个矩形区域之后,

Cx ro插入空白区域以填充矩形区域(有效地将代码右移)

Cx rk杀死矩形区域(有效地将代码移到左边)

Cx rt提示inputstring来replace矩形。 inputCu 8 <space>然后input8个空格。

PS。 使用Ubuntu时,要使python模式成为所有.py文件的默认模式,只需安装python-mode软件包即可。

除了默认映射到CM-\indent-region ,矩形编辑命令对于Python非常有用。 标记一个区域正常,然后:

  • Cx rtstring-rectangle ):将提示您input要插入每行的字符; 非常适合插入一定数量的空间
  • Cx rkkill-rectangle ):删除一个矩形区域; 伟大的去除缩进

你也可以Cx ryyank-rectangle ),但这只是很less有用的。

indent-region映射到CM-\应该做的伎俩。

我一直在使用这个函数来处理我的缩进和无意的:

 (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))) 

我使用下面的代码片段。 在“选项卡”选项处于非活动状态时,会缩进当前行(正常情况下)。 当select不活动时,它将整个区域缩进到右边。

 (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) 

我是一个Emacs新手,所以这个答案可能接壤没用。

到目前为止所提到的答案都没有包括像dictlist这样的文字的重新缩进。 例如Mx indent-region或者Mx python-indent-shift-right和company不会帮助你剪切粘贴下面的文字,并且需要合理地重新缩进:

  foo = { 'bar' : [ 1, 2, 3 ], 'baz' : { 'asdf' : { 'banana' : 1, 'apple' : 2 } } } 

感觉就像Mx indent-region应该在python-mode做一些明智的事情,但是现在还不是这样。

对于文字被括起来的特殊情况,在相关的行上使用TAB可以得到你想要的(因为空白不起作用)。

所以我在这种情况下所做的就是快速录制键盘macros,如F3,Ctrl-n(或向下箭头),TAB,F4中的<f3> Cn TAB <f4> ,然后重复使用F4来应用macros可以节省几个击键。 或者你可以做Cu 10 Cx e来应用它10次。

(我知道这听起来不是很多,但是尝试重新缩进100行的垃圾文字,而不会丢失向下的箭头,然后不得不重复5行,并重复的东西;))。

我普遍做这样的事情

 ;; intent whole buffer (defun iwb () "indent whole buffer" (interactive) ;;(delete-trailing-whitespace) (indent-region (point-min) (point-max) nil) (untabify (point-min) (point-max)))