Emacsでカーソルの下の現在の単語を置き換える方法


25

Emacsでカーソルの下の現在の単語を置き換えるにはどうすればよいですか?

私はquery-replaceまたはreplace-stringを使用できることを知っていますが、そのたびに置換する文字列全体を入力する必要があり、これは単に迷惑です。

Viには同等のコマンドcwordがあり、ショートカットを使用してカーソルの下の単語をプルして置換できます。

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

誰もがEmacsでそれを行う方法を知っていますか?


回答:


2

使用して、コピー&ペースト:M-d C-_ M-x replace-string RET C-ykill-wordundoreplace-stringyank)。すでに交換を開始している場合は、元のバッファーに切り替えて、通常のウィンドウまたはバッファー切り替えコマンドを使用してコピーと貼り付けを実行できますM-x replace-string RET … C-x o M-d C-_ C-x o C-y。複数の単語を置き換えるためにM-d(例えばESC 4 2 M-d)の前置引数を使用できます。

カーソルの1つ以上の単語を置換する場合は、代わりにインクリメンタル検索(C-sC-wから開始し、を使用してカーソルの下の単語の検索を開始し、を押しM-%てに切り替えreplace-stringます。


26

インクリメンタル検索にはこの機能がありますが、置換機能にはありません。幸いなことに、インクリメンタル検索で、検索語を選択すると置換モードに切り替えることができます。そう:

  • 押しC-sてインクリメンタル検索モードに切り替えます
  • を押しC-wて、現在の単語を検索バッファにヤンクします。それを押し続けると、複数の単語を追加できます。また、C-M-y個々の文字C-yをヤンクしたり、行全体をヤンクしたりすることもできます。
  • を押しM-%て、構築済みの検索バッファを使用して置換モードに切り替えます

おそらくM-%通常の使用からわかるように、これはクエリ置換モードであり、各一致で何をするかを尋ねられます。それらをすべて置き換えたい場合!は、最初の一致をヒットします


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

1
このソリューションはうまく機能し、手動で行う方法を説明するよりもはるかに便利です。コピーアンドペーストに悩むのは面倒です。
ポールコッコリ

2

私はemacsを初めて使用しますが、次のことを提案できます。

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

これで、新しい単語を書くことができます。ほとんどcwvimのように動作します


1

カーソルの下の単語M-S-%M-n塗りつぶすだけで検索と置換を行う場合、もう一度押すと、「シンボル区切り文字」でラップされます。


1

VimからEmacsに移行して以来、私は苦労して同じことを望んでいました。

いくつかの調査と実験を行った後、Evilパッケージがインストールされているか、spacemacsを使用して同じことを実行できる機能を以下に示しました。

また、アクティブな領域(またはvim用語での視覚的な選択)でも機能し、abc-def-hijのような単語を置き換えるのに非常に役立ちます。

; 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) "/"))))

次に、init.elで同じキーバインディングを定義します。

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

キーバインドは「スペースz」であるvimのものとは少し異なりますが、邪悪なモードがあるときにemacsでそれをマッピングする方法がわかりません。接頭辞などではなく文句を言い続けると私はemacsに比較的新しいです。しかし、それでもそれほど悪くはないので、私は現時点でこのソリューションに満足しています。


0

これはすでに回答済みで、まだ評判が足りないのでコメントできません。しかし、あなたが探しているのciwはvimです。

emacsで最も近いのはこの組み合わせです:

M-b M-d

これは、カーソルが置かれている単語の先頭に戻り、その単語を削除します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.