検 索

Last modified: "2019/01/04 21:39:12"

Table of contents


知っていると便利な辺り

grep の検索結果から、その場所へ移動する。

F10 (first-error) を押す。次の検索結果へ移動する場合は、 F11 (next-error) 。 前の検索結果へ移動する場合は、C-u F11

使い始めたころは、なにがなにやらわからず Enter とかして、悲しい思いをしていた...。


キーワードとかを探す。

それらしい単語からキーワード(関数とか)を探す --- M-x apropos

そのキーにバインドされている関数を知る --- M-x describe-key

describe-key を実行すると、Describe key: ときかれるので、そこで調べたいキー(C-x C-f とか)を打つ。


開いてるバッファすべてに対して検索 / 置換

開いてるバッファすべてに対して検索 --- M-x grep

開いてるバッファすべてに対して置換 --- M-x gresreg


ウェブ検索

Google 検索

ミニバッファからキーワードを指定して検索する。 以下にでてくる関数はみなこの関数を使っている。 使用するブラウザは,1 〜 4 のうちから好みに応じて適当に。 eijiro.l を参考にさせて頂いてます。

(defun search-google (&optional str)
  (interactive)
  (unless str
    (setq str (read-string "Google: ")))
  (long-operation
    (let ((url (concat "http://www.google.com/search?hl=ja&lr=lang_ja&num=20&q="
                       (si:www-url-encode str))))
      ;─────────────────────
      ; 1. 標準ブラウザを使う場合
      (shell-execute url t)
      ; 2. browser.dll & browserex.l を使う場合
      ;(bx::navigate url)
      ; 3. www-mode を使う場合
      ;(www-open-url url)
      ; 4. 指定したブラウザを使う場合
      ;(call-process (concat "C:/usr/local/MozillaFirebird/MozillaFirebird.exe " url))
      ;─────────────────────
      )))

セレクションの文字列を Google 検索する。セレクションがない場合は, ミニバッファからキーワードを指定して検索する。 比較的よく使うので,C-c g に割り当てている。

(defun search-google-selection ()
  (interactive)
  (search-google (if (pre-selection-p)
                     (selection-start-end (beg end)
                       (buffer-substring beg end))
                   nil)))
(global-set-key '(#\C-c #\g) 'search-google-selection)

リージョンの文字列を Google 検索する。

(defun search-google-region (from to)
  (interactive "r")
  (search-google (if (/= from to)
                     (buffer-substring from to)
                   nil)))

上記の関数と edict 用の関数を使って,カーソル位置の単語を Google 検索する。 セレクションがあれば,セレクションの文字列を Google 検索する。

