2014-09-17 7 views
0

나는 *terminal<1>*, *terminal<2>*, *terminal<3>* 등의 버퍼를 가지고있다. 숫자에 대한 인수를 취할 키 조합을 바인드하는 방법이 있습니까? 즉, C-c 1*terminal<1>*C-c 2으로 전환하여 *terminal<2>*으로 전환하는 등의 작업을 수행합니다. 이 작업을 직접 수행 할 수 없다면 Elisp에서 모든 기능을 정의하는 메타 프로그래밍을 수행 할 수 있습니까?Emacs에서 키와 변수를 바인딩 할 수 있습니까?

+0

여기에 명령 인수에 좋은 튜토리얼입니다.htaccess Admin Home English Language Content – Ehvince

답변

1

당신은 평소와 같이 키를 바인딩 할 수 있습니다 :

(global-set-key (kbd "C-c 1") (lambda() 
    (interactive) 
    (switch-to-buffer "*terminal<1>*"))) 

우리가 macros를 사용하는 것이 1에서 9까지의 모든 바로 가기를 만들 수 있습니다.

편집 :이 버그가 많은 버전은 나를 트랙에 넣을 수 있습니다. 내가 :(

(defmacro gototerminal (count) 
`(global-set-key (kbd ,(concat "C-c " (number-to-string count))) 
;; with the comma I want to evaluate what is inside concat 
(lambda() (interactive) 
    (switch-to-buffer (concat "*terminal<" ,count ">*")))) 
) 

(progn (setq count 1) 
      (while (< count 10) 
      (gototerminal count) 
      (setq count (1+ count)) 
      )) 

PS를 포기 :. elisp 디버거가 edebug입니다 구리 CMX이 제안에

+0

게시하기 전에 귀하의 버전과 비슷한 것을 보았습니다. 계속 조정하고 결과를 게시 할 것입니다. –

1

나는 기능은 미니 버퍼의 숫자 읽는 것을 나타냅니다 n 인수 interactive를 호출하는 함수를 작성합니다 : 당신이 미니에 숫자를 입력하게됩니다

(defun test (x) 
    (interactive "nNumber of buffer to visit: ") 
    (message (concat "received number: " (number-to-string x)))) 

핵심이 바인딩을 완충기.

또 다른 방법은 숫자 인수를 사용하는 것입니다

(defun test (x) 
    (interactive "P") 
    (message (concat "received number: " (number-to-string x)))) 

당신이 C-c c이 기능을 결합 말을, 당신은 다음 C-u 2 C-c c를 눌러 인수로 그것을 숫자 2를 전달할 수 있습니다.

+0

고려해 볼 수있는 두 가지 접근 방식을 가지고있어 주셔서 감사하지만, 둘 다 내가 원하는 것보다 더 많은 키 스트로크가 필요합니다. 대화 형 기능은 숫자 뒤에 Enter 키를 눌러야합니다. 'C-u 2 C-c c'는 더 길다. 나는 수동으로 여분의 키 스트로크를 끊임없이 만들어야하는 9 가지 기능을 수동으로 정의하고자한다. –

+0

FWIW,'(interactive "NTerminal number :")'("n"대신에 "N")을 사용하면 숫자 접두사 arg가 있으면 프롬프트를 우회하여 두 접근법을 결합합니다. 또한 'M-2 C-c c'는 타이핑하기가 조금 더 빠릅니다. – phils

3

로 설정, 대화 형 switch-to-terminal 예를 들어 접두사 인수 C-u 2 중 하나를 수행하거나 사용자에게 메시지를 표시합니다 .

매크로는 다음 좀 더 쉽게 키 바인딩을 설정합니다.

마지막으로 내가 *terminal<1>* 012로 전환 C-c 4C-c 1 바인딩.

(defun switch-to-terminal (buf-num) 
    (interactive "NNumber of buffer to visist: ") 
    (let* ((buf-name (format "*terminal<%d>*" buf-num)) 
     (buf (get-buffer buf-name))) 
    (unless buf 
     (error "No buffer %s" buf-name)) 
    (switch-to-buffer buf))) 

(defmacro bind-switch-to-terminal (num) 
    `(global-set-key 
    ,(kbd (format "C-c %d" num)) 
    (lambda() 
     (interactive) 
     (switch-to-terminal ,num)))) 

(bind-switch-to-terminal 1) 
(bind-switch-to-terminal 2) 
(bind-switch-to-terminal 3) 
(bind-switch-to-terminal 4) 

이러한 변화는 동일한 switch-to-terminal 함수를 사용하지만 기능 bind-switch-to-terminal 대체한다. lexical-let*은 클로저를 생성하여 고유 한 터미널 스위칭 기능을 만들 수 있도록하기 위해 dotimes 루프는 C-c 1C-c 9으로 바인드합니다.

(defun bind-switch-to-terminal (num) 
    (lexical-let* ((buf-num num) 
       (switch-func 
        (lambda() 
        (interactive) 
        (switch-to-terminal buf-num)))) 
    (global-set-key 
    (kbd (format "C-c %d" buf-num)) 
    switch-func))) 

(dotimes (num 9) 
    (bind-switch-to-terminal (1+ num))) 
+0

Andrew, 당신의 대답은 좀 더 완벽한 답변이지만, Ehvince는 올바른 방향으로 이끌어 준 부분적인 대답으로 당신을 이길 수있었습니다. –

0

당신은 예를 들어, 하나의 키 누르기와 명령을 실행할 수 C-C 같은 기존의 접두사 키의 사용을 피할 경우 F9. 이 명령은 단일 키를 입력으로 가질 수 있습니다.

예 : http://ergoemacs.org/emacs/elisp_basics :

(defun test (k) 
    (interactive "K") 
    (message "Pressed key: %d" (- (aref k 0) ?0))) 

(local-set-key [f9] 'test) 
관련 문제