Чи є еквівалент командам заміщення у стилі sed від vim?


14

Одне з речей, які мені не вистачає від vim, - це можливість ввести команду заміщення, яка працюватиме над декількома рядками, наприклад:

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

Наведена вище команда замінює "foo" на "bar", починаючи з першого рядка, що містить "start" і закінчуючи наступним рядком після того, що містить "end".

Чи є спосіб зробити щось подібне в emacs?

Відповіді:


7

evilнадає скасовану версію ex, тому, мабуть, найкраще припустити, що це не точне випадання. Однак приклад, який ви подали, працює з поля, за умови, що точка знаходиться перед першим рядком (тобто beginрядком у вашому прикладі).


In vim пошук також розпочнеться в точці, так що це звучить як те, що я шукав. Спасибі!
Ларрі Коулман

8

Ось один із способів зробити це, який використовує лише вбудований функціонал:

  1. beginНатисніть на точку в рядку, який містить перший випадок , натисніть C-SPC.

  2. Перейти до наступного виникнення end:

    C-s end RET

  3. Замінити fooна bar:

    M-% foo RET bar RET !

Це використовує той факт, що він query-replaceбуде працювати на активній області замість всього буфера, якщо такий є.


Звичайно, ви також можете визначити спеціальну команду:

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

Ця команда завжди шукатиме з початку буфера, тому точка може бути після begin/ foo/ endколи ви викликаєте її.

Встановіть прив'язку ключів до нього за допомогою:

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

5

Взагалі, це те, що ви б використали narrow-to-region.

Ви переміщуєте курсор (наприклад, шляхом пошуку) на початок регіону і натискаєте C-SPC, а потім переміщуєте до кінця регіону та вводите M-x narrow-to-region. Тепер ви можете видавати будь-які команди пошуку та заміни, які хочете, і вони застосовуватимуться лише до звуженої частини буфера. Після завершення введіть, M-x widenщоб відновити вміст буфера.


4
Якщо begin/ endє роздільниками мови програмування, ви можете скористатися C-M-Spaceдля запуску, mark-sexpщоб вибрати область в одній команді.
занотувано

1
Прив'язки за замовчуванням: C-x n n( narrow-to-region) та C-x n w( widen).
itsjeyd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.