2012-09-07 74 views
0

我想要添加/刪除「..」(有一個空格 - 但我不能使它更明顯)在上面的每一行(點)前面的字符串。這是我最好的選擇:自定義切換器?

(defun rst-comment-above (Point) 
    (interactive "d") 
    (save-excursion 
    (goto-char 1) 
    (cond 

    ((numberp (get this-command 'state)) 
     ((replace-regexp "^\\.\\. " "" nil (point) (get this-command 'state))) 
     (put this-command 'state "")) 

    (t 
    (replace-regexp "^" ".. " nil (point) Point) 
    (put this-command 'state Point)) 
))) 

它的工作原理是第一次,但第二,它說:

(invalid-function 
(replace-regexp "^\\.\\. " "" nil (point) (get this-command (quote state)))) 

編輯

@ user4815162342:

所以我評論以上內容:

I comment the thing above

然後我插入新行:

I insert new lines

然後我想取消對的事情,我也得到:

upon uncommenting the thing, and I get

,不過也許它不是那麼重要。我通常不會在評論區域輸入任何內容。我只是注意到這個問題。什麼是更重要的 - 在會話中存儲給定文件的'state。難以實施嗎?

+0

而不是(goto-char 1)我推薦'(goto-char(point-min))'。 – Stefan

+0

@Stefan:好的。雖然我現在不使用縮小。 – Adobe

+0

我現在明白你的意思了。我已經更新了我的答案來處理這個案例,並修復了另一個錯誤。請嘗試新版本。 – user4815162342

回答

1

錯誤來自您撥打replace-regexp的行上的多餘括號。該行應該是:

(replace-regexp "^\\.\\. " "" nil (point) (get this-command 'state)) 

您的代碼還有其他一些問題。

  1. 存儲點的當前價值,因爲你加 字符緩衝區,這使得向前點動不能很好地工作。這使得 (一旦上述語法錯誤被修復),該函數就會錯過最後幾個「..」的 實例。
    • 解決的辦法是存儲點標記。
  2. 您應該使用(point-min)而不是硬編碼的緩衝區 開始1,或你的代碼將失敗時緩衝狹窄是 效應來工作。
  3. 最後,作爲其文檔狀態,replace-regexp並不意味着從Lisp程序調用 。

這裏是你的函數的修訂版本:

(defun rst-comment-above() 
    (interactive) 
    (let ((pm (point-marker)) 
     (prev-marker (get this-command 'rst-prev-marker))) 
    (save-excursion 
     (goto-char (point-min)) 
     (cond ((null prev-marker) 
      (while (< (point) pm) 
       (insert "..") 
       (forward-line 1)) 
      (put this-command 'rst-prev-marker pm)) 
      (t 
      (while (< (point) prev-marker) 
       (when (looking-at "^\\.\\.") 
       (replace-match "")) 
       (forward-line 1)) 
      (put this-command 'rst-prev-marker nil)))))) 
+0

你可以選擇一個用戶名嗎?任何隨機單詞都可以找到,這使得其他人更容易引用您的答案。 –

+0

感謝您的編輯,改進後的格式使答案更加清晰。 – user4815162342

+0

'點標記'確實保持正確的位置 - 如果你插入新的字符到註釋文本中 - 而不是新行。雖然'set-mark'和'register-to-point'確實:即使我在這些標記上面輸入了一些新的行 - 標記指向了右邊的「point」。我可以分別用'anything-mark-ring'(或'icicle-goto-marker')和'point-to-register'來看它。但是他們都是互動的,我看不出有什麼方法可以用來達到目的。你能做些什麼嗎?無論如何感謝你的代碼和批評。在這裏和那裏留下一對冗餘副本是很有用的... – Adobe

0

任何理由,你爲什麼不rst-mode使用M-;

+0

嘗試取消註釋。 – Adobe

+0

@Adobe:適合我。如果沒有,請將其報告爲缺陷。 – Stefan