1

I want to replace a character inside a word, so I wrote:

(setq regexp "[ab]")
(and (re-search-backward regexp nil t 1)
     (replace-match "c"))

This replaces a or b to c as I wish, but I want to set a bound of it. There is a BOUND option with re-search-backward. How can I make the match only a word that is under the current cursor?

Thanks for @jackson I can write the function, but still it doesn't work properly.

(setq regexp ".*[ab].*")
(defun test-it ()
  (interactive)
  (save-excursion
    (save-restriction
      (narrow-to-region (progn (backward-word) (point))
                        (progn (forward-word) (point)))
      (and (re-search-backward regexp)
           (replace-match "c")))))

Thins function replaces ab to ac and ad to cd as I expected, but it doesn't replace ac to cc. Why?

6
  • Out of curiosity, are you implement some sort of auto-correction here? Nov 12, 2015 at 19:21
  • I want make a pinyin (Chinese tone mark) input mode. like ma -> mǎ. So I want to replace aāáà to ǎ by a function. I can write it separatey by using ("a" "ǎ") ("ā" "ǎ") ("á" "ǎ") ("à" "ǎ"). But I thought it is a bit redundant.
    – ironsand
    Nov 12, 2015 at 19:35
  • Yay, finally a chinese introduction lesson I took years ago helps me tell that this has something to do with mother and horse :) I don't understand or type in Chinese, but have you looked at set-input-method and toggle-input-method? Nov 12, 2015 at 20:01
  • Also, is this for an occcasional phonetics correction? If not, you can probably modify the solution here for fixing double caps to always "autocorrect" based on custom rules like ma* to , ma- to , ma` to , and so on. Nov 12, 2015 at 20:05
  • As far as I know these two method are intended someone who can type Chinese, right? I want to make a minor mode for the phonetics notation.
    – ironsand
    Nov 12, 2015 at 20:08

1 Answer 1

2

Not quite sure what you're asking. If you're using re-search-backward because you want to include the beginning of the word that encompasses the point, perhaps this does what you want:

(setq regexp ".*[ab].*")
(defun test-it ()
  (interactive)
  (save-excursion
    (save-restriction
      (narrow-to-region (progn (backward-word 1) (point))
                        (progn (forward-word 1) (point)))
      (backward-word 1)
      (if (looking-at regexp)
          (replace-match "frog")))))

The code is a bit clumsy, but will replace the regexp with the given string if it matches.

2
  • Thanks for your help! I changed your code a little because I want to search the string backward from the (point). But my code have still a problem, it would be very nice if you can take a glance at it.
    – ironsand
    Nov 12, 2015 at 20:17
  • 1
    I changed the regexp to be .*[ab].* - you probably don't want the .* - I did because I was checking to see if the entire word would be replaced. You're just replacing a single character. Nov 12, 2015 at 20:45

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.