用于Python的Emacs批量缩进

时间:2010-04-06 13:24:48

标签: python emacs ssh

在Emacs中使用Python如果我想在一段代码中添加一个try / except,我经常会发现我必须逐行缩进整个块。在Emacs中,你如何一次缩进整个块。

我不是一位经验丰富的Emacs用户,但只是觉得它是通过ssh工作的最佳工具。我在命令行(Ubuntu)上使用Emacs,而不是gui,如果这有任何区别。

8 个答案:

答案 0 :(得分:194)

如果您使用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的{​​{1}}:

C-x TAB将区域8个空格向右移动

C-u 8 C-x TAB将区域向左移动8个空格

对于文本的矩形而不是文本行进行操作的rectangle commands也很有用。

例如,在标记矩形区域后,

C-u -8 C-x TAB插入空白区域以填充矩形区域(有效地将代码移到右侧)

C-x r o杀死矩形区域(有效地将代码移到左侧)

C-x r k提示输入一个字符串来替换矩形。输入C-x r t将输入8个空格。

PS。使用Ubuntu,要使python-mode成为所有.py文件的默认模式,只需安装C-u 8 <space>包。

答案 1 :(得分:8)

除了indent-region,默认情况下映射到C-M-\,矩形编辑命令对Python非常有用。将区域标记为正常,然后:

  • C-x r tstring-rectangle):会提示您输入要插入每行的字符;非常适合插入一定数量的空格
  • C-x r kkill-rectangle):删除一个矩形区域;非常适合删除缩进

你也可以C-x r yyank-rectangle),但这很少有用。

答案 2 :(得分:4)

映射到indent-region

C-M-\应该可以解决问题。

答案 3 :(得分:1)

我一直在使用这个功能来处理我的缩进和unindenting:

(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 :(得分:1)

我是一个Emacs newb,所以这个答案很可能接近无用。

到目前为止提到的答案都没有涵盖dictlist等文字的重新缩进。例如。 M-x indent-regionM-x python-indent-shift-right如果您已剪切并粘贴以下文字,并且需要将其重新缩进,那么公司就无法提供帮助:

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

感觉M-x indent-region应该在python-mode中明智地做一些事情,但事实并非如此。

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

所以我在这种情况下所做的就是快速录制keyboard macro,如{3}},如F3,Ctrl-n(或向下箭头),TAB,F4,然后使用F4反复应用宏可以节省几次击键。或者你可以<f3> C-n TAB <f4>申请10次。

(我知道它听起来不是很多,但尝试重新缩进100行垃圾文字而不丢失向下箭头,然后不得不上升5行并重复一些事情;))。

答案 5 :(得分:1)

我使用以下代码段。在选项卡处于非活动状态时的选项卡上,它会缩进当前行(正常情况下);当选择处于非活动状态时,它会将整个区域向右缩进。

(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 :(得分:1)

以交互方式进行缩进。

  1. 选择要缩进的区域。
  2. C-x TAB
  3. 使用箭头( <--> )进行交互缩进。
  4. 完成必需的缩进后,按三次 Esc

从我的帖子中复制:Indent several lines in Emacs

答案 7 :(得分:-2)

我做了类似的事情

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