已解决:「求助」emacs里对比两段汉字的问题

bufferA: 赵钱孙李周吴郑王 bufferB: 赵周冯王将沈钱李

想知道他们的交集和差是什么: A n B, A - B , B - A

怎么做呢谢谢

(let* ((buffer-a-string (with-current-buffer "a"
                          (buffer-substring-no-properties (point-min) (point-max))))
       (buffer-b-string (with-current-buffer "b"
                          (buffer-substring-no-properties (point-min) (point-max))))
       (buffer-a-char-list (string-glyph-split buffer-a-string))
       (buffer-b-char-list (string-glyph-split buffer-b-string)))
  (message "Intersection: %s" (seq-intersection buffer-a-char-list
                                                buffer-b-char-list)) ;; => ("赵" "周" "王" "钱" "李")
  (message "Difference: %s" (seq-difference buffer-a-char-list
                                            buffer-b-char-list)) ;; => ("孙" "吴" "郑")
  (message "Difference: %s" (seq-difference buffer-b-char-list
                                         buffer-a-char-list))) ;; => (“冯” “将” “沈”)

去重可以用 seq-uniq

emacs里对比两段汉字的问题

这个标题是求助还是分享?

之前想简单了,以为问题就不是分享,没想到有歧义,已添加求助字样

感谢高手,我先理解一下怎么用哈 不好意思太菜了,我把两个buffer分别改名为a和b,之后在scratch里贴上上面的代码,执行ctrl x ctrl e得到

Debugger entered--Lisp error: (void-function “冯”)
  (“冯” “将” “沈”)
  (progn (“冯” “将” “沈”))
  eval((progn (“冯” “将” “沈”)) t)
  elisp--eval-last-sexp(nil)
  eval-last-sexp(nil)
  funcall-interactively(eval-last-sexp nil)
  call-interactively(eval-last-sexp nil nil)
  command-execute(eval-last-sexp)

;; 后面的是注释,可以删掉

把光标放在星号处再执行 C-x C-e 即可

这个星号是后加的吗,之前贴的代码里没有,尝试在冯前面的;;前(即最后一行)加上执行也报错

Debugger entered--Lisp error: (void-variable *)
  (progn *)
  eval((progn *) t)
  elisp--eval-last-sexp(nil)
  eval-last-sexp(nil)
  funcall-interactively(eval-last-sexp nil)
  call-interactively(eval-last-sexp nil nil)
  command-execute(eval-last-sexp)

星号只是代表光标位置,用下面代码吧

(let* ((buffer-a-string (with-current-buffer "a"
                          (buffer-substring-no-properties (point-min) (point-max))))
       (buffer-b-string (with-current-buffer "b"
                          (buffer-substring-no-properties (point-min) (point-max))))
       (buffer-a-char-list (string-glyph-split buffer-a-string))
       (buffer-b-char-list (string-glyph-split buffer-b-string)))
  (message "Intersection: %s" (seq-intersection buffer-a-char-list
                                                buffer-b-char-list))
  (message "Difference: %s" (seq-difference buffer-a-char-list
                                            buffer-b-char-list))
  (message "Difference: %s" (seq-difference buffer-b-char-list
                                            buffer-a-char-list)))

感谢且不好意思,在新代码最后一个括号后按ctrl x ctrl e的结果

Debugger entered--Lisp error: (void-function string-glyph-split)
  (string-glyph-split buffer-a-string)
  (let* ((buffer-a-string (save-current-buffer (set-buffer "a") (buffer-substring-no-properties (point-min) (point-max)))) (buffer-b-string (save-current-buffer (set-buffer "b") (buffer-substring-no-properties (point-min) (point-max)))) (buffer-a-char-list (string-glyph-split buffer-a-string)) (buffer-b-char-list (string-glyph-split buffer-b-string))) (message "Intersection: %s" (seq-intersection buffer-a-char-list buffer-b-char-list)) (message "Difference: %s" (seq-difference buffer-a-char-list buffer-b-char-list)) (message "Difference: %s" (seq-difference buffer-b-char-list buffer-a-char-list)))
  (progn (let* ((buffer-a-string (save-current-buffer (set-buffer "a") (buffer-substring-no-properties (point-min) (point-max)))) (buffer-b-string (save-current-buffer (set-buffer "b") (buffer-substring-no-properties (point-min) (point-max)))) (buffer-a-char-list (string-glyph-split buffer-a-string)) (buffer-b-char-list (string-glyph-split buffer-b-string))) (message "Intersection: %s" (seq-intersection buffer-a-char-list buffer-b-char-list)) (message "Difference: %s" (seq-difference buffer-a-char-list buffer-b-char-list)) (message "Difference: %s" (seq-difference buffer-b-char-list buffer-a-char-list))))
  eval((progn (let* ((buffer-a-string (save-current-buffer (set-buffer "a") (buffer-substring-no-properties (point-min) (point-max)))) (buffer-b-string (save-current-buffer (set-buffer "b") (buffer-substring-no-properties (point-min) (point-max)))) (buffer-a-char-list (string-glyph-split buffer-a-string)) (buffer-b-char-list (string-glyph-split buffer-b-string))) (message "Intersection: %s" (seq-intersection buffer-a-char-list buffer-b-char-list)) (message "Difference: %s" (seq-difference buffer-a-char-list buffer-b-char-list)) (message "Difference: %s" (seq-difference buffer-b-char-list buffer-a-char-list)))) t)
  elisp--eval-last-sexp(nil)
  eval-last-sexp(nil)
  funcall-interactively(eval-last-sexp nil)
  call-interactively(eval-last-sexp nil nil)
  command-execute(eval-last-sexp)

是不是因为换行的缘故,我去改一下 不是

感谢耐心回复,我就不新开层表达了

string-glyph-split 好像是 emacs 29 引入的,我不知道 28 有没有,用 split-string

(let* ((buffer-a-string (with-current-buffer "a"
                          (buffer-substring-no-properties (point-min) (point-max))))
       (buffer-b-string (with-current-buffer "b"
                          (buffer-substring-no-properties (point-min) (point-max))))
       (buffer-a-char-list (split-string buffer-a-string "" t))
       (buffer-b-char-list (split-string buffer-b-string "" t)))
  (message "Intersection: %s" (seq-intersection buffer-a-char-list
                                                buffer-b-char-list))
  (message "Difference: %s" (seq-difference buffer-a-char-list
                                            buffer-b-char-list))
  (message "Difference: %s" (seq-difference buffer-b-char-list
                                            buffer-a-char-list)))
2 个赞