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
ミニバッファからキーワードを指定して検索する。 以下にでてくる関数はみなこの関数を使っている。 使用するブラウザは,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))
[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*)))))
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 実行後,検索結果が分割されたウィンドウに表示されている状態で (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)
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)
この設定をしておいて、エクスプローラとかからフォルダを 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 による英和辞書引き結果をメッセージボックスで表示する。 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)