So ersetzen Sie das aktuelle Wort unter dem Cursor in Emacs

25

Wie ersetze ich das aktuelle Wort unter dem Cursor in Emacs?

Ich weiß, dass ich query-replace oder replace-string verwenden kann, aber jedes Mal, wenn ich dies tue, muss ich den gesamten String eingeben, der ersetzt werden soll. Dies ist nur ärgerlich.

Vi hat ein äquivalentes Kommando cword und ich kann eine Abkürzung verwenden, um das Wort unter dem Cursor zum Ersetzen zu ziehen:

nmap <leader>z :%s#\<<C-r>=expand("<cword>")<CR>\>#

Weiß jemand, wie man es mit Emacs macht?

Denken Sie Pl
quelle

Antworten:

2

Verwenden copy-paste: M-d C-_ M-x replace-string RET C-y( kill-word, undo, replace-string, yank). Wenn Sie bereits den Ersatz gestartet haben, können Sie auf den ursprünglichen Puffer wechseln mit den üblichen Fenstern der Copy-Paste zu tun oder Schaltbefehle Puffer: M-x replace-string RET … C-x o M-d C-_ C-x o C-y. Sie können ein Präfixargument für M-d(z. B. ESC 4 2 M-d) verwenden, um mehrere Wörter zu ersetzen.

Wenn Sie vorhaben, ein oder mehrere Wörter am Cursor zu ersetzen, können Sie stattdessen mit der inkrementellen Suche ( C-s) C-wbeginnen und mit das Wort unter dem Cursor suchen. Drücken Sie dann M-%, um zu zu wechseln replace-string.

Gilles 'SO - hör auf böse zu sein'
quelle
26

Die inkrementelle Suche bietet diese Funktion, die Ersetzungsfunktionen jedoch nicht. Glücklicherweise inkrementelle Suche hat eine Möglichkeit haben , in den Modus zu ersetzen , sobald Sie einen Suchbegriff ausgewählt haben. So:

  • Drücken Sie C-s, um in den inkrementellen Suchmodus zu wechseln
  • Drücken Sie C-wdas aktuelle Wort in das Suchpuffer Sie reißen kann es gedrückt halten mehrere Wörter anzuhängen, und Sie können auch verwenden , C-M-yeinzelne Zeichen zerren zu und C-yganze Zeilen zerren
  • Drücken Sie in M-%den Modus mit der Suche ersetzen Puffer Sie bereits aufgebaut haben

Wie Sie wahrscheinlich aus der M-%normalen Verwendung wissen , handelt es sich um einen Abfrageaustauschmodus, in dem Sie aufgefordert werden, was mit jeder Übereinstimmung zu tun ist. Wenn Sie nur alle ersetzen möchten, treffen Sie !auf das erste Spiel

Michael Mrozek
quelle
9
;; query-replace current word
(defun qrc (replace-str)
   (interactive "sDo query-replace current word with: ")
   (forward-word)
   (let ((end (point)))
      (backward-word)
      (kill-ring-save (point) end)
      (query-replace (current-kill 0) replace-str) ))
Emanuel Berg
quelle
1
Diese Lösung funktioniert gut und ist viel nützlicher, als wenn man ihnen erklärt, wie man es manuell macht. Ich bin viel zu faul, um mich mit dem Kopieren und Einfügen zu beschäftigen.
Paul Coccoli
2

Ich bin absolut neu in Emacs, aber ich kann Folgendes vorschlagen:

M-b       to move backward over a word
M-d       to kill up to the end of the word

Jetzt können Sie ein neues Wort schreiben. Funktioniert fast wie cwin vim

2r2w
quelle
1

Wenn Sie in das Suchen und Ersetzen wechseln, indem Sie M-S-%nur M-ndas Wort unter dem Cursor eingeben, wird es durch erneutes Drücken in "Symboltrennzeichen" eingeschlossen.

dolzenko
quelle
1

Ich hatte Probleme und wollte dasselbe, seit ich von Vim zu Emacs gezogen bin.

Nach einigen Nachforschungen und Experimenten habe ich die folgende Funktion entwickelt, mit der Sie dasselbe mit dem installierten Evil-Paket oder mit Spacemacs tun können.

Es funktioniert auch mit aktivierter Region (oder visueller Auswahl in vim Begriff) und das kann sehr nützlich sein, um ein Wort wie abc-def-hij zu ersetzen:

; replace current word or selection using vim style for evil mode
(defun evil-replace-word-selection()
(interactive)
(if (use-region-p)
    (let (
            (selection (buffer-substring-no-properties (region-beginning) (region-end))))
        (if (= (length selection) 0)
        (message "empty string")
        (evil-ex (concat "'<,'>s/" selection "/"))
        ))
    (evil-ex (concat "%s/" (thing-at-point 'word) "/"))))

Definieren Sie dann in Ihrem Init.el die gleiche Schlüsselbindung:

(global-set-key (kbd "\C-co") 'evil-replace-word-selection)

Die Tastenbelegung unterscheidet sich ein wenig von der von vim, nämlich "space z", aber ich habe nicht herausgefunden, wie ich das in Emacs abbilden kann, wenn der böse Modus vorhanden ist. beschwere dich weiterhin nicht über ein Präfix etc und ich bin relativ neu bei Emacs. Aber immer noch nicht schlecht und ich bin im Moment mit dieser Lösung zufrieden.

Xiaoming Wu
quelle
0

Dies wurde bereits beantwortet und ich kann keinen Kommentar abgeben, da ich noch nicht genug Ruf habe. Aber was Sie suchen, ist ciwin vim.

In Emacs ist mir diese Kombination am nächsten gekommen:

M-b M-d

Dies kehrt zum Anfang des Wortes zurück, auf dem sich der Cursor befindet, und löscht das Wort.

Jamesy Dimmick May
quelle