新手小白,查了论坛的搜索替换的帖子,多数讲的是交互式替换,需要输入搜索的词然后按回车,然后再替换。
我想实现的是中文文本的文件预处理,想在config.el里写一个简单的函数,实现类似vim的功能批量替换:
:%s/错字1/正字1/g :%s/错字2/正字2/g :%s/错字3/正字3/g
:%s/ //g (去文内空格)
其中「错字」和「正字」直接写到程序里,不用交互,直接执行。谢谢大佬!
新手小白,查了论坛的搜索替换的帖子,多数讲的是交互式替换,需要输入搜索的词然后按回车,然后再替换。
我想实现的是中文文本的文件预处理,想在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 “裡” “裏”)
)
写了一个函数,应该满足你的需求。
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))))
简化一下,去掉从文件读取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))))
太棒了,感觉都成了一个插件了。功能丰富很多了。
只是一个函数,插件要复杂的多。
这个简单一些,似乎能看懂一点点。
不会编程,请教一下大佬,是怎样知道或选择哪个函数呢?比如这里面的with-temp-buffer,point-min,re-search-forward,replace-match等的呢?
谢谢,看来要下不少功夫呢。
也可以看我的这个 elisp编程总结,我就是跟着教程敲了一遍基本就差不多了。很多函数不用刻意去记,只需要知道大概的作用,使用时C-h f查看文档就知道具体怎么用了。这样用多了,查多了,自然就熟练了。
你指的中文编辑功能是什么?感觉上面的这些都很鸡肋啊。。
指office word或wps的办公软件,面向非程序员。字数统计、中文拼写检查等功能。