2012-11-23 3 views
0

필자는 TeX 관련 모드에서 점이 무엇이든 (특히 선 끝)에 평소처럼 삽입 할 물결표 키를 원하지만 점이 공간 상에 있으면 물결표를 덮어 쓰고 싶습니다. 그것. (이것은 텍 소스 파일에 뭔가를 붙여 넣은 후 아주 유용한 기능이 될 것입니다.) 나는이 같은 해킹 : 물결표를 사용하여 Emacs에서 공간을 덮어 쓰려면 어떻게합니까?

(defun electric-tie() 
    "Inserts a tilde at point unless the point is at a space 
character, in which case it deletes the space first." 
    (interactive) 
    (while (equal (char-after) 32) (delete-char 1)) 
    (while (equal (char-before) 32) (delete-char -1)) 
    (insert "~")) 

(add-hook 'TeX-mode-hook (lambda() (local-set-key "~" 'electric-tie))) 

내 질문

은 간단하다 : 그것은 (작동하는 것 같다) 정확하고 더 나은 수행 할 수 있습니다 ? (나는 첫 번째 질문에 대한 대답이 긍정적 인 경우, 후자는 스타일의 문제라고 가정합니다.)

+1

제대로 작동하면 좋습니다. 정말. Emacs 사용자의 신조입니다. 새로운 범용 패키지를 작성하지 않는 한. – pmr

+0

고마워요.하지만 저는 그걸 작동시켜야 할뿐만 아니라 뭔가를 배우고 싶습니다. 어쩌면 더 좋은 방법이 있을까요? 어쩌면 저수준을 사용해야 할 때 높은 수준의'(interactive)'함수를 사용하고 있을지도 모릅니다. 아니면 그 반대일까요? 어쩌면 나는'equal'을 사용하고 있을지 모르지만 비슷한 맥락에서'eq'를 사용하는 것이 일반적입니다. 어쩌면'(insert "~") 대신'(self-insert)'해야합니까? – mbork

+1

HAH! 그 신조는 왜 이맥스에 관한 많은 질문들이 여기에 총상을 입혔는지에 대한 이유입니다. @mbork는 정식 솔루션을 이해하려고 시도 할 때 추천해야합니다. –

답변

2

몇 가지 포인트 :

  1. 대신 32 사용 (물음표 공간) 문자 리터럴을 표현한다.

  2. 주요 모드 후크에서 키를 정의하는 대신 eval-after-load 블록에서 수행하십시오. 차이점은 메이저 모드를 사용할 때마다 메이저 모드 후크가 실행되지만 메이저 모드마다 하나의 키맵 만 존재한다는 점입니다. 따라서 반복적으로 키를 재정의 할 필요가 없습니다.

    은 다음을 참조하십시오 https://stackoverflow.com/a/8139587/903943

  3. 그것은 숫자 인수를 안이 명령처럼 보이지만 당신이 고려 숫자 인수를 취함으로써보다 유연하게 만들 수 있습니다 작성하는 방법 다른 명령을 알고 대화 사양을 이해하는 가치 . 새로운 수정에 대한

하나 더 참고 : 점의 주위에 공간을 취소

귀하의 방법은 잘못 아니지만, 나는이 작업을 수행 할 것 :

언급 한 바와 같이
(defun foo() 
    (interactive) 
    (skip-chars-forward " ") 
    (delete-region (point) (+ (point) (skip-chars-backward " ")))) 
+0

고마워요! 나는 조금 파고 들었다. 스페이스 문자의 표현으로'? \ s'가 더 좋지 않습니까? – mbork

+0

어떤 방법을 선호하는지 잘 모르겠지만 둘 다 32라고 평가됩니다. –

+0

글쎄,'? \ s'는 장점이있는 것 같습니다 :'? ' – mbork

3

, 그것은 더 나은입니다 숫자 리터럴보다 "문자"리터럴을 사용하십시오. , ?\ ?\s 중 하나를 선택할 수 있습니다. 마지막 하나는 Emacs-22 이후에만 지원되지만 다른 방법으로는 "더 쉽게 볼 수있는"것이기 때문에 공간을 사용할 위험이 없습니다. char는 fill-paragraph 나 whitespace trimming과 같은 것으로 다른 것으로 바뀌거나 제거 될 것입니다.

실제로 equal 대신 eq을 사용할 수 있지만 그 차이는 중요하지 않습니다.

마지막으로 손으로 삽입하는 대신 (call-interactively 'self-insert-command)을 호출 하겠지만 그 차이는 중요하지 않습니다 (예 : 과 함께 3 개의 틸데를 삽입 할 수 있음).

관련 문제