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

时间:2009-03-07 20:29:56

标签: emacs elisp

当我意识到我需要(编辑)上面一行的变量定义(或类似的东西)时,我经常发现自己在一条线上打字。我想要的是

  1. 从一行的任何位置按C-return,让光标移动到上面新插入的空白行,并使用正确的缩进(或至少与原始行相同)。
  2. 能够抓住任何文字......
  3. 和C-u C-space回到原来的位置
  4. 我成功地做了#1,但是我的emacs-fu还不够强大,无法完成剩下的工作。

3 个答案:

答案 0 :(得分:8)

这是我谦虚的解决方案:

(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)))

希望它有所帮助。

答案 1 :(得分:3)

如果你不是一名禅师,那么你可以做些什么。

Emacs有一个记录宏的东西,kmacro-start-macro和kmacro-end-macro。

录制宏后,执行name-last-kbd-macro。然后访问.emacs,并执行insert-kbd-macro。

然后你有一个定义你的宏的fset语句。它可能看起来很有趣,并且它不像elisp那样可维护,但是如果你把它填入你的.emacs中,那个宏(通过那个名字)将可用于你的任何编辑会话。您也可以将它绑定到键序列。

答案 2 :(得分:3)

回答我自己的问题可能是不好的形式,但Cheeso的回答促使我十年来第二次做一些lisp编程(我的原始版本是一个命名的键盘宏,但它遍布了kill / mark-rings )。这是我想出来的

(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-hacking很难被称为浪费时间: - )