괄호 안에 손실없이 elisp를 편집하는 방법


13

linum.el에서 elisp 코드를 수정하고 있습니다.

(custom-set-variables '(linum-format 'dynamic))
(defadvice linum-update-window (around linum-dynamic activate)
   (let* ((w (length (number-to-string
      (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) "d ")))
            ad-do-it))

나는 들여 쓰기 오프에 의해-하나 수정하여 버그를 해결할 수 있었다 (count-lines (point-min) (point-max))로를 (+ (count-lines (point-min) (point-max)) 1). 그것은 쉽다.

그러나 이제 (concat " %" (number-to-string w) "2d ")줄 번호 카운트가 <10 인 경우 if 조건을 추가하여 최소 너비가 2가되도록 수정하고 싶습니다 .

이것은 쉬워야한다! 하나의 조건을 추가하고 concat을 복사 / 붙여 넣기하십시오. 케이크 조각 맞지? 내 말은, 내가 해야 할 일을 알고 있지만 elisp를 거의 만지지 않으며 많은 괄호로 무언가를 수정해야 할 때 항상 곤란합니다.

내가 이해 한 것으로부터 "올바른"스타일은 들여 쓰기를 기반으로 코드를 구성하고 후행 괄호를 줄이 아닌 줄 바꿈으로 감싸는 것입니다. 다른 'C'스타일의 언어에서 나오는 방식으로 코드를 읽고 쓰는 데 어려움을 겪고 있습니다. 그래서 내 질문은 : 내가 뭘 잘못하고 있니? elisp를 편집하고 코드를 탐색하여 거기에 앉아서 모든 괄호를 세지 않아도되는 방법은 무엇입니까?

너무 깊이 들어가는 무언가로 작업 할 때 문을 닫고 블라인드를 당기고 괄호 K & R 스타일을 배치하기 시작해야합니다.

분명히 나는이 모든 일을 잘못하고 있습니다. 두려움없이 어떻게 이런 감동을 만질 수 있습니까?

내 질문은 스타일에 대한 질문이 아닌 elisp를 탐색하고 편집하는 방법입니다. 스타일 가이드로 이미 다음을 사용하고 있습니다 : https://github.com/bbatsov/emacs-lisp-style-guide

업데이트 :

emacs.stackexchange에서 당황하기 전에 elisp를 올바르게 포맷하는 방법 :

당신의 elisp를 표시하고 수행하십시오 M-x indent-region.

문제 해결책 :

최소 너비가 2 인 리넘에 대해 올바른 정렬을 수행하는 방법을 알고 싶은 경우 다음 해결책이 있습니다.

(defadvice linum-update-window (around linum-dynamic activate)
  (let* ((w (length (number-to-string
                     (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (if (> w 1)
                           (concat " %" (number-to-string w) "d ")
                         " %2d ")))
    ad-do-it))

1
모두 C에서 나오는 lisp를 읽는 데 어려움을 겪습니다. 시간이 걸리지 만 결국 자연스럽게됩니다. 또한 linum-format을 "% 2d"와 같은 형식 문자열로 변경하여 문제를 해결할 수도 있습니다.
Jordon Biondo

%2d너비가 3 자 이상으로 롤오버되면 오른쪽 정렬에서 왼쪽 정렬로 이동 하기 때문에 사용할 수 없습니다 .
Zhro

(내 의견으로는) 가치있는 일치하는 괄호를 강조 표시하는 라이브러리가 몇 가지 있습니다 highlight-parentheses. rainbow-delimiters; 등이 여기에 내 자신의 단순화 된 버전입니다 highlight-parentheses마지막 색상 화 된 괄호를 제거하지 않고 스크롤이 허가 : stackoverflow.com/a/23998965/2112489을 미래에, 그것은 고객 / 쓰레드 당 하나 개의 질문입니다.
lawlist

1
Elisp 코드를 편집하지 않고 문제가 실제로 읽고있는 것처럼 들립니다 . Lisp의 구조를 이해하는 데 문제가있어 편집을 방해하는 것처럼 들립니다.
PythonNut

1
당신의 방어에서, 그것은 매우 심하게 들여 쓰기 된 코드 조각입니다. 나는 그것 때문에 처음 3 번 잘못 읽었습니다. 또한 paredit .
Malabarba

답변:


12

paredit, smartparens 및 lispy와 같이 도움이 될 수있는 여러 애드온 패키지가 있습니다. 이 패키지를 사용하면리스 코드를 쉽게 탐색하고 조작 할 수 있으므로 s- 표현식을 생각하고 편집기가 균형 조정에 대해 걱정할 수 있습니다.

Emacs에는 학습 할 가치가있는 sexps 및 목록을 다루기위한 많은 내장 명령이 있으며 lisp 코드 구조에 더 익숙해 지도록 도와줍니다. 이들은 일반적으로 다음과 같은 C-M-접두사로 바인딩 됩니다.

  • C-M-f/ C-M-bsexp에 의해 앞으로 / 뒤로 이동
  • C-M-n/ C-M-p목록별로 앞으로 / 뒤로 이동
  • C-M-u/ C-M-d한 수준 아래 / 위로 이동
  • C-M-t 포인트 주위에 두 sexps를 교환
  • C-M-k sexp를 죽일
  • C-M-SPC sexp를 표시
  • C-M-q sexp를 다시 들여 쓰기

들여 쓰기를 수정하면 제공 한 예제 코드가 더 명확 할 수 있습니다. 시작 부분에 포인트를두고 전체 표현식을 다시 들여 쓰기 위해 (defadvice...적중 C-M-q하십시오. 교체하려면 (concat...나는 그 sexp의 시작 부분에 포인트를두고 C-M-o들여 쓰기를 유지하면서 줄을 나눕니다. 그런 다음을 추가 (if...하고 위의 명령을 사용하여 목록의 끝으로 이동하여 다른 닫는 Paren을 추가하고 처음으로 다시 들여 쓰기 등을 추가하십시오.

show-paren-mode포인트가 목록의 시작 또는 끝에있을 때 해당 파렌을 강조 표시하는 을 켜고 싶을 수도 있습니다 . 일치하는 Paren 대신 전체 표현식을 강조 표시하는 것을 선호 할 수 있으므로 사용자 정의를 시도하십시오 show-paren-style.

@Tyler가 다른 답변에 대한 의견에서 언급했듯이 이러한 명령 및 관련 명령에 대한 자세한 내용은 설명서 를 참조하십시오.


참고 C-M-q접두사 인수로 호출 할 수는 ( C-u C-M-q) 시점에서 식을 꽤-인쇄합니다. 이렇게하면 모든 것이 분리되어 줄을 들여 들여 쓰기가되어 중첩이 매우 분명합니다. 일반적으로 lisp 코드가 그렇게 보이기를 원하지 않지만 수동으로 전체 K & R을 수행하지 않고 약간의 코드를 이해하면 도움이 될 수 있습니다. (그리고 언제든지 C-x u취소 할 수 있습니다).
glucas

6

LISP를 편집하는 좋은 방법은 개별 문자 나 행 대신 AST를 조작하는 것입니다. 나는 2 년 전에 시작한 패키지 lispy로 그 일을 해왔습니다 . 실제로이 작업을 수행하는 방법을 배우려면 실제로 약간의 연습이 필요할 수 있지만 기본 사항 만 사용하면 이미 도움이 될 것입니다.

이 변경을 수행하는 방법을 설명 할 수 있습니다.

1 단계

시작 위치는 일반적으로 최상위 sexp 이전에 포인트를 갖습니다. 여기 |가 요점입니다.

|(defadvice linum-update-window (around linum-dynamic activate)
   (let* ((w (length (number-to-string
      (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) "d ")))
            ad-do-it))

코드를 제대로 들여 쓰려면 i한 번 누르십시오 . 멋지게 다시 들여 쓰기됩니다.

2 단계

"d "조작 가능한 객체 입력 lispy은 표시 할 필요가없는 목록이거나 지역으로 표시해야하는 일련의 기호 또는 목록 이므로 영역 으로 표시하고 싶을 것 입니다.

at그렇게하려면 누르십시오 . 이 a명령을 사용하면 상위 목록 내에서 단일 기호를 표시 할 수 있으며이 t특정 기호의 색인입니다.

3 단계

  1. 로 현재 영역을 래핑하려면을 ()누릅니다 (.
  2. 을 눌러 C-f한 문자 앞으로 이동하고를 삽입하십시오 if.
  3. (다시 눌러 삽입 ()합니다.
  4. 삽입하십시오 > w 10.
  5. C-f C-m 줄을 새 줄로 이동하십시오.

4 단계

문자열을 복제하려면

  1. 기호 또는 문자열 위치를로 표시하십시오 M-m.
  2. 를 누릅니다 c.

멋진 방식으로 영역을 비활성화하고 문자열의 맨 처음에 포인트를 두려면 다음을 누르십시오 idm.

  1. i 문자열의 내부 내용을 선택합니다.
  2. d 포인트와 마크를 교환합니다.
  3. m 지역을 비활성화합니다

또는 m C-b C-b C-b이 경우 또는 할 수 C-g C-b C-b C-b있습니다. 내 생각 idm에 관계없이 문자열의 길이와 동일한 이후, 더 나은입니다. C-x C-x C-f C-g 문자열 길이에 관계없이 작동 한다고 생각 합니다.

마지막으로 2종료 코드를 얻기 위해 삽입 하십시오.

(defadvice linum-update-window (around linum-dynamic activate)
  (let* ((w (length (number-to-string
                     (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) (if (> w 10)
                                                             "2|d "
                                                           "d "))))
    ad-do-it))

요약

전체 순서했다 : at( C-f, if, (, > w 10, C-f C-m M-m cidm, 2.

코드 삽입을 계산하면 AST 조작과 관련이없는 유일한 키는 2 C-f와 1 C-m입니다.


3
Lispy는 흥미롭게 들린다! 영업에 : 당신은 유사한 paredit와 워크 플로우를 개발할 수 있습니다 : emacsrocks.com/e14.html을 하고 확장 지역 : github.com/magnars/expand-region.el , 아니면 그냥 내장 된 괄호 매칭 명령으로 장난 : GNU. org / software / emacs / manual / html_node / emacs / Parentheses.html
Tyler

나는 당신이 나를 위해 문제를 해결하기 위해 묶일 때 추측하고 있다고 확신합니다. 시도해 주셔서 감사합니다. 예제로 코드를 사용하여 문제를 해결했습니다. 올바른 해결책은 내 업데이트를 참조하십시오.
Zhro

6

시간이지나면서 익숙해 지겠지만 속도를 높이기 위해 할 수있는 일이 많이 있습니다.

들여 쓰기

이 광기에 대한 방법이 있습니다. lisp에서 이것을 할 수 있습니다 :

(a-fun (another-fun (magic-macro 1)))

1이것이 실제로 큰 표현 이라고 가정 하고 자체 줄에 들여 쓰기를 원한다고 가정하십시오 .

(a-fun (another-fun (magic-macro 
  1)))

오해의 소지가 있습니다. 1전체 3 단계의 중첩 수준이 더 높더라도 하나의 슬롯 만 들여 쓰기됩니다. 부모가 더 낫습니다.

(a-fun (another-fun (magic-macro 
                      1)))

우리가 당신의 코드에서이 체계를 사용한다면, 우리는 이것을 얻습니다 :

(custom-set-variables '(linum-format 'dynamic))
(defadvice linum-update-window (around linum-dynamic activate)
  (let* ((w (length (number-to-string
                      (+ (count-lines (point-min) (point-max)) 1))))       
          (linum-format 
            (concat " %" (number-to-string w) "d ")))
     ad-do-it))

들여 쓰기와 중첩 수준 사이의 강한 상관 관계에 유의하십시오. 더 높은 수준의 중첩이있는 줄은 항상 적은 줄보다 들여 쓰기됩니다.

이것만으로도 많은 도움이 될 것입니다. 코드의 "모양"을 쉽게 볼 수 있으며, 대부분의 다른 언어에서는 들여 쓰기를 블록 및 블록과 연관시키고 특정 형태의 중첩 (명시 적 또는 암시 적)을 연관 시키도록 교육했습니다.

연습으로 코드에서 불필요한 괄호를 제거했습니다. Elisp에 대한 기본 지식 (즉, 함수와 값이 무엇이며의 구조 let*)이 주어지면 코드를 읽고 누락 된 괄호를 제공 할 수 있어야합니다 .

custom-set-variables '(linum-format 'dynamic)
defadvice linum-update-window (around linum-dynamic activate)
  let* w length number-to-string
                  + 
                    count-lines (point-min) (point-max) 
                    1       
         linum-format 
           concat " %" (number-to-string w) "d "
     ad-do-it

1
Emacs에서 타격 탭은 거의 항상 여기에 설명 된대로 들여 쓰기를 올바르게 설정합니다. 손으로 공백을 추가하여 절대로 입력해서는 안됩니다!
Tyler

newline-and-indentemacs-lisp-mode와 lisp-interaction-mode 를 위해 "Cm"을 바인딩하면 첫 번째 예제 인 PythonNut이 해결됩니다. 그리고 TAB은 나머지 시간에 작업을 수행합니다.
Davor Cubranic

5

나는 이것을 다른 대답으로 포함시키고 있습니다.

때로는 들여 쓰기가 실패합니다. 그렇다면 당신의 의지는 다음과 같은 것을 사용하는 것입니다 rainbow-delimiters.

여기에 이미지 설명을 입력하십시오

이것은 모든 paren의 중첩 수준을 명시적이고 쉽게 스캔 할 수있게합니다.

그래도 꽤 큰 문제가 있습니다 : 파렌은 어리석게 산만합니다. 여기에 강조의 균형이 있습니다. rainbow-delimiters일반적으로 나머지 코드를 희생하여 파 렌스에 많은 중점을 둡니다! 그러나 무지개를 아래로 향하게하면 스캔하기가 점점 어려워집니다.

균형이 잘 잡힌 얼굴 세트를 찾으면 꼭 사용하십시오.

즉, 하나의 솔루션 (내가 기뻐하게 만드는 솔루션)은 두 개의 얼굴 세트를 가져 와서 즉시 전환하는 것입니다. 다른 일을 할 때 얼굴이 희석되어 배경으로 사라집니다.

여기에 이미지 설명을 입력하십시오

그러나 포인트 en 놓으면 ens을 펀칭하여 중첩 레벨을 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오

다음은이를 수행하는 코드입니다.

(defvar rainbow-delimiters-switch nil
  "t if rainbow-delimiters are currently punched")
(defvar rainbow-delimiters-face-cookies nil
  "a list of face-remap-add-relative cookies to reset")

(make-variable-buffer-local 'rainbow-delimiters-switch)
(make-variable-buffer-local 'rainbow-delimiters-face-cookies)

(add-hook 'prog-mode-hook #'rainbow-delimiters-mode)
(add-hook 'text-mode-hook #'rainbow-delimiters-mode)

(with-eval-after-load 'rainbow-delimiters
  (set-face-foreground 'rainbow-delimiters-depth-1-face "#889899")
  (set-face-foreground 'rainbow-delimiters-depth-2-face "#9b7b6b")
  (set-face-foreground 'rainbow-delimiters-depth-3-face "#7b88a5")
  (set-face-foreground 'rainbow-delimiters-depth-4-face "#889899")
  (set-face-foreground 'rainbow-delimiters-depth-5-face "#839564")
  (set-face-foreground 'rainbow-delimiters-depth-6-face "#6391aa")
  (set-face-foreground 'rainbow-delimiters-depth-7-face "#9d748f")
  (set-face-foreground 'rainbow-delimiters-depth-8-face "#7b88a5")
  (set-face-foreground 'rainbow-delimiters-depth-9-face "#659896")

  (defun rainbow-delimiters-focus-on ()
    "Punch the rainbow-delimiters"
    (setq rainbow-delimiters-face-cookies
      (list
        (face-remap-add-relative 'rainbow-delimiters-depth-1-face
          '((:foreground "#3B9399") rainbow-delimiters-depth-1-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-2-face
          '((:foreground "#9B471D") rainbow-delimiters-depth-2-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-3-face
          '((:foreground "#284FA5") rainbow-delimiters-depth-3-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-4-face
          '((:foreground "#3B9399") rainbow-delimiters-depth-4-face))
            (face-remap-add-relative 'rainbow-delimiters-depth-5-face
          '((:foreground "#679519") rainbow-delimiters-depth-5-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-6-face
          '((:foreground "#0E73AA") rainbow-delimiters-depth-6-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-7-face
          '((:foreground "#9D2574") rainbow-delimiters-depth-7-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-8-face
          '((:foreground "#284FA5") rainbow-delimiters-depth-8-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-9-face
          '((:foreground "#199893") rainbow-delimiters-depth-9-face)))
      rainbow-delimiters-switch t))

  (defun rainbow-delimiters-focus-off ()
    "Reset the rainbow-delimiters faces"
    (mapc #'face-remap-remove-relative rainbow-delimiters-face-cookies)
    (setq rainbow-delimiters-switch nil))

  (defun rainbow-delimiters-focus-on-maybe ()
    "Punch the rainbow-delimiters if the point is on a paren"
    (when (looking-at "[][(){}]")
      (unless (or rainbow-delimiters-switch (minibufferp))
        (rainbow-delimiters-focus-on))))

  (defun rainbow-delimiters-focus-off-maybe ()
    "Reset the rainbow-delimiters if the point is not on a paren"
    (unless (looking-at "[][(){}]")
      (when rainbow-delimiters-switch
        (rainbow-delimiters-focus-off))))

  (run-with-idle-timer 0.6 t 'rainbow-delimiters-focus-on-maybe)
  (run-with-idle-timer 0.1 t 'rainbow-delimiters-focus-off-maybe))

이것은 멋지다! 하이라이트 괄호보다 무지개 구분 기호를 선택한 이유는 무엇입니까?
Tyler

@Tyler 특별한 이유는 없지만 지금은 레인보우 구분 기호를 사용하고 있지만 (이것은 익숙하기 때문일 수 있습니다). 나는 최근까지 강조 괄호에 대해 들어 본 적이 없었습니다.
PythonNut

4

코드를 들여 쓰면 제대로 들여 쓰기해야합니다. Lisp 개발자는 제대로 들여 쓰기 된 모양을 기대합니다. 그렇다고 코드가 모두 동일하게 보이는 것은 아닙니다. 코드를 형식화하는 다른 방법이 여전히 있습니다.

  • 라인은 얼마나 오래 걸리나요?
  • 라인을 통해 함수 / 매크로 호출을 분배하는 방법?
  • 몇 개의 들여 쓰기 공간이 있어야합니까?
(defadvice linum-update-window (around linum-dynamic activate)
   (let* ((w (length (number-to-string
      (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) "d ")))
            ad-do-it))

나는 들여 쓰기가 어떤 방식 으로든 봉쇄를 보여줄 것으로 기대합니다. 그러나 코드에는 없습니다.

기본적으로 코드는 다음과 같이 들여 쓰기 될 수 있습니다. 다른 답변은 Emacs의 도움으로 어떻게 할 수 있는지 설명했습니다.

(defadvice linum-update-window (around linum-dynamic activate)
  (let* ((w (length (number-to-string
                     (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) "d ")))
    ad-do-it))

let바운드 변수가 동일한 세로 열에서 시작될 것으로 기대합니다 . 나는 또한 것을 기대하는 의이 let덜 들여 쓰기됩니다. 우리는 어떻게 let들여 쓰기 해야하는지 배웁니다 . 일단 훈련하면, 쉽게 알아볼 수있는 시각적 패턴입니다.

코드의 주요 시각적 인 빌딩 블록이있다 defadvice, let*그리고 함수 호출의 무리. def이름으로는 이름, 인수리스트와 본문 다음에 정의가 있음을 알려줍니다.

따라서 나는보고 싶어

defadvice name arglist
  body

let*: 것 let*, 바인딩 및 신체의 목록을 표시합니다.

따라서 나는보고 싶다 :

let*  list of bindings
  body

좀 더 상세한:

let*   binding1
       binding2
       binding3
  body

함수 호출의 경우 다음과 같습니다.

FUNCTIONNAME ARG1 ARG2 ARG3

또는

FUNCTIONNAME ARG1
             ARG2
             ARG3

또는

FUNCTIONNAME
  ARG1
  ARG2
  ARG3

어느 것이 사용되는지는 인수의 길이에 따라 다릅니다. 우리는 줄을 너무 길게 만들고 싶지 않으며 자체 줄의 각 인수는 더 많은 구조를 가질 수 있습니다.

따라서 이러한 패턴을 사용하여 코드를 작성해야하며 독자가 코드에서 해당 패턴을 쉽게 식별 할 수 있어야합니다.

괄호는 해당 구문을 직접 묶어야합니다.

(sin 10)

(sin
  10)

공백 예제를 피하십시오 :

(  sin 10  )

또는

(
   sin
)

또는

(sin 10
)

Lisp에서 괄호에는 언어 구문 기능이 없으며 목록 데이터 구조 구문의 일부입니다 (s- 표현식). 따라서 목록을 작성하고 목록을 형식화합니다. 목록 내용을 형식화하기 위해 Lisp 프로그래밍 언어에 대한 지식을 사용합니다. let표현식은 함수 호출과는 다른 포맷해야합니다. 여전히 둘 다 목록이며 괄호는 목록을 직접 묶어야합니다. 줄에 단일 괄호를 사용하는 것이 합리적이지만 거의 사용하지 않는 몇 가지 예가 있습니다.

식 경계를 찾는 데 도움이되도록 괄호를 사용하십시오. 목록에서 목록으로 이동하고, 목록을 편집하고, 목록을 잘라 내고 복사하고, 목록을 바꾸고, 목록을 들여 쓰거나 형식을 지정하고, 목록을 선택하는 데 도움이됩니다 ...


2

들여 쓰기에 대한 기본 도움말을 보려면 TAB 및 "CMq"( indent-pp-sexp)를 사용하십시오. "Cm"을 바인딩 newline-and-indent하면 줄 바꿈 후 Tab 키를 눌러야합니다.

"CM- 왼쪽 / 오른쪽 / 위쪽 / 위쪽 / 아래쪽 / 홈 / 끝"을 사용하여 sexp로 탐색 할 수 있습니다. 이는 매우 유용합니다.

이 같은 사용 뭔가 괄호의 균형을 유지에 대해 걱정하는 경우 smartparens을 (그것은 그 용서 조금 더 paredit 처음에 환자복을 입고처럼 느낄 수). 또한 sexp 레벨에서 탐색하고 편집 할 수있는 많은 바인딩이 제공됩니다.

마지막으로, 괄호를 강조 표시하려면 옵션 (메뉴-> 강조 괄호 또는 show-paren-mode. ".


1

다른 사람들이 답변으로 준 것에 더하여 여기 내 2 센트가 있습니다.

  • 자동 들여 쓰기 emacs-lisp-mode는 필수입니다.
  • blink-matching-parennil기본적으로 켜져 있습니다 (아닌 ). 그대로 두십시오.
  • 을 사용 show-paren-mode하여 커서 앞의 오른쪽 paren에 해당하는 왼쪽 paren을 강조 표시합니다.
  • 일치하는 왼쪽 paren이있는 곳을 더 잘 보려면 커서 앞에 오른쪽 paren을 일시적으로 삭제하고 다시 입력하십시오.

나는 전기 페어링이나 무지개 또는 다른 "도움말"을 사용 하지 않습니다 . 나에게는 그것들이 도움이 아니라 귀찮게합니다.

특히 electric-pair-mode나에게는 불편한 귀찮은 일이다. 그러나 어떤 사람들은 그것을 좋아합니다. 그리고 Lisp 괄호 이외의 다른 페어링 컨텍스트에서 도움이 될 수 있다고 생각합니다 (그렇다고 생각하지만 그러한 사용 사례에 대해서도 확신하지 않습니다).

가장 적합한 것을 찾을 수 있습니다. 내가 말하고 싶은 주요 사항은 다음과 같습니다. (1) 자동 들여 쓰기는 친구입니다. 포인트 전에 오른쪽 파엔과 일치하는 왼쪽 파레를 발견 할 수있는 방법입니다.

특히, 자동 들여 쓰기가 무엇을하는지 알면 다시는 올바른 패런을 스스로 줄이려고하지 않는다는 것을 즉시 알 수 있습니다. 다른 언어로 편재 된 코딩 스타일은 시끄 럽습니다.

자동 들여 쓰기 외에 당신과 함께 얻을 수 RETTAB사용하여 편안하게 C-M-q. (사용 C-h k의는 emacs-lisp-mode이러한 키가 할 무엇을 찾을 수 있습니다.)


1

일부 사람들은 이미 레인보우 구분 기호를 언급했으며, lisp 코드를 편집 할 때 가장 좋아하는 모드이기도합니다.

실제로 나는 괄호를 좋아한다. Lisp의 가장 좋은 점은 그 괄호이다.

  • 당신이 편집 괄호 쉽게 예를 들어, 키를 눌러 수 있도록, 악 모드와 플러그인 악 서라운드를 설치 ci(모든 것을 내부를 제거합니다 (), va(") ("래핑 일을 선택되고 "()"그 자체. %일치하는 괄호 사이 를 이동 하려면을 누르십시오.

  • flycheck 또는 flymake를 사용하면 일치하지 않는 괄호에 실시간 밑줄이 표시됩니다.


0

여기서 어려운 점은 특정 전후에 코드를 추가하려는 것 sexp입니다. 이 상황에서 sexp는 (concat " %" (number-to-string w) "d ")입니다. if 문을 (if (> w 1) 앞에 삽입 하고 else 문을 " %2d ") 뒤에 삽입하려고 합니다.

어려움의 주요 부분은 이것을 분리 하는 것입니다 sexp. 개인적으로 아래 명령을 사용하여sexp

(defun isolate-sexp () (interactive)
       (save-excursion (forward-sexp) (if (not (eolp-almost))
               (split-line) nil)))
(defun eolp-almost () (interactive)
(save-excursion (while (equal (char-after) ? ) (forward-char 1))
        (if (eolp) t nil )      ))

커서를 처음에 (concat " %" (number-to-string w) "d "), 즉 처음에 놓고 (위를 적용하십시오 isolate-sexp. 당신은 얻을

(defadvice linum-update-window (around linum-dynamic activate)
   (let* ((w (length (number-to-string
      (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) "d ")
                                  ))
            ad-do-it))

그 전에이 후 적절한 코드를 추가 sexp, 즉

(defadvice linum-update-window (around linum-dynamic activate)
   (let* ((w (length (number-to-string
      (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (if (> w 1) (concat " %" (number-to-string w) "d ") " %2d ")
                                  ))
            ad-do-it))

그리고 짜잔. 이 방법으로 얻은 코드는 아마도 아름답지는 않지만 길을 잃을 가능성은 적습니다.

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