source

Python에 대한 Emacs 대량 들여쓰기

ittop 2023. 8. 30. 22:06
반응형

Python에 대한 Emacs 대량 들여쓰기

코드 블록을 제외하고 시도를 추가하려면 Emacs에서 Python을 사용하여 작업하면 한 줄씩 전체 블록을 들여써야 하는 경우가 많습니다.Emacs에서 블록 전체를 한 번에 들여쓰기하는 방법은 무엇입니까?

저는 경험이 많은 Emacs 사용자는 아니지만, ssh를 통해 작업하기에 가장 좋은 도구라는 것을 알게 되었습니다.나는 그것이 차이가 있다면 GUI가 아닌 명령줄(Ubuntu)에서 Emacs를 사용하고 있습니다.

만약 당신이 Emacs를 사용하여 Python을 프로그래밍하고 있다면, 당신은 아마도 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할 수밖에 없는C-x TAB:

C-u 8 C-x TAB영역을 오른쪽으로 8칸 이동합니다.

C-u -8 C-x TAB영역을 왼쪽으로 8칸 이동합니다.

또한 텍스트 줄 대신 텍스트 직사각형에서 작동하는 직사각형 명령도 유용합니다.

예를 들어, 직사각형 영역을 표시한 후,

C-x r o직사각형 영역을 채우기 위해 공백을 삽입합니다(코드를 오른쪽으로 효과적으로 이동).

C-x r k직사각형 영역을 죽입니다(코드를 왼쪽으로 효과적으로 이동).

C-x r t사각형을 대체할 문자열을 묻는 메시지가 표시됩니다.들어가는C-u 8 <space>그러면 8개의 공백을 입력합니다.

PS. Ubuntu를 사용하여 python-mode를 모든 .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-\그 묘기를 부려야 합니다.

대화형으로 들여쓰기를 수행합니다.

  1. 들여쓸 영역을 선택합니다.
  2. C-x.
  3. 화살표(<- 및 )를 사용하여 대화형 들여쓰기를 수행합니다.
  4. 필요한 들여쓰기가 완료되면 세 번 누릅니다.

내 게시물에서 복사됨: Emacs에서 여러들여쓰기

들여쓰기 및 들여쓰기 해제를 처리하기 위해 이 기능을 사용했습니다.

(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 newb이기 때문에 이 대답은 아마도 쓸모가 없을 것입니다.

지금까지 언급된 답들 중 어떤 것도 문학자들의 재입안을 포함하지 않습니다.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를 차례로 사용하여 매크로를 적용하면 몇 번의 키 입력을 절약할 수 있습니다.아니면 할 수 있습니다.C-u 10 C-x e10회 적용합니다.

(별로 들리지 않는 것 같지만, 아래 화살표를 놓치지 않고 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)

저는 보편적으로 이런 일을 합니다.

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

언급URL : https://stackoverflow.com/questions/2585091/emacs-bulk-indent-for-python

반응형