1

ELispの学習の一環として、現在行の下に現在行のコピーを作成する(行を複製する)関数を作成しようとしています。これまでのところ、バッファの最後の行を除いて、かなりうまく機能しています。最後の行にある場合、その行は行の下ではなく行の最後に貼り付けられます。

これが私のコードです:

(defun duplicate-line ()
  "duplicate the current line"
  (interactive)
  (save-excursion
    (kill-ring-save (line-beginning-position) (line-beginning-position 2))
    (goto-char (line-beginning-position 2)) ; goto the start of the next line
    (yank)
   )
  (next-line)
)

これを行うより良い方法はありますか?また、elisp の記述に関するその他のアドバイスもいただければ幸いです。

4

2 に答える 2

2

代わりに次のことができます。

(kill-whole-line)
(yank)
(yank)

同じ効果に。しかし、おそらく、そのような関数を作成する場合は、行がキルリングにコピーされないようにする必要があります。通常、行を複製する必要がある場合は、そこに配置したくありません。

于 2012-10-30T13:57:41.213 に答える
2

これは、最後の行が改行文字で終わっていない場合にのみ発生すると思います。

次の関数は、必要に応じて改行を挿入し、キルリングの使用を回避します。

(defun duplicate-line ()
  (interactive)
  (let* ((pos-end (line-beginning-position 2))
         (line    (buffer-substring (line-beginning-position) pos-end)))
    (goto-char pos-end)
    (unless (bolp) (newline))
    (save-excursion ;; leave point before the duplicate line
      (insert line))))
于 2012-10-30T14:30:00.493 に答える