如何复制从光标上方一行开始的行尾?

时间:2009-12-16 02:55:10

标签: elisp

我想复制光标上方的行,但只是从当前列复制到该行的末尾。

以下是插图:

photo of before action

photo of result of action

这是我的尝试,但效果并不好: - (

(defun dupchar()
  (save-excursion
    (line-move (-1) nil nil nil)
    (setq mychar (thing-at-point 'char))
    (insert mychar))

2 个答案:

答案 0 :(得分:1)

尝试这样的事情。

(defun dupchar ()
  (interactive)
  (let ((char-above (save-excursion
                      (line-move -1)
                      (following-char))))
    (unless (eq char-above ?\n)
      (insert char-above))))

(define-key global-map [(meta \")] 'dupchar)

关于你写的函数的一些评论:

  1. 您需要使用(interactive) 否则你无法绑定 功能键。

  2. 这不是一个好主意 随机setq创造的东西 全局变量。在这种情况下你 根本不需要变量;您 可以利用返回值 来自save-excursion。 (在后面的版本中,我需要使用let。)

  3. 括号中调用一个函数 (e)lisp,所以你需要使用-1 而不是(-1)

  4. 'line-move的第2至第4个参数将默认为nil,因此无需指定它们。

  5. (注意:我将其修改为在行尾停止;再次难以理解你写的内容,但这是我最好的猜测。)

答案 1 :(得分:0)

不确定您是否打算通过一次击键复制上一行的整个末尾。至少我认为这会有用,所以我将Nicholas(谢谢!)代码修改为dupline

(defun dupline ()
  (interactive)
  (let ((line-above-tail (save-excursion
                           (line-move -1)
                           (buffer-substring-no-properties (point) (line-end-position)))))
    (unless (eq line-above-tail ?\n)
      (insert line-above-tail))))

复制到该行的末尾的灵感来自How do I duplicate a whole line in Emacs?