emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: isearch region or thing at point.


From: Ergus
Subject: Re: isearch region or thing at point.
Date: Tue, 30 Apr 2019 18:25:01 +0200
User-agent: NeoMutt/20180716

Hi:

I wrote this code today to do a search auto-insert text from region like
behavior.

===============================================

(defun isearch-forward-region (&optional arg)
 "Do incremental search forward for text in active region.
Like ordinary incremental search except that the text in the active
region is added to the search string initially if variable
`transient-mark-mode' is non nil.  See the command
`isearch-forward-symbol' for more information.  With a prefix
argument, search for ARGth symbol forward if ARG is positive, or
search for ARGth symbol backward if ARG is negative."
 (interactive "P")
 (isearch-forward nil 1)
 (if-let* ((bounds (and (use-region-p) ;; Region and transient non-nil
                         (string-empty-p isearch-string)
                         (region-bounds)))
            (contiguous (= (length bounds) 1)) ;; Region is contiguous
            (region-beg (car (car bounds)))
            (region-end (cdr (car bounds)))
            (region-string (and (= (count-lines region-beg region-end) 1)
                                (buffer-substring-no-properties
                                 region-beg region-end)))
            (noempty (not (string-blank-p region-string))))
     (progn
        (goto-char region-beg)
        (setq mark-active nil
              isearch--deactivated-mark t)
        (isearch-yank-string region-string)

        (when-let (count (and arg (prefix-numeric-value arg)))
          (isearch-repeat-forward count)))

   (setq isearch-error "Invalid region for isearch")
   (isearch-push-state)
   (isearch-update)))

================================================

The problem is that when I C-x C-e, it works fine, but when
I compile it I get an error with message:

```
funcall-interactively: Symbol???s value as variable is void: bounds
```

I am pretty new using lisp, but I don't understand this behavior, Any
help, please.

The backtrace only says:

==================================================
Debugger entered--Lisp error: (void-variable bounds)
 isearch-forward-region(nil)
 funcall-interactively(isearch-forward-region nil)
 call-interactively(isearch-forward-region nil nil)
 command-execute(isearch-forward-region)
==================================================

Do I am using wrong the if-let* statement?
Thanks in advance,
Ergus.

On Mon, Apr 29, 2019 at 10:41:28PM +0300, Juri Linkov wrote:
The closest to this that I'm aware of is
isearch-forward-symbol-at-point, bound to 'M-s .' by default.

I just made a small change in isearch.el to enable region text auto
insertion in transient-mark-mode. (patch attached)

I did it as simple as I could. So please if you (or any anyone) could
give a look and correct/improve/expose corner cases, or suggest a better
implementation will be very nice.

I don't have corner cases right now, but I just started testing it.

So any correction/suggestion/recommendation is very appreciated.

Thanks, such addition is welcome.  Currently searching the
active region requires invocation of several commands: M-w C-s M-y
with a bad side-effect of leaving the region in the kill-ring.

However, adding a new option is not a satisfactory solution
because often isearch is used to extend the boundaries of the
active region, e.g. by setting the region's beginning with C-SPC,
then searching the region's end and exiting isearch there.

Fortunately, like Basil mentioned the command isearch-forward-symbol-at-point
bound to 'M-s .' you could create a similar command bound to e.g. 'M-s r'
that would start isearch with the text from the active region.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]