2009-11-19 23 views
8

我對elisp不太熟悉,並且正在努力學習。在Emacs,我希望能夠做到以下幾點:通過C-空間 如何編寫Emacs函數以用指定文本包裝標記區域

  • 轉到

    1. 馬克,我想的標記要結束了,所以我有一個突出的區域,假設它是「高亮文本」
    2. 命中關鍵序列
    3. 有emacs的要求我輸入一些文字,說「暗算」,並
    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 – 2009-11-19 10:47:20

    +0

    另外這款提問/回答:http://stackoverflow.com/questions/1397113/how-to-tag-text -in-emacs/1397134#1397134。 – 2009-11-19 22:19:23

    +0

    你會如何用yasnippet做這樣的事情?我熟悉: 1.鍵入關鍵字 2.展開 這涉及到在區域的開始和結尾添加文本。我也有興趣聽到這個解決方案。謝謝。 – 2009-11-20 08:34:34

    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 
    

    我以爲當解決方案發布時,會通知我stackoverflow。再次,謝謝。從這裏學習一點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兩個版本之間的區別在於你調用函數之後的點的位置; trey版本可能會更好用(味道的問題)。

    編輯:編輯以下vinh的言論。

    +0

    Trey的答案中的「交互式」聲明是更好的方法。 'r'表示必須定義一個區域,其餘部分用作提示,使用標準的Emacs方法讀入所需的文本。儘管這些方法最終可能會像您在這裏所做的那樣調用「read-from-minibuffer」,您將失去您定製的任何其他標準/全局Emacs行爲。 – 2009-11-23 16:46:40

    +0

    只是試過你的,它並沒有完全包裝文本。它包裝:wrap()mytext。 – 2009-11-25 16:16:31

    +0

    感謝vinh,你是對的,我的功能只適用於從最後開始選擇文本進行換行。我會試着看看我能否解決這個問題。 – phtrivier 2009-11-25 17:31:23

    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))) 
    
    相關問題