文本替换的lisp语句

新手小白,查了论坛的搜索替换的帖子,多数讲的是交互式替换,需要输入搜索的词然后按回车,然后再替换。

我想实现的是中文文本的文件预处理,想在config.el里写一个简单的函数,实现类似vim的功能批量替换:

:%s/错字1/正字1/g :%s/错字2/正字2/g :%s/错字3/正字3/g

:%s/ //g (去文内空格)

其中「错字」和「正字」直接写到程序里,不用交互,直接执行。谢谢大佬!

M-:

(replace-regexp “错字” “正字”)

谢谢,原来语句这样简单,我尝试了,但不成功。

将下列语句写入config.el(doom的配置文件),但在emacs里面M-x调用不出cuozi-all:

(defun cuozi-all ()

(replace-regexp “為” “爲”)

(replace-regexp “裡” “裏”)

)

请问该怎样调用呢?

能够被M-x调用的只能是interactive function. 还有replace-regexp本来就是交互函数。

每次M-x調用replace-regexp也可以達成目的,上面是想做成批處理,一次處理十來個替換。謝謝!

如果你想在文件中通过M-x调用一个函数然后替换所有错字,这个过程本身就是交互的,为什么不直接使用M-%进行交互替换。

需要处理的文本文件数量多,每次一个一个的M-x调用,比较麻烦,做一个批处理,用一个命令处理就方便多了。

比如,文字校对工作的场景。

谢谢提醒,增加了一句 (interactive),可以在M-x调用了,能替换本行的错字,但还不能全文替换。

(defun cuozi-all ()

(interactive)

(replace-regexp “為” “爲”)

(replace-regexp “裡” “裏”)

)

写了一个函数,应该满足你的需求。

correct

M-x运行后选择需要处理的文件。repl-file文件放 正字和错字的pair,用空格区分,每对一行。

(defun my-correct-all-misprint (file)
  (interactive "fchoose a file to be corrected: ")
  (let ((repl-file "~/replace.txt")
	    (repl-list '()))
     (with-temp-buffer
       (insert-file-contents repl-file)
       (goto-char (point-min))
       (while (< (point) (point-max))
	     (setq repl-pair (split-string (thing-at-point 'line) "[ \f\t\n\r\v]+" t "[ \f\t\n\r\v]+"))
	     (if (null repl-pair)
	         (next-line)
	       (next-line)
	       (setq repl-list (append repl-list (list repl-pair))))))
     (with-temp-buffer
       (insert-file-contents file)
       (goto-char (point-min))
       (dolist (pair repl-list)
	     (while (re-search-forward (car pair) nil t)
	       (replace-match (cadr pair)))
	     (goto-char (point-min)))
       (write-file file))))
2 个赞

简化一下,去掉从文件读取pair和选择文件的操作,直接在需要执行的文件中调用。pair放在repl-list变量中。

(defun my-replace-all ()
  (interactive)
  (let ((curr-file (buffer-file-name (current-buffer)))
	    (repl-list '(("為" "爲") ("裡" "裏"))))
    (with-temp-buffer
      (insert-file-contents curr-file)
      (goto-char (point-min))
      (dolist (pair repl-list)
	    (while (re-search-forward (car pair) nil t)
	      (replace-match (cadr pair)))
	    (goto-char (point-min)))
      (write-file curr-file))))
2 个赞

太棒了,感觉都成了一个插件了。功能丰富很多了。

只是一个函数,插件要复杂的多。

这个简单一些,似乎能看懂一点点。

不会编程,请教一下大佬,是怎样知道或选择哪个函数呢?比如这里面的with-temp-buffer,point-min,re-search-forward,replace-match等的呢?

这些都是emacs常用的函数,推荐看李杀的网站 http://ergoemacs.org/index.html

1 个赞

谢谢,看来要下不少功夫呢。

中文编辑工具,好像没有专门的插件,像上面这张图,是wps的截图。在emacs中似乎不太方便处理呢,vim稍微容易一些。

也可以看我的这个 elisp编程总结,我就是跟着教程敲了一遍基本就差不多了。很多函数不用刻意去记,只需要知道大概的作用,使用时C-h f查看文档就知道具体怎么用了。这样用多了,查多了,自然就熟练了。

2 个赞

你指的中文编辑功能是什么?感觉上面的这些都很鸡肋啊。。

指office word或wps的办公软件,面向非程序员。字数统计、中文拼写检查等功能。

完善了一下 replall 函数,这下逻辑更清晰了。看这篇 文章

1 个赞