2012-03-20 3 views
0

저는 abbrev-mode의 큰 팬입니다. 조금 비슷한 점이 있습니다. 입력을 시작하고 곧바로 공백을 입력하면 (또는 공간이 충분할 때) 함수가 호출됩니다. (공백을 입력하면 물론 abbrev-mode처럼 특수 약어를 쓰면이됩니다. 나는 확실히 어떤 기능을 내가 공간을 명중 매번 실행할하지 마십시오abbrev-mode와 같지만 기능은 무엇입니까?

...

그래서 대신 abbrev-mode를 사용하여 약어를 확장, 내 선택의 기능을 실행하는 것입니다.

물론 항상 사용하는 abbrev-mode과 호환되어야합니다.

어떻게하면됩니까?

+0

왜 누군가가 나를 위해이 투표를하는 것입니다. 그 질문은 분명합니다. 분명히 (abbrev-mode가 매우 도움이되는 것처럼) 매우 도움이 될 수 있고 이미 좋은 대답이 있습니다. –

답변

3

한 접근법은 pre-abbrev-expand-hook을 사용할 수 있습니다. 나는 abbrev 모드를 직접 사용하지 않지만 abbrev 모드 기계를 이런 방식으로 재사용 할 수있는 것처럼 들린다. 그리고 간단하게 'abbreviations'를 정의하여 스스로 (또는 아무것도 아닌) 확장 한 다음 그들을 붙잡는다. 그 훅에 들어가서 원하는 행동을 취하십시오.

expand 라이브러리는 분명히 관련되어 있으며 expand-expand-hook을 제공하며 다른 대안이 될 수 있습니까?

편집 : 으악;

래퍼 후크`확장-약칭 '주위 : 23.1

abbrev-expand-functions이 정확한 변수이기 때문에 pre-abbrev-expand-hook는 사용되지 않습니다. 이 특수 후크의 함수는 하나의 인수로 호출됩니다. 약식 확장을 수행하는 함수입니다. 확장이 이루어지면 약어를 반환해야합니다.

코드에 대한 M-x find-function RET expand-abbrev RET 참조하십시오, 당신은이 후크를 사용하는 방법을 이해하는 C-h f with-wrapper-hook RET을 읽을 수 있습니다.

+0

아 +1 좋은 생각처럼 들리 겠지만 Emacs-fu는 충분히 강하지 만 약식 모드 기계를 재사용하는 것과 같은 생각이 듭니다.) –

3

편집 : 수정 된 질문에는 내 대답에서 다루지 않은 주요 세부 정보가 추가되었습니다. phils는이 문제에 접근하는 한 가지 방법을 제공했습니다. 다른 하나는 yasnippet입니다. 이 같은 뭔가를 할 수 있도록, 당신의 조각 템플릿에서 임의의 혀짤배기 코드를 포함 할 수 있습니다

# -*- mode: snippet -*- 
# name: foobars 
# key: fbf 
# binding: direct-keybinding 
# -- 
`(foo-bar-for-the-win)` 

당신은 아무것도 반환하지 않았다 당신의 기능을 보장하기 위해 필요한 것, 또는 버퍼에 삽입된다. 나는 abbrev-mode를 사용하지 않으므로 이것이 충돌을 일으키는 지 알 수 없다. yas/snippet은 실행을 위해 약간의 실험이 필요하지만 일단 설정하면 꽤 편리합니다.

원문 대답 : 공간을 원하는 기능에 바인딩 할 수 있습니다. 모든 구두점 키를 동일한 기능 또는 다른 기능에 바인딩 할 수 있습니다.

(define-key your-mode-map " " 'your-choice-function) 

모드를 전환 할 때 정상적인 동작으로 돌아갈 수 있도록 사용자 지정 모드 맵에서이 작업을 수행하는 것이 좋습니다. 세계적으로 셀프 인서트를 제외한 모든 공간을 확보하는 것은 도움이되지 않습니다.

+0

그래서 내 자신의 함수에 바인딩 한 다음 abbrev-mode 또는 "my-funabbrev-mode"로 디스패치해야합니까? 나는 하나의 함수에 공간을 묶고 싶지 않다. 나는 공간 앞에 입력 한 것에 따라 공간을 함수를 수행하기를 원한다. 마치 abbrev-mode와 같다. 예를 들어 abbrev-mode에서 "teh"라고 입력하면 "the"가됩니다. 필자의 경우에는 "fbf"라고 타이핑하고 이맥스가 자동으로 foo-bar-forthewin * 함수를 실행하게하고 싶습니다 (왜냐하면 어딘가에 foo-bar-forthewin에 fbd를 바인딩했기 때문입니다. "sof"라고 입력하고 Emacs가 자동으로 * some-other-function *을 실행하도록하십시오. –

+0

것은 abbrev-mode와 마찬가지로 다른 모드에서 입력해야하는 함수를 바인딩하는 것 같지 않습니다. 이것이 약 99.999 %의 약자 모드의 공간이 공간과 같이 작용하는 이유입니다. (그래서 abbrev-mode가 너무 큽니다.) 충돌이있을 경우 항상 특정 함수 바인딩을 제거 할 수 있습니다 ... –

2

모든 약어는 여러 요소로 구성됩니다. 주요 요소 중에는 이름 (예 : "fbf"), 확장 (원하는 문자열) 및 후크 (호출되는 함수)가 있습니다. 귀하의 경우에는 확장을 빈 문자열로 지정하고 단순히 foo-bar-for-the-win을 후크로 지정하는 것처럼 들립니다.