emacs
  • haskell
  • elisp
  • alignment
  • 2011-01-11 3 views 13 likes 
    13

    내가 자주 하스켈에서 작업하고 있지 다음과 유사한 코드를 건너 elisp 노하우가 없어. 따옴표없이 "="하는 것을 시도했지만, 이것은 '='앞에 원치 않는 공백 문자를 삽입합니다. 제안 된 솔루션 here을 찾았지만 아무것도 할 수없는 것처럼 보입니다.이맥스 =에 정렬 - 정규 표현식하지만 ==

    나를 위해이 키 바인딩을 설정할 수있는 기능 또는 하드 코드 된 매크로를 작성하는 데 도움이됩니다.

    답변

    17

    구리 MXalign-regexpRET\(\s-*\) =RET1RET0RETn

    (거기에 '='뒤에 공백,하지만 매우 분명 아니에요 NB.)

    즉 ...

    접두사 인수를 사용하여 align-regexp에 기본적으로 매개 변수보다 많은 매개 변수를 요청합니다.

    \(\s-*\)가 삭제/확장을위한 기본 '그룹'입니다 :

    C-H f를align-regexpC-H의 V 자세한 내용은 align-rules-list하지만, 짧은을 참조하십시오. 우리는 패턴 끝에 '='을 추가합니다. (\s-은 공백을위한 Emacs regexp 구문입니다.)

    1은 단순히 위의 괄호로 묶은 그룹 1을 나타냅니다. 이것이 기본값입니다.

    0 줄의 두 부분 사이에 사용할 간격입니다. 기본적으로이 값은 1이며 추가 공간으로 끝내는 이유입니다.

    n 각 줄의 첫 번째 줄 이후의 모든 패턴 일치를 정렬하지 마십시오.

    편집 : 사실, Q & A는 당신이 동일한 근처에 링크, 그리고 이맥스 23.2.1에 나를 위해 잘 작동하므로이 중복이지만 계속 키 결합 측면에 답 :

    키보드 매크로를 통해 해당 시퀀스를 바인딩 할 수 있습니다. 최종 결과는 init 파일에 추가 할 수 있습니다. 직접 프로세스를 진행하는 것이 좋습니다. 키는 C-c a 대신 원하는 것을 사용하십시오. C-c (letter) 및 F5-F9는 최종 사용자가 원하는대로 바인드하도록 예약되어 있으므로 모드 키맵에 의해 그 중 하나가 위장되지 않을 수 있습니다.

    1. 텍스트를 선택 :
      (global-set-key (kbd "C-c a") (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([21 134217848 97 108 105 103 110 45 114 101 103 101 120 112 return 32 61 32 return return backspace 48 return 110] 0 "%d")) arg))) 
      

      나는가 있다고했다.
    2. F3 녹음을 시작합니다.
    3. 위에서 설명한대로 align-regexp을 수행합니다 (모든 내용을 입력하고 미니 버퍼 기록 또는 yanking을 사용하지 않도록주의하십시오).
    4. F4 녹음을 중지합니다.
    5. C-X-C K 않음align-single-equalsRET는 LISP를 얻을
    6. M-Xinsert-kbd-macroRET RET align-single-equals에 이름을 매크로를 얻었다.
    7. 으로 (lambda) 표현식을 래핑하여 바인딩합니다. (당신이 제공 한 또한 (fset 'align-single-equals ...) 코드를 사용하고, 그 기호의 열쇠를 결합 할 수 있지만.

    1 복잡한 매크로를 기록 할 때 실수를 한 경우, 이맥스가 정말 제공 — 무서워하지 않습니다 좋은 매크로 편집기를 사용하면 녹음을 완료 한 후에 실수를 수정할 수 있습니다 (Cx Ck e). 완전하지 않아도됩니다.

    편집 2 : 5 월에는 함수에 따라 달라집니다.

    (defun my-align-single-equals() 
        "Align on a single equals sign (with a space either side)." 
        (interactive) 
        (align-regexp 
        (region-beginning) (region-end) 
        "\\(\\s-*\\) = " 1 0 nil)) 
    
    (global-set-key (kbd "C-c a") 'my-align-single-equals) 
    
    +0

    감사합니다. 나는 당신의 솔루션을 사용할 수 있었지만 매크로 대신에 함수를 만들었습니다. 그것은 나를 위해 더 읽기 쉽기 때문입니다. – Karl

    +0

    글쎄 그게 더 낫네 :) 만약 당신이 행복하게 작성한다면, 함수는 확실히 바람직하다.하지만 그렇지 않다면 매크로는 매우 편리하다. – phils

    +0

    좀 늦기는하지만이 문제를 해결하는 표준 방법은 자신의 함수를 작성하는 대신'align-rules-list '에 규칙을 추가하는 것입니다. –

    관련 문제