2013-10-26 17 views
1

我正在嘗試編寫一個elisp函數來獲取文本區域,引用每行,並在每行的結尾處添加逗號(除最後一行外)。Elisp檢查當前點是否在給定點之後的線上

這將是一個例子轉型:

Aaaa Bbbb CCcc 
DDddd eeeee ffffffff 
ggggg hhh iiii 

要:

"Aaaa Bbbb CCcc", 
"DDddd eeeee ffffffff", 
"ggggg hhh iiii" 

這是我到目前爲止有:

(defun quote-lines (p1 p2) 
    (interactive "r") 
    (save-excursion 
    (while (<= (point) p2) ; Would like to check if we are on 
       ; the line after p2 
     (move-beginning-of-line nil) 
     (insert "\"") 
     (move-end-of-line nil) 
     (insert "\",") 
     (forward-line)) 
    (move-end-of-line nil) 
    (delete-char 1))) 

任何幫助決策我的elisp功能更多地道的也將不勝感激。

+0

看起來沒問題,只是你沒有使用'p1',並且'move-beginning/end-of-line'只能用於交互式使用(Lisp代碼中首選沒有「move-」的版本)。你可以在循環前使用'(forward-line 0)',這樣你就知道每個迭代開始時這個點已經在行的開頭。 – Stefan

回答

1

不能說太多地道。 我現在只寫了一些作品。 這裏是爲您的代碼修復(您忘記goto-char所以,如果你在倒車選擇區域它不工作 ):

(defun quote-lines (p1 p2) 
    (interactive "r") 
    (deactivate-mark) 
    (save-excursion 
    (goto-char p1) 
    (move-beginning-of-line 1) 
    (while (< (point) p2) 
     (insert "\"") 
     (move-end-of-line 1) 
     (insert "\",") 
     (forward-line)) 
    (backward-delete-char 1))) 

我看到你有一個while循環去。這確實更有效。 根據具體情況,您可以採用功能性方式。 我猜,它更漂亮,但效率更低。

(defun quote-lines-1() 
    (interactive) 
    (let* ((beg (if (region-active-p) 
        (region-beginning) 
       (point-min))) 
     (end (if (region-active-p) 
        (region-end) 
       (point-max))) 
     (str (buffer-substring beg end))) 
    (delete-region beg end) 
    (insert 
    (mapconcat (lambda (x) (format "\"%s\"" x)) 
       (split-string str "\n") 
       ",\n")))) 
+0

在一個足夠大的區域,這將會行爲不當,因爲在所有這些插入之後,'p2'不會再引用正確的緩衝區位置。因此,要麼改變代碼來爲'p2'使用標記,要麼將代碼改爲從'p2'開始並且向後移動到'p1'。 – Stefan

0

這就是你需要:

(defun quote-lines (beg end) 
"Put double-quotes around each line in the region. Put a comma after each line. 
Quote each whole line that contains part of the region." 
    (interactive "r") 
    (setq beg (save-excursion (goto-char beg) (line-beginning-position)) 
     end (save-excursion (goto-char end) (line-end-position))) 
    (let ((lines (mapconcat (lambda (line) (format "\"%s\"" line)) 
          (split-string (buffer-substring beg end) "\n" t) 
          ",\n"))) 
    (delete-region beg end) 
    (insert lines))) 

首先,該地區實際上是擴大到包括整個行。

然後該區域被拆分成行(split-string),並且每行都被引用,然後後跟逗號(mapconcat)。

然後將該區域替換爲期望的結果。

相關問題