27

私は現在emacsで遊んでいて、ほとんどの概念に満足しています。しかし、私は3つのvimコマンドの便利さを本当に気に入っていました:dd、o、Oうまくいけば、emacsでそれらをミラーリングする方法を教えてください:)

dd-カーソルがどこにあっても、改行を含む行全体を削除します。

私はトリックをするのに似た何かを見つけました:

Ca Ck Ck

カーソルを行の先頭に移動している間C-a、最初のカーソルC-kはテキストを削除し、2番目のカーソルは改行を削除します。唯一の問題は、これが空の行で機能しないことです。入力するだけC-kで、同じタスクに別のコマンドを使用する必要があるため、非常に不便です。行を強制終了します。

o / O-カーソルの下/上に新しい空の行を作成し、カーソルを新しい行に移動して、正しくインデントします

まあ、C-a C-oほとんどのようですO、ただ識別が欠落しています。C-e C-o現在の下に空の行を作成しますが、カーソルは移動しません。

私の問題に対するより良い解決策はありますか、それともLispを学び、私のニーズを満たすために新しいコマンドを定義する必要がありますか?

4

7 に答える 7

27

とのためoO、ここに私が何年も前に書いたいくつかの関数があります:

(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-insertにバインドできます。

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

完全を期すために、プレフィックス引数を受け入れてそれをに適用しkill-line、「現在の」行よりもはるかに多くを強制終了できるようにします。

ソースをviper-mode見て、同等の、、、およびコマンドがどのように実装されているかを確認することddoできOます。

于 2010-01-31T21:20:32.117 に答える
25
C+e C+j

emacsのマニュアルドキュメントによると。これにより、新しい行とインデントが得られます。

于 2012-03-17T01:41:45.363 に答える
24

ddには、「kill-whole-line」を使用します。これは、最近のバージョンのEmacsではデフォルトで「CS-backspace」にバインドされています。

を入力する方が簡単なので、私自身もwhole-line-or-region.elを頻繁に使用することを付け加えておきます。C-wC-S-backspace

于 2010-02-01T13:52:17.220 に答える
2

マクロを作成して、それをキーシーケンスにバインドすることができます。まだemacslispを学ぶ必要はありません。

于 2010-01-31T21:15:25.967 に答える
1

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

これが整っているので、viの「o」コマンドの対応するバージョンの必要性を実際に感じたことはありません。CnCoがそのトリックを行います。

「dd」コマンドに関しては、最初は少しすりおろしましたが、やがてEmacsのやり方にたどり着きました。とにかく、一度に複数の行を削除したい場合は、よくあることですが、リージョンを使用して削除します(Ca C-SPC、削除したいテキストのもう一方の端、Cwに移動します)。または、削除したい行数を目で確認できる場合は、たとえば、M-9Ckで一度に9行削除します。

于 2010-01-31T21:43:09.710 に答える
1

私は知っていますが、この応答は的を射たものではありませんが、vimユーザーのように、Spacemacsがvimからemacsに移行するための最も機能的なemacsスターターパックであることがわかりました。vim like、emacs like、またはhybridになるように構成できます。

http://spacemacs.org/

試してみる。

于 2015-11-25T01:57:39.900 に答える
0

ViperモードVimpulse、またはVimモードを使用するだけです。Emacsのキーバインディングは人間工学的ではありません。

于 2010-01-31T21:49:56.590 に答える