Emacs命令在光标上方插入和缩进行

Emacs命令在光标上方插入和缩进行,emacs,elisp,Emacs,Elisp,当我意识到我需要在上面一行输入一个变量定义(或类似的东西)时,我经常会在一行上输入。我想做的是 从一行的任意位置按C-return键,将光标移动到上方新插入的空白行,缩进正确(或至少与原始行相同) 能够拖动任何文本 和C-u C-space返回到原始位置 我已经设法做到了#1,但我的emacs fu不够强壮,无法完成剩下的部分。如果你不是禅宗大师emacs的花花公子,你可以做些什么 Emacs有一个记录宏,即kmacro开始宏和kmacro结束宏 录制完宏后,请命名最后一个kbd宏。然后访问.e

当我意识到我需要在上面一行输入一个变量定义(或类似的东西)时,我经常会在一行上输入。我想做的是

  • 从一行的任意位置按C-return键,将光标移动到上方新插入的空白行,缩进正确(或至少与原始行相同)
  • 能够拖动任何文本
  • 和C-u C-space返回到原始位置

  • 我已经设法做到了#1,但我的emacs fu不够强壮,无法完成剩下的部分。

    如果你不是禅宗大师emacs的花花公子,你可以做些什么

    Emacs有一个记录宏,即kmacro开始宏和kmacro结束宏

    录制完宏后,请命名最后一个kbd宏。然后访问.emacs,插入kbd宏


    然后有一个定义宏的fset语句。它可能看起来很有趣,而且不像elisp那样可维护,但如果您将它塞进.emacs中,该宏(以该名称命名)将可用于任何编辑会话。您还可以将其绑定到密钥序列

    回答我自己的问题可能形式不好,但Cheeso的回答促使我在十年内第二次使用lisp编程(我最初的版本是命名键盘宏,但它跨越了kill/mark环)。这是我想到的

    (defun insert-and-indent-line-above ()
      (interactive)
      (push-mark)
      (let* 
        ((ipt (progn (back-to-indentation) (point)))
         (bol (progn (move-beginning-of-line 1) (point)))
         (indent (buffer-substring bol ipt)))
        (newline)
        (previous-line)
        (insert indent)))
    
    (global-set-key [ (control return) ] 'insert-and-indent-line-above)
    

    可能有很多更好的方法可以做到这一点,但两个小时的lisp黑客攻击很难被称为浪费时间:-)

    以下是我的简单解决方案:

    (defun my-insert-before-line ()
      (interactive)
      (save-excursion
        (beginning-of-line)
        ; I've changed the order of (yank) and (indent-according-to-mode)
        ; in order to handle the case when yanked line comes with its own indent
        (yank)(indent-according-to-mode)
        ; could be as well changed to simple (newline) it's metter of taste
        ; and of usage
        (newline-and-indent)))
    

    希望有帮助。

    很有趣。IIUC,您的解决方案使光标保持静止,并“自动拉”到上面正确缩进的线中。我认为这可能比我要求的更适合我的使用模式。谢谢:-)代码应该使用
    保存偏移
    ,应该避免使用
    yank
    ,并且应该在文本不在缓冲区末尾时进行常规处理(
    最大点
    )。@aaronhawley-为什么要“保存偏移”?我不会改变我正确处理的标记点,上面的代码几乎不会引起缓冲区的崩溃。你能更具体地说一下“当文本不在缓冲区的末尾时”的情况吗?无论何时点在调用的时候,它都会做同样的事情。我喜欢这个解决方案,但是我无法修改它以在终端上工作。关于如何实现这一点有什么想法吗?@Sambatyon不知道(终端+emacs+windows通常很痛苦,所以我倾向于避免它)。如果你问一个新问题,我相信有人会知道的……我几分钟前就想出来了。问题是终端模拟器没有发送正确的消息,我需要转到iTerm首选项并为cmd+enter添加一个keybinding来执行[13;5u]