From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Andreas Politz Newsgroups: gmane.emacs.help Subject: Re: Custom searches, like interactively searching palindromes Date: Fri, 01 Oct 2010 15:58:24 +0200 Organization: FH-Trier Message-ID: <87mxqyf20v.fsf@fh-trier.de> References: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: dough.gmane.org 1291867434 3302 80.91.229.12 (9 Dec 2010 04:03:54 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Thu, 9 Dec 2010 04:03:54 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Thu Dec 09 05:03:50 2010 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1PQXjS-0001Ga-Di for geh-help-gnu-emacs@m.gmane.org; Thu, 09 Dec 2010 05:03:50 +0100 Original-Received: from localhost ([127.0.0.1]:47083 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PQXjR-0005WO-Pi for geh-help-gnu-emacs@m.gmane.org; Wed, 08 Dec 2010 23:03:49 -0500 Original-Path: usenet.stanford.edu!news.tele.dk!news.tele.dk!small.news.tele.dk!news-2.dfn.de!news.dfn.de!news.uni-stuttgart.de!news.belwue.de!news.uni-kl.de!not-for-mail Original-Newsgroups: gnu.emacs.help Original-Lines: 68 Original-NNTP-Posting-Host: 143-93-54-11.arno.fh-trier.de Original-X-Trace: news.uni-kl.de 1285941504 25288 143.93.54.11 (1 Oct 2010 13:58:24 GMT) Original-X-Complaints-To: usenet@news.uni-kl.de Original-NNTP-Posting-Date: Fri, 1 Oct 2010 13:58:24 +0000 (UTC) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (gnu/linux) Cancel-Lock: sha1:/r4HTsK10o17EyNoUUg2+BJMziQ= Cache-Post-Path: arno.fh-trier.de!unknown@dslb-084-059-101-076.pools.arcor-ip.net X-Cache: nntpcache 3.0.1 (see http://www.nntpcache.org/) Original-Xref: usenet.stanford.edu gnu.emacs.help:181590 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:76604 Archived-At: Karan Bathla writes: > > I would like to know how one can interactively search for patterns > that are not captured by regexes, like palindromes. > I had a similar desire and wrote this 2 functions, which can be used to do what you want, though not for replacing. (defun isearch-with-predicate (predicate indicator &optional backward regexp) (lexical-let ((predicate predicate)) (let ((isearch-search-fun-function (lambda nil (lambda (string &optional bound no-error) (let (isearch-search-fun-function) (search-with-predicate string (isearch-search-fun) predicate bound no-error))))) (isearch-message-prefix-add indicator) isearch-with-predicate-success (isearch-mode-end-hook (lambda nil (setq isearch-with-predicate-success (not isearch-mode-end-hook-quit))))) (funcall (if backward (if regexp 'isearch-backward-regexp 'isearch-backward) (if regexp 'isearch-forward-regexp 'isearch-forward))) (isearch-clean-overlays) isearch-with-predicate-success))) (defun search-with-predicate (string search-fn predicate &optional bound noerror count) (let (found limit (count (or count 1))) (save-excursion (while (and (setq found (funcall search-fn string bound noerror)) (or (not (setq found (and (funcall predicate) found))) (> (decf count) 0)))) (setq limit (point))) (if found (goto-char found) (unless (eq noerror t) (goto-char limit) nil)))) (defun isearch-palindrome (&optional regexp) (interactive "P") (isearch-with-predicate (lambda () (let* ((word (buffer-substring (match-beginning 0) (match-end 0))) (prefix (append (substring word 0 (/ (length word) 2)) nil)) (suffix (nreverse (append (substring word (/ (length word) 2)) nil)))) (every '= prefix suffix))) "(Palindrome)" nil regexp)) -ap