2009-11-19 3 views
8

저는 elisp에 익숙하지 않아 배우려고합니다. 이맥스에서 다음 작업을 수행 할 수 있도록하고 싶습니다 : 나는 마지막에 표시 할 위치 C-공간 지정된 텍스트로 표시된 영역을 감싸는 Emacs 함수를 작성하는 방법

  • 이동을 통해

    1. 마크, 그래서 강조 영역을 가지고, 가정 "플롯 (강조 표시된 텍스트)"는 이맥스, 말을 "음모"입력 텍스트를 물어
    2. 히트
    3. 가 되세요 키 시퀀스 "텍스트 강조"하고, 텍스트의 변화를 강조
    4. 유무는 수 . 즉, 강조 표시된 텍스트를 괄호로 묶고 텍스트 앞에 입력하고 싶습니다.

      (defun wrap-text() 
          ) 
      

    나는 함수의 입력이 강조 표시된 텍스트가 될 것입니다 생각,하지만 난 찾고 어디서부터 시작 모른다. 다른 어려운 부분은 입력 텍스트 부분입니다. 누군가 나를 인도 해 줄 수 있을까요? 감사.

  • 답변

    8

    귀하의 경우,이 작업을해야합니다 :

    (defun wrap-text (b e txt) 
        "simple wrapper" 
        (interactive "r\nMEnter text to wrap with: ") 
        (save-restriction 
        (narrow-to-region b e) 
        (goto-char (point-min)) 
        (insert txt) 
        (insert "(") 
        (goto-char (point-max)) 
        (insert ")"))) 
    
    (global-set-key (kbd "C-x M-w") 'wrap-text) 
    
    +0

    항목 : http://xahlee.org/emacs/wrap-url.html –

    +0

    또한이 질문/대답 : http://stackoverflow.com/questions/1397113/how-to-tag-text -in-emacs/1397134 # 1397134. –

    +0

    yasnippet으로 정확히 어떻게 할 수 있습니까? 저는 다음에 익숙합니다 : 1. 키워드 을 입력하십시오. 2. 을 확장하십시오. 이것은 영역의 시작과 끝에 텍스트를 추가하는 것과 관련이 있습니다. 나는이 솔루션도 듣고 싶어 할 것이다. 감사. –

    1

    감사 잭슨을 트레이. 나는 내가 freenode의 #emacs에 도움을주기 위해 해결책을 게시했는지 몰랐다. 몇 가지 조사 후, 나는 다음과 같은 내놓았다 :

    (defun ess-R-wrap-content-vqn() 
        "Wrap marked region with a specified PREFIX and closing parentheses." 
        (interactive) 
        (set (make-local-variable 'prefix) (read-from-minibuffer "function: ")) 
        (set (make-local-variable 'prefix) (concat prefix "(")) 
        (save-excursion (goto-char (region-beginning)) (insert prefix)) 
        (save-excursion (goto-char (region-end)) (insert ")")) 
    ) 
    (define-key ess-mode-map "\C-c\M-w" 'ess-R-wrap-content-vqn) ;; w is for wrap 
    

    내가 유래 해결책이 게시가되면 알려 줄 알았는데. 다시 고마워. 이것으로부터 elisp를 조금 더 배웁니다.

    3

    버전에 조금 더 가까이 뭔가 있지만 일부 변경 :

    • 당신이이 지역 변수
    • 지역-시작과 지역 엔드 당신의 등가를 제공 만드는 '하자'사용할 수 있습니다

      (defun wrap-in-function() 
          "Wrap marked region with a specified PREFIX and closing parentheses." 
          (interactive) 
          (let ((prefix (read-from-minibuffer "function: "))) 
          (save-excursion 
           (goto-char (region-beginning)) 
           (insert (concat prefix "("))) 
          (save-excursion 
           (goto-char (region-end)) 
           (insert ")")))) 
      

      또 다른 D : 무엇 트레이 여기

    했던이 예입니다 두 버전 간의 ifference는 함수를 호출 한 후 해당 지점의 위치입니다. trey 버전을 사용하는 것이 더 좋습니다 (맛의 문제).

    편집 : 다음 비고란에 편집 됨.

    +0

    Trey의 답변에있는 'interactive'선언이이를 수행하는 더 좋은 방법입니다. 'r'은 영역을 정의해야하고 나머지는 표준 Emacs 메소드를 사용하여 원하는 텍스트를 읽는 프롬프트로 사용됨을 나타냅니다. 이 메소드들은 결국 여기에서했던 것처럼 '미니 - 버퍼 읽기'를 호출 할 수 있지만, 사용자가 정의한 다른 표준/전역 이맥스 동작을 잃게됩니다. –

    +0

    방금 ​​시도했지만 텍스트를 완전히 감싸지 않습니다. wrap() mytext. –

    +0

    감사합니다 vinh, 당신 말이 맞아요. 끝에서부터 시작하여 줄 바꿈 텍스트를 선택하면 제 기능 만 작동합니다. 내가 그 문제를 해결할 수 있는지 알아 보도록하겠습니다. – phtrivier

    2

    이것은 'cl'이 필요하지만 그렇지 않으면 매우 작습니다. 몇 년간 사용 해왔다.

    (require 'cl) ;;if you haven't elsewhere 
    (defun decorate-region(beg end prefix suffix) 
        (interactive "r\nMPrefix: \nMSuffix: ") 
        (cl-set-buffer-substring beg end (concat prefix 
                  (buffer-substring beg end) 
                  suffix))) 
    
    관련 문제