代码之家  ›  专栏  ›  技术社区  ›  ericteubert

与Vim的dd、o、o等效的Emacs

  •  26
  • ericteubert  · 技术社区  · 14 年前

    希望您能告诉我如何在emacs中镜像它们:)

    dd -删除整行,包括换行符,无论光标位于何处。

    我发现了一些类似的方法:

    C-a C-k C-k

    C-a 将光标移动到行的开头,即第一行 C-k 删除文本,第二个删除换行符。唯一的问题是,这不适用于只需要输入的空行 C-k 这是非常不方便的,因为我必须为同一个任务使用不同的命令:删除一行。

    o/o -在光标下方/上方创建新的空行,并将光标移动到正确缩进的新行

    好, C-a C-o 几乎是 O C-e C-o 在当前光标下方创建一条空行,但不移动光标。

    我的问题有没有更好的解决方案,或者我必须学习Lisp并定义新的命令来满足我的需求?

    7 回复  |  直到 14 年前
        1
  •  27
  •   seh Alexei    14 年前

    对于 o O ,以下是我多年前编写的几个函数:

    (defun vi-open-line-above ()
      "Insert a newline above the current line and put point at beginning."
      (interactive)
      (unless (bolp)
        (beginning-of-line))
      (newline)
      (forward-line -1)
      (indent-according-to-mode))
    
    (defun vi-open-line-below ()
      "Insert a newline below the current line and put point at beginning."
      (interactive)
      (unless (eolp)
        (end-of-line))
      (newline-and-indent))
    
    (defun vi-open-line (&optional abovep)
      "Insert a newline below the current line and put point at beginning.
    With a prefix argument, insert a newline above the current line."
      (interactive "P")
      (if abovep
          (vi-open-line-above)
        (vi-open-line-below)))
    

    你可以绑定 vi-open-line 就说, M-插入 详情如下:

    (define-key global-map [(meta insert)] 'vi-open-line)
    

    对于 dd ,如果您希望压井管线进入压井环,可以使用此功能 kill-line :

    (defun kill-current-line (&optional n)
      (interactive "p")
      (save-excursion
        (beginning-of-line)
        (let ((kill-whole-line t))
          (kill-line n))))
    

    为了完整性,它接受前缀参数并将其应用于 压井管线 ,因此它可以杀死比“当前”线更多的东西。

    您还可以查看 viper-mode 看看它是如何实现等效的 dd , o ,及 命令。

        2
  •  25
  •   tshepang Arrie    11 年前
    C+e C+j
    

    根据 the emacs manual docs . 这会得到一个新行和缩进。

        3
  •  24
  •   sanityinc    13 年前

    对于dd,使用“kill whole line”,在Emacs的最新版本中,默认情况下,它绑定到“C-S-backspace”。

    我应该补充一点,我自己用的 whole-line-or-region.el 更多时候,因为 C-w C-S-backspace

        4
  •  2
  •   Nifle Hassan Syed    14 年前

    你可以创建一个 macro bind it to a key sequence . 现在还不需要学习任何EmacLisp。

        5
  •  1
  •   Sean    14 年前

    以下是我如何解决Emacs缺少类似vi的“O”命令的问题:

    (defadvice open-line (around vi-style-open-line activate)
      "Make open-line behave more like vi."
      (beginning-of-line)
      ad-do-it
      (indent-according-to-mode))
    

        6
  •  1
  •   AA.    8 年前

    我知道,这个响应并不是直截了当的,但是像一个vim用户一样,我发现Spacemacs是从vim移动到emacs的功能最强大的emacs启动包。您可以将其配置为vim-like、emacs-like或hybrid。

    http://spacemacs.org/

    试试看。

        7
  •  0
  •   andreasw    14 年前