이맥스 대량 들여 쓰기


132

코드 블록에 try / except를 추가하려는 경우 Emacs에서 Python으로 작업하면 전체 블록을 한 줄씩 들여 쓰기 해야하는 경우가 종종 있습니다. Emacs에서는 한 번에 전체 블록을 어떻게 들여 쓰기합니까?

저는 숙련 된 Emacs 사용자는 아니지만 ssh를 통해 작업하는 데 가장 적합한 도구라는 것을 알았습니다. 차이가 나는 경우 GUI가 아닌 명령 줄 (Ubuntu)에서 Emacs를 사용하고 있습니다.


5
C-c >맞습니다. C-c <왼쪽으로
Thamme Gowda

답변:


213

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 칸이 입력 됩니다.

추신. 우분투에서 파이썬 모드를 모든 .py 파일의 기본 모드로 만들려면 간단히 python-mode패키지 를 설치하십시오 .


완벽하게 작동합니다. Emacs22를 사용하면 모든 .py 파일에서 파이썬 모드가 자동으로 활성화되지 않습니까? 어쨌든 Cc>는 잘 작동합니다.
버논

@ Vernon : C-c >python-mode.el에 정의되어 있으므로 python-mode패키지를 어딘가에 설치해야한다고 생각합니다 . 다행입니다.
unutbu

1
참조가>가 제공 python.el 작동으로 파이썬 모드를 설치하지 않고 이맥스 23.2에서 잘 작동
codeasone

@landstatic : 정보 주셔서 감사합니다. 그것은 위에 나열된 모든 명령이 python-mode.el 또는 python.el에 대해 동일하게 작동한다고 생각합니다.
unutbu

2
@redobot : C-c C-l그리고 C-c C-r당신은 자신을 설정 한 사용자 정의 바인딩해야합니다. 당신이 실행하면 emacs -q(는 init 파일을로드하지 않고 실행 이맥스에) 당신은 더 바인딩이 없습니다 볼 수 있습니다 C-c C-l또는 C-c C-r파이썬 모드가.
unutbu

9

기본적으로 indent-region매핑되는 외에도 C-M-\사각형 편집 명령은 Python에 매우 유용합니다. 영역을 정상으로 표시 한 후 다음을 수행하십시오.

  • C-x r t( string-rectangle) : 각 줄에 삽입 할 문자를 입력하라는 메시지가 나타납니다. 특정 수의 공백을 삽입하는 데 적합
  • C-x r k( kill-rectangle) : 사각형 영역을 제거합니다. 들여 쓰기 제거에 좋습니다

C-x r y( yank-rectangle) 도 가능 하지만 거의 유용하지 않습니다.


4

indent-region매핑 C-M-\트릭을해야한다.


3
이것은 끔찍한 조언입니다. 파이썬 들여 쓰기는 (구문이기 때문에) 유추 될 수 없으므로 ident-region은 쓸모가 없습니다.
Sam Clearman

1

이 함수를 사용하여 들여 쓰기 및 들여 쓰기를 처리했습니다.

(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

나는 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, Ctrl-n (또는 아래쪽 화살표), TAB, F4 와 같은 키보드 매크로를 빠르게 기록한 <f3> C-n TAB <f4>다음 F4를 반복적으로 사용하여 매크로를 적용하면 몇 가지 키 입력을 저장할 수 있습니다. 또는 C-u 10 C-x e10 번 적용 할 수 있습니다 .

(별로 들리지는 않지만 아래쪽 화살표를 놓치지 않고 100 줄의 가비지 리터럴을 다시 들여 쓰기 한 다음 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)

1

대화식으로 들여 쓰기를하십시오.

  1. 들여 쓰기 할 영역을 선택하십시오.
  2. Cx TAB.
  3. 화살표 ( <-->)를 사용 하여 대화식으로 들여 쓰기하십시오.
  4. Esc필요한 들여 쓰기가 끝나면 세 번 누릅니다 .

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


-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)))

2
공백은 Python 구문의 일부이므로 전체 파일의 들여 쓰기 영역은 좋지 않습니다.
Daniel Stutzbach
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.