2

有没有办法告诉 isearch 搜索活动区域(如果有)?否则定期提示输入字符串。

编辑:27.10.12

我最终使用了这些功能:

(defun er/isearch-word-at-point ()
  (interactive)
  (call-interactively 'isearch-forward-regexp))

(defun er/isearch-yank-word-hook ()
  (when (equal this-command 'er/isearch-word-at-point)
    (let ((string (concat "\\<"
                          (buffer-substring-no-properties
                           (progn (skip-syntax-backward "w_") (point))
                           (progn (skip-syntax-forward "w_") (point)))
                          "\\>")))
      (if (and isearch-case-fold-search
               (eq 'not-yanks search-upper-case))
          (setq string (downcase string)))
      (setq isearch-string string
            isearch-message
            (concat isearch-message
                    (mapconcat 'isearch-text-char-description
                               string ""))
            isearch-yank-flag t)
      (isearch-search-and-update))))

(defun er/isearch-yank-region ()
  (interactive)
  (isearch-yank-internal (lambda () (mark))))

(define-key isearch-mode-map (kbd "C-r") 'er/isearch-yank-region)
(define-key isearch-mode-map (kbd "C-t") 'er/isearch-word-at-point)

第一个是我在网上某处找到的一个函数,将光标下的单词标记为搜索词(类似于 vim 中的 * 和 # )并直接跳转到下一个出现,第二个是 @Oleg Pavliv 的答案。

编辑#2

实际上,为什么不将它们结合起来以获得超甜味呢?好的!

(defun er/isearch-word-or-region-at-point ()
  (interactive)
  (if (region-active-p)
      (isearch-yank-internal (lambda () (mark)))
  (call-interactively 'isearch-forward-regexp)))

(defun er/isearch-yank-word-hook ()
  (when (equal this-command 'er/isearch-word-or-region-at-point)
    (let ((string (concat "\\<"
                          (buffer-substring-no-properties
                           (progn (skip-syntax-backward "w_") (point))
                           (progn (skip-syntax-forward "w_") (point)))
                          "\\>")))
      (if (and isearch-case-fold-search
               (eq 'not-yanks search-upper-case))
          (setq string (downcase string)))
      (setq isearch-string string
            isearch-message
            (concat isearch-message
                    (mapconcat 'isearch-text-char-description
                               string ""))
            isearch-yank-flag t)
      (isearch-search-and-update))))
(add-hook 'isearch-mode-hook 'er/isearch-yank-word-hook)
(define-key isearch-mode-map (kbd "C-r") 'er/isearch-word-or-region-at-point)
4

2 回答 2

2

好问题。

在 Emacs 中似乎没有这种可能性。你可以自己实现

(defun isearch-yank-region ()
  (interactive)
  (isearch-yank-internal (lambda () (mark))))


(define-key isearch-mode-map "\C-r" 'isearch-yank-region)

现在您选择一个区域,调用增量搜索C-s并拉出该区域C-r。然后您可以继续增量搜索C-s

于 2012-10-27T04:26:05.690 回答
1

实现您想要的一个简单方法是在搜索之前将当前区域保存到 kill-ring,然后将其作为搜索词拉入 minibuffer。您可以通过执行以下键序列来执行此操作:

M-w C-s M-y

翻译为:

M-w: 像被杀死一样保存区域,但不会杀死它。

C-s: 向前做增量搜索。

M-y:拉出最后一串被杀死的文本(或者更确切地说,M-w之前保存的内容)。

打字有点像手指舞,但如果你经常使用它,它就会成为第二天性。这个通用解决方案的好处是它只使用 Emacs 已经内置的基本功能。无需建议任何功能。

于 2012-10-27T01:16:54.017 回答