(defun google-lookup-selection ()
  (interactive)
  (ed::edict-lookup-selection #'search-google-region))

Grep

grep-dialog の拡張

[xyzzy:08551](加藤木さん)、[xyzzy:08553](Watanabe さん)を参考に。 grep-dialog-with-word, grep-no-dialog は、私が手を入れたのでアヤしいのだけれども、 とってもお気に入り。

カーソルの位置にある語句を grep-dialog する。

(defun grep-dialog-with-word ()
  (interactive)
  (unless (pre-selection-p)
    (skip-syntax-spec-forward "w_")
    (ed::begin-selection)
    (skip-syntax-spec-backward "w_"))
  (grep-dialog))

最後に検索を開始したディレクトリのままで grep-dialog するようにする。

(require "grepd")
(setq ed::*grep-directory-name-hook*
      #'(lambda () (car ed::*grep-directory-history*)))

検索文字列以外はすべて前回設定のまま、ダイアログも出さないで grep する。

(defun grep-no-dialog ()
  (interactive)
  (let ((str (or (selection-start-end (start end)
                   (buffer-substring start end))
                 (save-excursion
                   (buffer-substring (progn
                                       (skip-syntax-spec-forward "w_")
                                       (point))
                                     (progn
                                       (skip-syntax-spec-backward "w_")
                                       (point)))))))
    (when (> (length str) 0)
      (ed::scan-files str
                      (car ed::*grep-file-history*)
                      (car ed::*grep-directory-history*)))))

grep 結果からダブルクリックでファイルを開く

xyzzy Part7 775 より。grep 用キーマップを設定している。

(defun grep-mouse-left-press ()
  (interactive)
  (let ((click (mod *last-mouse-click-count* 6)))
    (if (= click 2)
        (first-error)
      (mouse-left-press))))

(defvar *grep-map* nil)
(unless *grep-map*
  (setq *grep-map* (make-sparse-keymap))
  (define-key *grep-map* #\LBtnDown 'grep-mouse-left-press))
(add-hook 'ed::*grep-hook* #'(lambda () (use-keymap *grep-map*)))
(add-hook 'ed::*grepd-hook* #'(lambda () (use-keymap *grep-map*)))

grep 結果からウィンドウサイズを場合により変更し検索先に移動

Grep 実行後,検索結果が分割されたウィンドウに表示されている状態で (first-error) を実行しても, 分割されていないときのような割合で分割しなおして検索先を表示する。無理矢理。 あらかじめ *grep-map* を設定しておく必要あり。 RET に割り当てている。

(defun grep-first-error-and-resize-window ()
  (interactive) (delete-other-windows) (first-error))
(define-key *grep-map* #\RET 'grep-first-error-and-resize-window)

grep 結果から読取専用で検索先を開く

kia さん find-libraryを使っていて,読取専用で開くべきだなと思うことが良くあるようになったので。 (delete-other-windows) は好みに応じて。 あらかじめ *grep-map* を設定しておく必要あり。 C-RET に割り当てている。

(defun grep-first-error-view-file ()
  (interactive) (delete-other-windows) (first-error) (setq buffer-read-only t))
(define-key *grep-map* #\LFD 'grep-first-error-view-file)

コマンドラインからディレクトリを開こうとするとgrepになってほしい。

この設定をしておいて、エクスプローラとかからフォルダを xyzzy に送ると、 grep-dialog が開く。
大久保さんちの *scratch* より。

(add-hook 'ed::*process-command-line-hook*
          #'(lambda (arg) (interactive)
              (when (file-directory-p arg)
                (require "grepd")
                (let ((ed::*grep-directory-name-hook*
                       #'(lambda () arg)))
                  (declare (special ed::*grep-directory-name-hook*))
                  (setq arg (map-backslash-to-slash arg))
                  (add-history arg 'ed::*grep-directory-history*)
                  (ed::grep-dialog)))))

バッファ検索

カレントワードを検索

カーソル位置の単語もしくはセレクションを検索する。 まあ、動いているかに思えるので良しとする。

カレントワードを次検索

(defun current-word-search-forward (&optional bw)
  (interactive)
  (let (str)
    (if (pre-selection-p)
        (selection-start-end (start end)
          (setq str (buffer-substring start end))
          (if bw (when (> start end) (goto-char end))
            (when (< start end) (goto-char end))))
      (progn
        (setq str (buffer-substring
                   (progn (skip-syntax-spec-backward "w_")(point))
                   (progn (skip-syntax-spec-forward "w_")(point))))
        (when bw (skip-syntax-spec-backward "w_"))))
    (unless (> (length str) 0)
      (return-from current-word-search-forward nil))
    (forward-char -1)
    (ed::search-command str bw nil t)))
(global-set-key #\C-F5 'current-word-search-forward)
(set-function-bar-label #\C-F5 "単語次検索")

カレントワードを前検索

(defun current-word-search-backward ()
  (interactive)
  (current-word-search-forward t))
(global-set-key #\C-S-F5 'current-word-search-backward)
(set-function-bar-label #\C-S-F5 "単語前検索")

いろいろ

edict 英和をメッセージボックスで

edict による英和辞書引き結果をメッセージボックスで表示する。 C-c e に割り当てている。関数名が素敵でなかったかも。

(defun lookup-e2j-dictionary-selection-box ()
  (interactive)
  (let ((bn "*dictionary*")
        str winconf)
    (setq winconf (current-window-configuration))
    (lookup-e2j-dictionary-selection)
    (switch-to-buffer bn)
    (setq str (buffer-substring (point-min)
                                (point-max)))
    (delete-buffer bn)
    (set-window-configuration winconf)
    (message-box str "edict")))
(global-set-key '(#\C-c #\e) 'lookup-e2j-dictionary-selection-box)