swiper在搜索org文件时能不能只搜索页面可见内容(指的不是折叠)

估计很少有人会发现过这个问题,我也是今天才发现(其实早就该发现了,以前是感觉有问题但没有深究)。

一直在用ivy swiper, 我的 org文件中链接比较多 。在搜索时通常都只希望搜索链接上的文字,而不是搜索链接上的url等源代码,如同在浏览器里搜索,通常指的是搜索页面可见内容而不是搜索网页源码。

比如我的org文件中有一个删除按钮(根据文件标题自动生成),elisp源码是:[[elisp:(progn (erase-buffer)(url-insert-file-contents "http://[::1]/org.php?from=home&a=del&title=org文件加载时自动展开折叠效果测试")(save-buffer)(next-line 2)(org-end-of-line))][删除(不可恢复)]]

swiper搜索del这个词,效果是这样子的

图片

我的org文件的可见内容中并没有del这个词,搜索时把链接里的elisp源码也搜索了。

当org文件没多少链接时这样也不影响,但当org文件中链接比较多,elisp源码也比较多时,体验不太好。

使用emacs原生的搜索isearch时没有这个问题,搜索的就是页面可见内容,不会把不可见内容也搜索出来

你试试 search-invisible 这个变量能不能解决你的问题?

试了这两个变量(setq search-invisible nil) (setq isearch-invisible nil) 还是一样,没发现有变化

  1. 我认为不是很少人发现问题,而是大部分人都赞同这样的设计,至少不反对。

  2. 「页面可见内容」的「页面」是指从(window-start)(window-end) 之间内容吗?还是(point-min)(point-max)

    如果是前者,那么就是两项需求了:一、不匹配隐藏内容;二、限制搜索起/止范围。第二个需求我估计作者不会答应,感觉不符合更大众的需求。

    如果是后者,不改搜索范围,只修正 invisible 判断就比较容易了,例如 avy--visible-p 函数就符合需求。

    可以整理一下你的需求,跟作者探讨一下:https://github.com/abo-abo/swiper/

1 个赞

区域选中后再搜索

英文太差,用谷哥翻译把本文翻成了英文,去提了一个issues,emacs的原生搜索isearch搜索的就是页面可见内容,不是 (point-min)(point-max),这个设计感觉也挺好的,但不知道为什么不想用它

如果觉得没把握用英文描述清楚,用代码是不是更好一些?例如:

(with-temp-buffer
  ;;
  ;; 1. init buffer:
  ;; +------------------+
  ;; | [[foo][bar]]     |
  ;; |                  |
  ;; |                  |
  ;; ~                  ~
  ;; +------------------+
  ;;   [[quz][baz]]
  ;;
  (insert "[[foo][bar]]\n")
  (dotimes (_ (window-height))
    (insert "\n"))
  (insert "[[quz][baz]]\n")
  (setq-local org-hide-emphasis-markers t) ;; hide markers
  (org-mode)
  (font-lock-ensure)
  ;;
  ;; 2. test
  ;;
  (goto-char (point-min))
  (let (invisible-chars)
    (while (not (eobp))
      (unless (avy--visible-p (point))
        (push (char-after (point)) invisible-chars))
      (forward-char 1))
    (cl-assert (mapconcat #'char-to-string (reverse invisible-chars) "")
               (concat "[[foo][]]"
                       "[[quz][]]"))
    t))
;; => t

对这段代码的意图,应该不会有理解上的歧义,而且可以 100% 重现。

感谢,把你的代码也加到issues里去了(虽然还不是很明白),试了一下用eww打开的页面,没有这个问题,swiper搜索的就是页面可见内容,不会搜索eww页面里隐藏的前端源码。我觉得org-mode应该也能做到这点。