web-dev-qa-db-ja.com

PythonのEmacsバルクインデント

コードブロックにtry/exceptを追加する場合、EmacsでPythonを使用すると、ブロック全体を1行ずつインデントしなければならないことがよくあります。ブロック全体を一度にインデントしますか。

私は経験豊富なEmacsユーザーではありませんが、sshを使用するのに最適なツールであることがわかりました。 EmacsをGUIとしてではなく、コマンドライン(Ubuntu)で使用しています。

122
Vernon

Python Emacsを使用してプログラミングしている場合は、おそらくpython-modeを使用する必要があります。python-modeでは、コードブロックをマークした後、

C-c >またはC-c C-lは、領域を4スペース右にシフトします

C-c <またはC-c C-rは、リージョンを4スペース左にシフトします

2レベルのインデントまたは任意の量だけコードをシフトする必要がある場合は、コマンドの前に引数を付けることができます。

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スペース左にシフトします

また、テキスト行ではなくテキストの長方形を操作する rectangleコマンド も便利です。

たとえば、長方形の領域をマークした後、

C-x r oは、空白を挿入して長方形領域を埋めます(コードを効果的に右にシフトします)

C-x r kは長方形の領域を削除します(コードを効果的に左にシフトします)

C-x r tは、長方形を置き換える文字列の入力を求めます。 C-u 8 <space>と入力すると、8つのスペースが入力されます。

PS。 Ubuntuでは、pythonモードをすべての.pyファイルのデフォルトモードにするには、python-modeパッケージをインストールするだけです。

198
unutbu

デフォルトでindent-regionにマップされるC-M-\に加えて、長方形編集コマンドはPythonにとって非常に便利です。リージョンを通常としてマークし、次に:

  • C-x r tstring-rectangle):各行に挿入する文字の入力を求めます。特定の数のスペースを挿入するのに最適
  • C-x r kkill-rectangle):長方形領域を削除します。インデントを削除するのに最適

C-x r yyank-rectangle)を使用することもできますが、それはめったに役立ちません。

8

indent-regionにマッピングC-M-\トリックを行う必要があります。

4
Łukasz

私はEmacsの初心者なので、この答えはおそらく役に立たないと答えています。

これまでに述べた答えは、dictlistのようなリテラルの再インデントをカバーしていません。例えば。 M-x indent-regionまたはM-x python-indent-shift-rightと会社は、次のリテラルをカットアンドペーストして、適切にインデントを変更する必要がある場合は役に立ちません。

    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行上に行って物事を繰り返す必要があります;))。

1
Rob

次のスニペットを使用します。選択範囲が非アクティブの場合、タブで現在の行をインデントします(通常どおり)。選択範囲が非アクティブの場合、領域全体が右側にインデントされます。

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

私はこの関数を使用してインデントとインデント解除を処理しています:

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

対話的にインデントを行います。

  1. インデントする領域を選択します。
  2. C-x TAB
  3. 矢印を使用(<- そして ->)インタラクティブにインデントします。
  4. 押す Esc 必要なインデントが完了したら3回。

私の投稿からコピーしました: Emacsの複数行のインデント

0
dtypist