5 Stimmen

Änderung des Verhaltens von backward-word und backward-kill-word

Ich habe ein kleines Problem mit der Art und Weise, wie die Befehle "backward-word" und "backward-kill-word" funktionieren. Wenn ich in einer Zeile, die nur aus Leerzeichen besteht (z. B. das erste Zeichen einer eingerückten Zeile), auf "backward-kill-word" drücke, löscht der Befehl alle Leerzeichen und auch das letzte Wort der vorherigen Zeile.

Dieses Verhalten ist für mich völlig unintuitiv. Ich bevorzuge zum Beispiel die Funktionsweise von Eclipse, das beim ersten Drücken von "backward-kill-word" die Leerzeichen bis zum Zeilenanfang löscht, beim nächsten Drücken zum Ende der vorherigen Zeile springt und erst dann damit beginnt, Wörter am Ende der Zeile zu löschen.

Ich bin mir ziemlich sicher, dass dieses Verhalten in den meisten Anwendungen Standard ist (da es intuitiver zu sein scheint, was wahrscheinlich daran liegt, dass ich daran gewöhnt bin, aber ich bin mir nicht sicher), also frage ich mich, ob es eine Möglichkeit gibt, Emacs so zu konfigurieren, dass es dieses Verhalten auch hat. Ein paar Suchen bei Google haben leider nichts ergeben.

Gracias

EDIT:

Vielen Dank für die Antworten (einschließlich des Elisp-Codes, der genau das tut, wonach ich gefragt habe).

Das gleiche Problem tritt natürlich auch bei forward-kill-word und den Bewegungsbefehlen auf, und ich hatte gehofft, dass es ein konfigurierbares Flag in emacs gibt, um das Verhalten zu ändern, aber es sieht so aus, als würde ich einfach diese elisp-Funktionen nehmen und die Standard-Bewegungs- und Tötungsbefehle für diese neu binden.

5voto

scottfrazer Punkte 16641

Wie wäre es damit:

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

1voto

David Hanak Punkte 10304

In diesem Fall sollten Sie es mit M-\ (delete-horizontal-space) versuchen, das beim ersten Tastendruck genau das tut, was Sie wollen. Und wenn Sie wirklich eine Funktion brauchen, die beide kombiniert, sollte es nicht allzu schwer sein, eine zu schreiben, die prüft, ob es in der aktuellen Zeile vor dem Cursor irgendwelche Nicht-Leerzeichen gibt, und je nachdem die eine oder die andere Funktion aufruft.

1voto

howlingmadhowie Punkte 63

Das ist eine ziemlich große Frage. Sie müssen sich mit der Emacs-Lisp-Programmierung beschäftigen und einiges darüber lernen. ich würde vorschlagen, hier anzufangen: klapperschlange emacs tutorial und arbeiten Sie sich da durch.

nur zu Ihrer Information, ein Blick in meine TAGS-Datei sagt mir, dass backward-word in simple.el definiert ist und die folgende Form hat:

(defun Rückwärts-Wort (&optional arg)

"Gehen Sie rückwärts, bis Sie auf den Anfang eines Wortes stoßen. Mit Argumenten, machen Sie dies so oft."

(interaktives "p")

(Vorwärts-Wort (- (oder arg 1))))

Der nächste Schritt wäre also, diesen Aufruf um ein if zu ergänzen.

1voto

Joe Casadonte Punkte 14548

Das sollte genügen:

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

Hat den zusätzlichen Vorteil, dass er mit der Präfix-Taste (Strg-U) wiederholt werden kann.

0voto

Trey Jackson Punkte 72000

Hinweis, in cc-mode gibt es eine Option für hungriges Löschen, die Sie wie folgt aktivieren können:

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

Dies gilt natürlich nur für die C-, C++-, Java-,... Dateien und bezieht sich auf die Rückschritttaste (nicht auf das Löschen von Wörtern).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X