web-dev-qa-db-ja.com

Emacsでマークされた(選択された)テキストを検索する

コードやその他のテキストファイルの表示と編集にはemacsを使用しています。現在のバッファでマークされているテキストを前方または後方に検索する方法があるかどうかを知りたいと思いました。メモ帳やワードパッドでできることと似ています。のように、バッファ内のテキストにマークを付けてC-sまたはC-rを実行すると、検索テキスト全体を実際に入力しなくても、マークされたテキストで検索できますか?

ありがとうございました、

Rohit

45
Rohit

はい。 M-W(選択したテキストのコピーを取得するため)C-s <RET> C-y <RET>。次に、必要に応じてC-sを繰り返します。 C-rについても同様です。

31
Alex Coventry

@アレックスはそれを釘付けにします。

私がよく使用するもう1つのオプションは、現在のマークの後にある単語を検索するためのC-s C-wです。 C-wを押すと、追加の単語で検索が繰り返し増加します(たとえば、C-s C-w C-w C-wは現在のマークの後の3つの単語を検索します)。

同様に、C-s M-s C-eは現在のマークの後の残りの行を検索し、C-s C-M-yはマークの後の文字を検索します。これらは両方とも同じ方法で繰り返すことができます(前者はM-s C-eの後にC-sをやや厄介に繰り返すことによって)。

101
Chris Conway

私は以下を使用していますが、後で発生するものを見つけるために複数の連続するC-を入力する必要がないという問題はありません。

    (defun search-selection (beg end)
      "search for selected text"
      (interactive "r")
      (kill-ring-save beg end)
      (isearch-mode t nil nil nil)
      (isearch-yank-pop)
    )
    (define-key global-map (kbd "<C-f3>") 'search-selection)

前のコードの欠点は、選択したテキストがストレッチにコピーされることです。次のコードにはこの問題はありません。

    (defun search-selection (beg end)
      "search for selected text"
      (interactive "r")
      (let (
            (selection (buffer-substring-no-properties beg end))
           )
        (deactivate-mark)
        (isearch-mode t nil nil nil)
        (isearch-yank-string selection)
      )
    )
    (define-key global-map (kbd "<C-f3>") 'search-selection)
17
Marc Haesen

他の回答は、コピーされたテキストを検索する方法、またはある時点で単語を検索する方法を説明しています。しかし、実際には「マークされたテキストで検索する」方法を説明しているものはありません。

次のフックを追加すると、現在選択されているテキストがisearchに使用されるテキストになるようになります。

(defun jrh-isearch-with-region ()
  "Use region as the isearch text."
  (when mark-active
    (let ((region (funcall region-extract-function nil)))
      (deactivate-mark)
      (isearch-Push-state)
      (isearch-yank-string region))))

(add-hook 'isearch-mode-hook #'jrh-isearch-with-region)

ヒント:これは expand-region とうまくペアになります。

6
Jackson

これを行うための最短のキーシーケンスは M-wC-sM-y

5
link0ff

これには素晴らしい関数があります:isearch-forward-symbol-at-point。ポイントが配置されている単語のすべての出現箇所が強調表示されます。単語の先頭にポイントを配置する必要はありません。次に、C-sまたはC-rを使用して次または前に移動できます。

完全一致であることに注意してください。たとえば、hiで使用すると、chillとは一致しません。

Ifをcommand-f(mac OSX)にマッピングしました:initファイルの(global-set-key (kbd "s-f") 'isearch-forward-symbol-at-point)

3
laurentmeyer

上記の答え(受け入れられたものを含む)はあまりにも面倒な私見です。私は次の情報を見つけて、それがとても好きです:

「Ctrl + sCtrl + w」。これにより現在の単語が検索されますが、最初にカーソルを単語の先頭に移動する必要があります。

http://xah-forum.blogspot.com/2009/08/search-Word-under-cursor-in-emacs.html

2
javadba

C-h k C-sを実行すると、C-sのヘルプを見つけることができます。

DELと入力して、検索文字列の最後から最後の入力項目をキャンセルします。 RETと入力して終了し、見つかった場所にポイントを残します。行末に一致するようにLFD(C-j)と入力します。 C-sと入力して前方に再度検索し、C-rと入力して後方に再度検索します。 C-wと入力して、バッファ内の次の単語または文字をヤンクします検索文字列の末尾に移動して検索します。 C-M-wと入力して、検索文字列の末尾から文字を削除します。 C-M-yと入力して、文字をバッファから検索文字列の最後にヤンクし、検索します。 M-s C-eと入力して、残りの行を検索文字列の最後にヤンキーし、検索します。 C-yと入力して、強制終了されたテキストの最後の文字列をヤンクします。 M-yと入力して、検索プロンプトにヤンクされたばかりの文字列を、その前に強制終了された文字列に置き換えます。 C-qと入力して制御文字を引用し、検索します。 C-x 8 RETと入力して、Unicode名で検索する文字を追加し、補完します。検索中または検索が失敗した場合のC-gは、正常に検出されたものへの入力をキャンセルします。検索が成功するとC-gは中止され、ポイントを開始ポイントに移動します。

検索文字列を空のままで終了しようとすると、非増分検索が呼び出されます。

M-cと入力して、検索の大文字と小文字の区別を切り替えます。 M-s iと入力して、非表示のテキストでの検索を切り替えます。 M-rと入力して、正規表現モードを切り替えます。 M-s wと入力して、Wordモードを切り替えます。 M-s _と入力して、シンボルモードを切り替えます。 M-s 'と入力して、文字の折りたたみを切り替えます。

M-s SPCと入力して、空白の一致を切り替えます。インクリメンタルサーチでは、1つまたは複数のスペースは通常、変数「search-whitespace-regexp」で定義された空白と一致します。変数「isearch-lax-whitespace」および「isearch-regexp-lax-whitespace」も参照してください。

M-s eと入力して、ミニバッファ内の検索文字列を編集します。

以前の16個の検索文字列の検索リングもサポートされています。 M-nと入力して、検索リング内の次のアイテムを検索します。 M-pと入力して、検索リングで前のアイテムを検索します。 C-M-iと入力して、検索リングを使用して検索文字列を完成させます。

M-%と入力して、最後の検索文字列から置き換える文字列で「query-replace」を実行します。 C-M-%と入力して、最後の検索文字列で「query-replace-regexp」を実行します。 M-s oと入力して、最後の検索文字列を表示する「occur」を実行します。 M-s h rと入力して、最後の検索文字列を強調表示する「highlight-regexp」を実行します。

C-h bと入力して、すべてのIsearchキーバインディングを表示します。 C-h kと入力して、Isearchキーのドキュメントを表示します。 C-h mと入力して、Isearchモードのドキュメントを表示します。

0
Helin Wang