コードブロックにtry/exceptを追加する場合、EmacsでPythonを使用すると、ブロック全体を1行ずつインデントしなければならないことがよくあります。ブロック全体を一度にインデントしますか。
私は経験豊富なEmacsユーザーではありませんが、sshを使用するのに最適なツールであることがわかりました。 EmacsをGUIとしてではなく、コマンドライン(Ubuntu)で使用しています。
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
パッケージをインストールするだけです。
デフォルトでindent-region
にマップされるC-M-\
に加えて、長方形編集コマンドはPythonにとって非常に便利です。リージョンを通常としてマークし、次に:
C-x r t
(string-rectangle
):各行に挿入する文字の入力を求めます。特定の数のスペースを挿入するのに最適C-x r k
(kill-rectangle
):長方形領域を削除します。インデントを削除するのに最適C-x r y
(yank-rectangle
)を使用することもできますが、それはめったに役立ちません。
indent-region
にマッピングC-M-\
トリックを行う必要があります。
私はEmacsの初心者なので、この答えはおそらく役に立たないと答えています。
これまでに述べた答えは、dict
やlist
のようなリテラルの再インデントをカバーしていません。例えば。 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行上に行って物事を繰り返す必要があります;))。
次のスニペットを使用します。選択範囲が非アクティブの場合、タブで現在の行をインデントします(通常どおり)。選択範囲が非アクティブの場合、領域全体が右側にインデントされます。
(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)
私はこの関数を使用してインデントとインデント解除を処理しています:
(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)))
対話的にインデントを行います。
私の投稿からコピーしました: Emacsの複数行のインデント