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)

1つ目は、ウェブのどこかで見つけた関数で、カーソルの下の単語を検索語としてマークし(vimの*と#に似ています)、次の出現に直接ジャンプします。2つ目は、@OlegPavlivの答えです。

編集#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

目的を達成する簡単な方法は、検索する前に現在の領域をキルリングに保存し、それを検索語としてミニバッファーにヤンクすることです。これを行うには、次のキーシーケンスを実行します。

M-w C-s M-y

これは次のように解釈されます。

M-w:領域を強制終了したかのように保存しますが、強制終了はしません。

C-s:インクリメンタルサーチを前方に実行します。

M-y:強制終了されたテキストの最後の文字列(つまり、以前に保存されたもの)をヤンクしますM-w

入力するのは少し指のダンスですが、頻繁に使用すると、第二の性質になります。この汎用ソリューションの良いところは、すでにEmacsに組み込まれている基本的な機能のみを使用することです。機能についてアドバイスする必要はありません。

于 2012-10-27T01:16:54.017 に答える