Cách thay thế từ hiện tại dưới con trỏ trong Emacs


25

Làm cách nào để thay thế từ hiện tại dưới con trỏ trong Emacs?

Tôi biết rằng tôi có thể sử dụng thay thế truy vấn hoặc thay thế chuỗi nhưng mỗi lần tôi làm như vậy tôi phải nhập toàn bộ chuỗi để được thay thế, điều này thật khó chịu.

Vi có mật khẩu lệnh tương đương và tôi có thể sử dụng phím tắt để kéo từ dưới con trỏ để thay thế:

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

Bất cứ ai cũng biết làm thế nào với Emacs?


Câu trả lời:


2

Sử dụng sao chép-dán: M-d C-_ M-x replace-string RET C-y( kill-word, undo, replace-string, yank). Nếu bạn đã bắt đầu thay thế, bạn có thể chuyển về bộ đệm ban đầu để thực hiện sao chép-dán với cửa sổ thông thường hoặc các lệnh chuyển đổi bộ đệm : M-x replace-string RET … C-x o M-d C-_ C-x o C-y. Bạn có thể sử dụng một đối số tiền tố trên M-d(ví dụ ESC 4 2 M-d) để thay thế nhiều từ.

Nếu bạn dự định thay thế một hoặc nhiều từ tại con trỏ, thay vào đó bạn có thể bắt đầu từ tìm kiếm gia tăng ( C-s), sử dụng C-wđể bắt đầu tìm kiếm từ dưới con trỏ, sau đó nhấn M-%để chuyển sang replace-string.


26

Tìm kiếm gia tăng có tính năng này, nhưng các chức năng thay thế thì không. May mắn thay, tìm kiếm gia tăng không có một cách để chuyển sang thay thế chế độ khi bạn đã chọn một thuật ngữ tìm kiếm. Vì thế:

  • Nhấn C-sđể chuyển sang chế độ tìm kiếm gia tăng
  • Nhấn C-wđể kéo từ hiện tại vào bộ đệm tìm kiếm Bạn có thể tiếp tục nhấn từ đó để nối thêm nhiều từ và bạn cũng có thể sử dụng C-M-yđể kéo từng ký tự riêng lẻ và C-yđể kéo toàn bộ dòng
  • Nhấn M-%để chuyển sang chế độ thay thế bằng bộ đệm tìm kiếm bạn đã tạo

Như bạn có thể biết từ việc sử dụng M-%bình thường, đây là chế độ thay thế truy vấn, nơi nó sẽ nhắc bạn phải làm gì với mỗi trận đấu. Nếu bạn chỉ muốn thay thế tất cả, hãy đánh !vào trận đầu tiên


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
Giải pháp này hoạt động độc đáo và hữu ích hơn nhiều so với việc được hướng dẫn cách thực hiện thủ công. Tôi quá lười biếng để bị làm phiền với sao chép và dán.
Paul Coccoli

2

Tôi hoàn toàn mới với emacs nhưng tôi có thể đề xuất như sau:

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

Bây giờ bạn có thể viết một từ mới. Hoạt động gần giống như cwtrong vim


1

Nếu bạn đi vào tìm kiếm và thay thế bằng M-S-%cách chỉ cần M-nđiền vào từ dưới con trỏ, nhấn lại nó sẽ bọc nó trong "dấu phân cách biểu tượng".


1

Tôi đã vật lộn và muốn điều tương tự kể từ khi chuyển từ Vim sang Emacs.

Sau một số nghiên cứu và thử nghiệm, tôi đã tìm ra chức năng dưới đây cho phép bạn thực hiện điều tương tự với gói Evil được cài đặt hoặc sử dụng spacemacs.

Nó cũng hoạt động với vùng hoạt động (hoặc lựa chọn trực quan theo thuật ngữ vim) và điều đó có thể khá hữu ích để thay thế từ như 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) "/"))))

sau đó trong init.el của bạn, xác định ràng buộc khóa tương tự:

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

keybinding hơi khác so với vim là "space z" nhưng tôi chưa tìm ra cách ánh xạ nó trong emacs khi chế độ tà ác ở đó. tiếp tục phàn nàn không phải là tiền tố, v.v. và tôi còn khá mới với emacs. Nhưng vẫn không quá tệ và bản thân tôi hài lòng với giải pháp này vào lúc này.


0

Điều này đã được trả lời và tôi không thể bình luận vì tôi chưa có đủ danh tiếng. Nhưng những gì bạn đang tìm kiếm là ciwtrong vim.

Trong emacs gần nhất tôi đã đến là sự kết hợp này:

M-b M-d

Điều này quay trở lại từ đầu của con trỏ đang bật và sau đó xóa từ đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.