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 rt
(string-rectangle
):将提示您input要插入每行的字符; 非常适合插入一定数量的空间 -
Cx rk
(kill-rectangle
):删除一个矩形区域; 伟大的去除缩进
你也可以Cx ry
( yank-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新手,所以这个答案可能接壤没用。
到目前为止所提到的答案都没有包括像dict
或list
这样的文字的重新缩进。 例如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)))