Có tương đương với các lệnh thay thế kiểu sed từ vim không?


14

Một trong những điều tôi nhớ từ vim là có thể gõ lệnh thay thế sẽ hoạt động trên nhiều dòng, ví dụ:

:/begin/,/end/s/foo/bar/g

Lệnh trên thay thế "foo" cho "thanh" bắt đầu bằng dòng đầu tiên chứa "bắt đầu" và kết thúc bằng dòng tiếp theo sau đó có chứa "kết thúc".

Có cách nào để làm một cái gì đó tương tự trong emacs?

Câu trả lời:


7

evilcung cấp một phiên bản rút gọn của ex, vì vậy có lẽ tốt nhất là giả định rằng đó không phải là một phiên bản chính xác. Tuy nhiên, ví dụ bạn cung cấp hoạt động ngoài hộp, với điều kiện là điểm đó nằm trước dòng đầu tiên (nghĩa là begindòng trong ví dụ của bạn).


Trong vim, việc tìm kiếm cũng sẽ bắt đầu tại điểm, vì vậy nghe có vẻ giống như những gì tôi đang tìm kiếm. Cảm ơn!
Larry Coleman

8

Đây là một cách để làm điều đó chỉ sử dụng chức năng tích hợp:

  1. Với điểm trong dòng chứa lần xuất hiện đầu tiên begin, nhấn C-SPC.

  2. Di chuyển đến lần xuất hiện tiếp theo của end:

    C-s end RET

  3. Thay thế foobằng bar:

    M-% foo RET bar RET !

Điều này sử dụng thực tế query-replacesẽ hoạt động trên vùng hoạt động thay vì toàn bộ bộ đệm nếu có.


Tất nhiên, bạn cũng có thể xác định một lệnh tùy chỉnh:

(defun replace-from-to (beg end str repl)
  (interactive "sBegin: \nsEnd: \nsString: \nsReplacement: ")
  (save-excursion
    (goto-char (point-min))
    (let ((start-pos (search-forward beg))
          (end-pos (search-forward end)))
      (replace-string str repl nil start-pos end-pos))))

Lệnh này sẽ luôn tìm kiếm từ đầu bộ đệm, vì vậy điểm có thể là sau begin/ foo/ endkhi bạn gọi nó.

Thiết lập một ràng buộc chính cho nó thông qua:

(global-set-key (kbd "C-c r") 'replace-from-to)

5

Nói chung, đây là một cái gì đó mà bạn sẽ sử dụng narrow-to-regioncho.

Bạn di chuyển con trỏ (ví dụ: bằng cách tìm kiếm) đến đầu khu vực và nhấn C-SPC, sau đó di chuyển đến cuối khu vực và nhập M-x narrow-to-region. Bây giờ bạn có thể đưa ra bất kỳ lệnh tìm kiếm và thay thế nào bạn muốn và chúng sẽ chỉ áp dụng cho phần bị thu hẹp của bộ đệm. Khi bạn đã hoàn tất, hãy nhập M-x widenđể khôi phục nội dung bộ đệm.


4
Nếu begin/ endlà các dấu phân cách trong ngôn ngữ lập trình, bạn có thể sử dụng C-M-Spaceđể chạy mark-sexpđể chọn vùng trong một lệnh.
dgtized

1
Các ràng buộc mặc định: C-x n n( narrow-to-region) và C-x n w( widen).
itjeyd
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.