วิธีการแทนที่คำปัจจุบันภายใต้เคอร์เซอร์ใน Emacs


25

ฉันจะแทนที่คำปัจจุบันภายใต้เคอร์เซอร์ใน Emacs ได้อย่างไร

ฉันรู้ว่าฉันสามารถใช้ query-replace หรือ replace-string ได้ แต่ทุกครั้งที่ทำเช่นนั้นฉันต้องพิมพ์สตริงทั้งหมดเพื่อแทนที่นี่เป็นเรื่องน่ารำคาญ

Vi มี cword คำสั่งที่เทียบเท่าและฉันสามารถใช้ทางลัดเพื่อดึงคำใต้เคอร์เซอร์แทน:

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

ใครรู้วิธีการทำกับ Emacs?


คำตอบ:


2

ใช้ copy-paste: M-d C-_ M-x replace-string RET C-y( kill-word, undo, replace-string, yank) หากคุณได้เริ่มต้นแล้วเปลี่ยนคุณสามารถเปลี่ยนกลับไปเป็นกันชนเดิมที่จะทำสำเนาวางกับหน้าต่างปกติหรือ buffer M-x replace-string RET … C-x o M-d C-_ C-x o C-yคำสั่งสลับ: คุณสามารถใช้อาร์กิวเมนต์นำหน้าบนM-d(เช่นESC 4 2 M-d) เพื่อแทนที่คำหลายคำ

หากคุณกำลังวางแผนที่จะแทนที่หนึ่งหรือมากกว่าหนึ่งคำที่เคอร์เซอร์คุณแทนสามารถเริ่มต้นจากการค้นหาที่เพิ่มขึ้น ( C-s) ใช้C-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
โซลูชันนี้ทำงานได้ดีและมีประโยชน์มากกว่าการบอกวิธีการทำด้วยตนเอง ฉันขี้เกียจเกินไปที่จะใส่ใจกับการคัดลอกและวาง
พอล Coccoli

2

ฉันใหม่สำหรับ emacs แต่ฉันสามารถแนะนำสิ่งต่อไปนี้:

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

ตอนนี้คุณสามารถเขียนคำใหม่ ทำงานเหมือนcwในกลุ่ม


1

หากคุณเข้าสู่การค้นหาและแทนที่ด้วยM-S-%เพียงแค่M-nเติมคำในเคอร์เซอร์ภายใต้การกดอีกครั้งมันห่อใน "สัญลักษณ์ตัวคั่น"


1

ฉันกำลังดิ้นรนและต้องการสิ่งเดียวกันตั้งแต่ย้ายจาก Vim เป็น Emacs

หลังจากการวิจัยและการทดลองฉันมาถึงฟังก์ชั่นด้านล่างซึ่งอนุญาตให้คุณทำสิ่งเดียวกันกับที่ติดตั้งแพ็คเกจชั่วร้ายหรือใช้ Spacemacs

นอกจากนี้ยังทำงานร่วมกับภูมิภาคที่ใช้งาน (หรือการเลือกภาพในคำที่เป็นกลุ่ม) และที่ค่อนข้างมีประโยชน์ในการแทนที่คำเช่น 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)

ปุ่มลัดนั้นแตกต่างจากกลุ่มที่เรียกว่า "space z" เล็กน้อย แต่ฉันไม่ได้คิดวิธีแมปใน emacs เมื่อโหมดชั่วร้ายอยู่ที่นั่น อย่าบ่นไปเรื่อย ๆ และฉันก็ค่อนข้างใหม่กับ emacs แต่ก็ยังไม่เลวและตัวฉันเองก็มีความสุขกับการแก้ปัญหาในตอนนี้


0

สิ่งนี้ได้รับคำตอบแล้วและฉันไม่สามารถแสดงความคิดเห็นได้เพราะฉันยังมีชื่อเสียงไม่พอ แต่สิ่งที่คุณกำลังมองหาอยู่ciwในกลุ่ม

ใน emacs ที่ใกล้เคียงที่สุดที่ฉันเคยมาคือชุดค่าผสมนี้:

M-b M-d

สิ่งนี้จะกลับไปที่จุดเริ่มต้นของคำที่เคอร์เซอร์เปิดอยู่แล้วลบคำนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.