search-one-word.el アップデート。リピート移動をより便利に

search-one-word.el アップデート。リピート移動をより便利に

「Vimの一文字検索を実装してみる」として先日 "search-one-word.el" を公開しました。ただ実際使っていく中でいくつか不便に感じる部分があったのでアップデートしました。

スポンサーリンク
スポンサーリンク

以前のバージョン

以前のバージョンは下記記事で公開しました。

こちらもそれなりに便利だったのですがやや不便に感じる面がありました。例えば "search-forward-repeat-with-char" を "H-f" にキーバインドしたとして、文字"d"の位置にカーソルをリピート移動させようとすると、

"H-f" "d" "H-f" "H-f" "H-f" "H-b" "H-f"

といった具合に移動する必要がありました。移動先の文字をタイプした後、再度コマンド起動キーを押す必要があり指の移動に問題がありました。

アップデート版(v2.0)概要

というわけで下記のように移動できるように改変しました。今回のバージョンではコマンドを起動するとカーソル移動モードに入るようになっています。

先ほどと同じように "d" の位置にカーソルをリピート移動させる場合

"H-f" "d" "d" "d" "d" "d" .....

この操作で可能になります。

また最初に "d" の位置に移動させていたけれどやはり "k" の位置に移動させたいといった場合

"H-f" "d" "d" "k" "k" "k" .....

こういった感じで途中で押すキーを変えれば良いだけです。非常に簡単です。

また行き過ぎて戻りたいといった場合は "C-s" (forward) と "C-r" (backward) が使えます。 具体的にはこんな感じで。

"H-f" "d" "d" "C-r" "C-r" "C-s" "C-r" .....

カーソル移動モードを抜けるには "C-g (or C-q, ESC)" をタイプします。こんな感じでカーソル移動がより便利になりました。

スポンサーリンク
スポンサーリンク

ソース

ソースはこんな感じ。

(require 'cl-lib)
(defvar last-search-char nil)

(defun direct-search-forward-char ()
  (interactive)
  (cl-loop
   (let ((char (read-key "Move to Char: ")))
     (cond ((member (string char) '("" "" ""))
            (cl-return)
            )
           ((string= "" (string char))
            (if last-search-char
                (progn
                  (when (char-equal (char-after (point)) last-search-char)
                    (forward-char))
                  (search-forward (string last-search-char) nil t)
                  (backward-char))
              (progn
                (let ((char (read-key "Move to Char: ")))
                  (if (char-equal (char-after (point)) char) (forward-char))
                  (search-forward (string char) nil t) (backward-char)
                  (setq last-search-char char))))
            )
           ((string= "" (string char))
            (if last-search-char
                (search-backward (string last-search-char) nil t)
              (progn
                (let ((char (read-key "Move backward to Char: ")))
                  (search-backward (string char) nil t)
                  (setq last-search-char char))))
            )
           (t
            (when (char-equal (char-after (point)) char) (forward-char))
            (search-forward (string char) nil t) (backward-char)
            (setq last-search-char char)
            )
           ))))

(defun direct-search-backward-char ()
  (interactive)
  (cl-loop
   (let ((char (read-key "Move to Char: ")))
     (cond ((member (string char) '("" "" ""))
            (cl-return)
            )
           ((string= "" (string char))
            (if last-search-char
                (progn
                  (when (char-equal (char-after (point)) last-search-char)
                    (forward-char))
                  (search-forward (string last-search-char) nil t)
                  (backward-char))
              (progn
                (let ((char (read-key "Move to Char: ")))
                  (if (char-equal (char-after (point)) char) (forward-char))
                  (search-forward (string char) nil t) (backward-char)
                  (setq last-search-char char))))
            )
           ((string= "" (string char))
            (if last-search-char
                (search-backward (string last-search-char) nil t)
              (progn
                (let ((char (read-key "Move backward to Char: ")))
                  (search-backward (string char) nil t)
                  (setq last-search-char char))))
            )
           (t
            (search-backward (string char) nil t)
            (setq last-search-char char)
            )
           ))))

ダウンロード

下記からソースをダウンロードしてload-pathの通った所に置いて (require 'search-one-word) としても利用可能です。
https://www.inabamasaki.com/arc/search-one-word.el

# シェルで
$ cd ~/emacs.d/elisp
$ wget https://www.inabamasaki.com/arc/search-one-word.el
;; Emacs
(require 'search-one-word)

使い方まとめ

M-x direct-search-forward-char もしくは M-x direct-search-backward-char で起動し minibufferの"Move to Char: "プロンプトに移動したい文字をタイプ。

リピートは文字を繰り返しタイプするか、"C-s"、"C-r" で移動。終わる時は"C-g"、または"C-q"か"ESC"。

キーバインドはお好みで。

(bind-keys ("C-{" . direct-search-backward-char)
           ("C-}" . direct-search-forward-char))
スポンサーリンク
スポンサーリンク