들여 쓰기 된 블록 앞에 코드를 추가하거나 제거 할 때 자동으로 elisp 코드를 다시 들여 쓰기


18

다음과 같은 elisp 코드가 있다고 가정 해보십시오.

(+ 2 3▮(+ 3
          4))

기호를 추가하거나 제거 할 때 커서 다음에 sexp를 자동으로 다시 들여 쓰는 방법이 있습니까?

따라서를 누르면 SPC 4 SPC자동으로 다음을 얻습니다.

(+ 2 3 4 ▮(+ 3
             4))

나는 호출하여이 설명서를 할 수있는 mark-sexp다음 indent-region. 더 좋은 방법이 있습니까?


편리한 기본 키 바인딩이 없다고 생각하지만 쉽게 직접 만들 수 있습니다.
shosti

나는 알고 있지만 나는 이것을 하는 더 좋은 방법 이 있는지 궁금 합니다. 예를 들어electric-indent-mode<return>newline-and-indent
Maciej Goszczycki에

답변:


14

mark-sexp+ 대신에을 indent-region누를 수 있습니다 C-M-q. 이 호출 indent-pp-sexp됩니다. 자동은 아니지만 두 명령을 호출하는 것보다 약간 낫습니다.

또는을 사용하는 paredit-mode경우을 누릅니다 M-q. 그것은 당신이 속한 전체 함수 정의를 다시 들여 쓸 것입니다.


1
(add-hook 'post-self-insert-hook 'indent-pp-sexp)잘 작동합니다.
Maciej Goszczycki

좋아 보인다 일부 모드에서는 비용이 많이들 수 있지만 그럼에도 불구하고 좋은 접근 방식입니다.
Dmitry

Smartparens 사용자의 경우으로 현재 defun을 다시 들여 쓸 수 있습니다 M-x sp-indent-defun. 나는 이것을 묶는다 C-M-q.
라돈 로스 버러

15

공격적인 들여 쓰기 모드

어떤 사람들은 그것을 요청했기 때문에이 답변 을 패키지로 바꿨습니다 .

Melpa를 구성한 경우 다음과 같이 설치할 수 있습니다.

M-x package-install RET aggressive-indent

모든 옵션에 대해서는 Readme 를 참조하십시오. 가장 간단한 방법은 다음과 같습니다.

(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)

옛 대답

다음은 elisp 버퍼에서만 자동 들여 쓰기를 수행합니다. 입력하는 대신 물건을 지우거나 k 때 작업하는 이점도 있습니다. 다른 모드에도 쉽게 추가 할 수 있습니다.

이 함수는 현재 내부에있는 s- 표현을 들여 쓰기합니다. 원하는 경우 키에 바인딩 할 수 있지만 먼저 아래를 참조하십시오.

(require 'cl-lib)

(defun endless/indent-defun ()
  "Indent current defun.
Do nothing if mark is active (to avoid deactivating it), or if
buffer is not modified (to avoid creating accidental
modifications)."
  (interactive)
  (ignore-errors
    (unless (or (region-active-p)
                buffer-read-only
                (null (buffer-modified-p)))
      (let ((l (save-excursion (beginning-of-defun 1) (point)))
            (r (save-excursion (end-of-defun 1) (point))))
        (cl-letf (((symbol-function 'message) #'ignore))
          (indent-region l r))))))

이 후크는 아무것도 입력 한 후 elisp 버퍼에서만이 기능이 실행되도록합니다. 이렇게하면 모든 것이 항상 들여 쓰기됩니다.

(add-hook
 'emacs-lisp-mode-hook
 (lambda ()
   (add-hook 'post-command-hook
             #'endless/indent-defun nil 'local)))

시도 해봐! 그것은 잘 작동합니다.

또한 주석에서 @holocronweaver의 제안에 따라 c와 같은 언어에 다음과 같은 것을 사용할 수 있습니다.

(define-key c++-mode-map ";"
  (lambda () (interactive)
    (insert ";")
    (endless/indent-defun)))

침묵하는 자동 들여 쓰기 메시지와 세미콜론으로 끝나는 언어를 잘 다루면 좋을 것입니다.
holocronweaver

@holocronweaver 확실히, 나는 그것을 시도 할 수 있습니다. 메시지를 들여 쓰기하는 주요 모드는 무엇입니까? 세미콜론의 문제는 무엇입니까?
Malabarba

Emacs 트렁크에서 시도한 모든 모드는 elisp를 포함하여 들여 쓰기 메시지를 생성했습니다. 세미콜론은 여러 언어로 줄을 끝내므로 세미콜론을 입력 할 때까지 다음 줄은 현재 줄의 일부인 것처럼 점프합니다.
holocronweaver

@holocronweaver 메시지를 무음. 지적 해 주셔서 감사합니다.
Malabarba

수정 해 주셔서 감사합니다! 세미콜론 문제에 대한 한 가지 해결책은 세미콜론을 입력 할 때 c 모드 언어로만 들여 쓰기하는 것입니다.
holocronweaver

3

기존 솔루션을 모르지만 post-self-insert-hook직접 수행 하는 데 사용할 수 있습니다 .

(defun my-indent-next-sexp ()
  (interactive)
  (mark-sexp)
  (indent-region))

(add-hook 'post-self-insert-hook 'my-indent-next-sexp)

그래도 잠재적 인 성능 문제에 대해 걱정할 것입니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.