5

コマンド「backward-word」と「backward-kill-word」の動作に小さな問題があります。空白のみの行 (たとえば、インデントされた行の最初の文字) で「backward-kill-word」を押すと、コマンドはすべての空白と最後の単語を削除します。前の行。

この動作は、私にとって完全に直感的ではありません。たとえば、「backward-kill-word」を最初に押すと、行の先頭まで空白文字が削除され、前の行の末尾に移動します。次のヒットでのみ、行末から単語を削除し始めます。

ほとんどのアプリケーションでは、この動作がデフォルトであると確信しています (おそらく慣れているため、より直感的であるように見えますが、よくわかりません)。 Emacs がこの動作をするように構成する方法。残念ながら、Googleでいくつか検索しても何も見つかりませんでした。

ありがとう

編集:

答えてくれてありがとう(私が求めたことを実行するelispコードを含む)。

明らかに、forward-kill-word と移動コマンドで同じ問題が発生します。動作を変更するための構成可能なフラグが emacs にあることを望んでいましたが、これらの elisp 関数を使用するだけのようです。これらのコマンドのデフォルトの移動と殺害コマンドを再バインドします。

4

6 に答える 6

5

これはどう:

(defun my-backward-kill-word ()
  "Kill words backward my way."
  (interactive)
  (if (bolp)
      (backward-delete-char 1)
    (if (string-match "^\\s-+$" (buffer-substring (point-at-bol) (point)))
        (kill-region (point-at-bol) (point))
      (backward-kill-word 1))))
于 2009-01-17T12:54:10.967 に答える
1

この場合、M-\ (delete-horizo​​ntal-space) を試すことができます。これは、最初のキー押下に対して必要なことを行います。この 2 つを組み合わせる関数が本当に必要な場合は、カーソルの前の現在の行にスペース以外の文字があるかどうかをチェックする関数を作成し、それに基づいてどちらか一方を呼び出すのはそれほど難しくありません。

于 2009-01-17T10:12:25.193 に答える
1

これは非常に大きな問題です。emacs の Lisp プログラミングを調べて、それに関するいくつかのことを学ばなければなりません。ここから始めることをお勧めします:ガラガラヘビのemacsチュートリアル、そしてそれを通してあなたの方法で作業してください。

参考までに、TAGS ファイルを見ると、backward-word が simple.el で定義されており、次の形式になっていることがわかります。

(defun 後方ワード (&optional arg)

「単語の先頭に到達するまで後方に移動します。引数を使用して、これを何度も行います。」

(インタラクティブな「p」)

(forward-word (- (または arg 1))))

したがって、次のステップは、この呼び出しに if を追加することです。

于 2009-01-17T10:21:21.540 に答える
1

これはそれを行う必要があります:

(defun eclipse-kill-word (repeat)
  "Redefine `backward-kill-word' to work as Eclipse does.

Now stops at the beginning of the line, deleting only whitespace."
  (interactive "p")
  (let (cnt)
    (dotimes (cnt repeat)
      (if (= (point) (save-excursion (beginning-of-line) (point)))
          (kill-region (point) (save-excursion (backward-word) (point)))
        (kill-region (point)
                     (max (save-excursion (beginning-of-line) (point))
                          (save-excursion (backward-word) (point))))))))

プレフィックス キー (Ctrl-U) を使用して繰り返し使用できるという追加の利点があります。

于 2009-01-17T14:21:55.987 に答える
0

目的の動作を得るために、viper のいくつかの関数を再利用できます。

(setq viper-mode nil)
(require 'viper)

(defun viper-delete-word (arg)
  "Delete word."
  (interactive "p")
  (save-excursion
    (push-mark nil t)
    (viper-forward-word arg)
    (delete-region (point) (mark t))
    (pop-mark)))

(defun viper-delete-backward-word (arg)
  "Delete previous word."
  (interactive "p")
  (save-excursion
    (push-mark nil t)
    (viper-backward-word arg)
    (delete-region (point) (mark t))
    (pop-mark)))

(global-set-key [C-left] 'viper-backward-word)
(global-set-key [C-right] 'viper-forward-word)
(global-set-key [C-delete] 'viper-delete-word)
(global-set-key [C-backspace] 'viper-delete-backward-word)
于 2014-08-28T21:54:50.883 に答える
0

cc-modeには、空腹の削除のオプションがあり、次のように有効にできます。

(add-hook 'c-mode-common-hook (lambda () (c-toggle-auto-hungry-state 1)))

明らかに、これは C、C++、Java などのファイルにのみ適用され、バックスペース キーに適用されます (単語の削除ではありません)。

于 2009-04-15T20:10:02.443 に答える