ace-isearch(レビュー) と併用している場合、デフォルトでは
6文字以上でhelm-swoop(レビュー) が発動するため併用できません。
そのため、isearchからhelm-swoopが発動しないように
ace-isearch-use-function-from-isearch をnilにしました。
たった今思い付いたコードです。
バッファ内の特定の行やシンボルをコピーするときどうしますか?
行の場合は、
- isearchなどでターゲットの行へジャンプ
- C-a C-SPC C-n M-wでその行をコピー
- C-u C-SPCで元の位置に戻る
- C-yで貼り付け
と、isearch後に7ストロークも必要とします。
シンボルの場合は dabbrev-expand (M-/) や
hippie-expand が使えるのでまだマシですが、
Emacs Lispのシンボルは共通のprefixなので、
いまいち使いづらいです。
シンボル名の途中ならば
- isearchなどでターゲットのシンボルへジャンプ
- C-M-b C-M-SPC M-wでそのシンボルをコピー
- C-u C-SPCで元の位置に戻る
- C-yで貼り付け
と、やはり6ストローク必要とします。
そこでisearch後、即に行はシンボルを貼り付けられるようにする
Emacs Lispを書きました。
isearch後、C-eでシンボルを、C-u C-eでその行を
元の位置に貼り付けます。
検索文字列がシンボルをまたがる場合は、
検索文字列を含むシンボル単位の塊を貼り付けます。
検索文字列を伸ばすにはC-w (標準機能)でできます。
行を指定してからコピーというのは昔から
知る人ぞ知る fcopy.el がありますが、
こちらはisearchという標準機能からすぐに使える手軽さがあります。
長いシンボルのdabbrev代わりに使ってあげてください。
(defun insert-from-isearch (&optional whole-line) (interactive "P") (let ((str (insert-from-isearch-target-string whole-line))) (isearch-done t) (goto-char (mark)) (pop-mark) (and whole-line (beginning-of-line)) (undo-boundary) (insert str))) (defun insert-from-isearch-target-string (whole-line) (if whole-line (thing-at-point 'line) (let ((bound (bounds-of-thing-at-point 'symbol)) (min (min (point) isearch-other-end)) (max (max (point) isearch-other-end))) (cons (point) isearch-other-end) (if (and bound (<= (car bound) min max (cdr bound))) (buffer-substring (car bound) (cdr bound)) (save-excursion (buffer-substring (progn (goto-char min) (or (car (bounds-of-thing-at-point 'symbol)) min)) (progn (goto-char max) (or (cdr (bounds-of-thing-at-point 'symbol)) max)))))))) (define-key isearch-mode-map (kbd "C-e") 'insert-from-isearch) (setq ace-isearch-use-function-from-isearch nil)
Fig1: 初期状態
Fig2: thiを検索
Fig3: C-eでThisが貼り付けられる
Fig4: ant C-wでant toを検索
Fig5: C-eでwant toが貼り付けられる
Fig6: この状態でbuffを検索し、C-u C-eを押すとその行を貼り付ける
本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。