1

テキストの領域を取得し、各行を引用し、最後の行を除くすべての行の末尾にコンマを配置する 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関数をより慣用的にする助けもいただければ幸いです。

4

2 に答える 2

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"))))
于 2013-10-26T20:27:56.807 に答える
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)))

第 1 に、領域は実質的に行全体を含むように拡張されます。

次に、領域が複数の行に分割され ( split-string)、各行が引用符で囲まれ、その後にコンマが続きます ( mapconcat)。

次に、領域が目的の結果に置き換えられます。

于 2013-11-28T01:53:10.497 に答える