selected.elの設定 2022

はじめに

以前、selected.elの設定を記事にしたことがあった。

tam5917.hatenablog.com

今回はその設定を一部見直し、新しい関数に置き換えた部分があるので、それをまとめておこうというのが主旨である。 selected.el自体は以下の記事を読むのがよい。

qiita.com

設定

以下にコードを示す。クリックで展開する。requireされているパッケージは適当に探せばすぐに見つかるものばかりである。

コードを表示する

;; http://github.com/Kungsgeten/selected.el
(require 'selected)

;; https://github.com/minad/consult
(require 'consult)

;; https://github.com/emacsorphanage/anzu
(require 'anzu)

;; https://github.com/victorhge/iedit
(require 'iedit)

;; https://github.com/magnars/multiple-cursors.el
(require 'multiple-cursors)

;; https://github.com/xuchunyang/osx-dictionary.el
(require 'osx-dictionary)

;; http://www.emacswiki.org/emacs/download/replace-from-region.el
(require 'replace-from-region)

;; http://github.com/Malabarba/emacs-google-this
(require 'google-this)

;; https://github.com/remyferre/comment-dwim-2
(require 'comment-dwim-2)

;; https://gist.github.com/tam17aki/be6445e3b2b28a70ccce3546d2963680
(require 'consult-selected)

;; https://gist.github.com/tam17aki/f5046e9381436e783df385b42b11125b
(require 'consult-thing-at-point)

;; 参考 http://blog.fujimisakari.com/elisp_useful_for_programming/
(defun region-to-single-quote ()
  (interactive)
  (quote-formater "'%s'" "^\\(\"\\).*" ".*\\(\"\\)$"))
(defun region-to-double-quote ()
  (interactive)
  (quote-formater "\"%s\"" "^\\('\\).*" ".*\\('\\)$"))
(defun region-to-bracket ()
  (interactive)
  (quote-formater "\(%s\)" "^\\(\\[\\).*" ".*\\(\\]\\)$"))
(defun region-to-square-bracket ()
  (interactive)
  (quote-formater "\[%s\]" "^\\(\(\\).*" ".*\\(\)\\)$"))
(defun region-to-brace ()
  (interactive)
  (quote-formater "\%s\]" "^\\(\(\\).*" ".*\\(\)\\)$"))
(defun quote-formater (quote-format re-prefix re-suffix)
  (if mark-active
      (let* ((region-text (buffer-substring-no-properties
                           (region-beginning) (region-end)))
             (replace-func
              (lambda (re target-text)
                (replace-regexp-in-string re "" target-text nil nil 1)))
             (text (funcall replace-func re-suffix
                            (funcall replace-func re-prefix region-text))))
        (delete-region (region-beginning) (region-end))
        (insert (format quote-format text)))
    (error "Not Region selection")))

(defun my:google-this ()
  "検索確認をスキップして直接検索実行"
  (interactive)
  (google-this (current-word) t))

(setq google-this-location-suffix "co.jp")

(when (require 'selected nil t)

  ;; コメントアウト・アンコメントアウト
  (define-key selected-keymap (kbd ";") #'comment-dwim-2)

  ;; 選択した関数のヘルプを表示
  (define-key selected-keymap (kbd "f") #'describe-function)

  ;; 選択した変数のヘルプを表示
  (define-key selected-keymap (kbd "v") #'describe-variable)

  ;; 選択したシンボルのヘルプを表示
  (define-key selected-keymap (kbd "y") #'describe-symbol)

  ;; 辞書を引く (Mac限定)
  (define-key selected-keymap (kbd "d") #'osx-dictionary-search-pointer)

  ;; 置換関連
  (define-key selected-keymap (kbd "q") #'query-replace-from-region)
  (define-key selected-keymap (kbd "Q") #'anzu-query-replace)

  ;; リージョンの文字数や単語数をカウント
  (define-key selected-keymap (kbd "=") #'count-words-region)

  ;; 複数カーソルによるマーク
  (define-key selected-keymap (kbd "A") #'mc/mark-all-like-this)
  (define-key selected-keymap (kbd "n") #'mc/mark-next-like-this)
  (define-key selected-keymap (kbd "p") #'mc/mark-previous-like-this)
  (define-key selected-keymap (kbd "u") #'mc/unmark-next-like-this)
  (define-key selected-keymap (kbd "U") #'mc/unmark-previous-like-this)
  (define-key selected-keymap (kbd "s") #'mc/skip-to-next-like-this)
  (define-key selected-keymap (kbd "S") #'mc/skip-to-previous-like-this)

  ;; 同時編集 iedit
  ;; デフォルトではバッファ全体にカーソルが分身して編集可能になるので、
  ;; ナローイングを適宜用いる
  (define-key selected-keymap (kbd "i") #'iedit-mode)

  ;; 参考 http://blog.fujimisakari.com/elisp_useful_for_programming/
  ;; リージョンをシングルクオートで囲う
  (define-key selected-keymap (kbd "\'") #'region-to-single-quote)

  ;; リージョンをダブルクオートで囲う
  (define-key selected-keymap (kbd "\"") #'region-to-double-quote)

  ;; リージョンをブラケット(カッコ)で囲う
  (define-key selected-keymap (kbd "(") #'region-to-bracket)

  ;; リージョンをカギカッコで囲う
  (define-key selected-keymap (kbd "[") #'region-to-square-bracket)

  ;; consult-line
  (define-key selected-keymap (kbd "w") #'consult-line-thing-at-point)

  ;; google 検索
  (define-key selected-keymap (kbd "g") #'my:google-this)

  ;; consultインターフェイスで選択
  (define-key selected-keymap (kbd "l") #'consult-selected)

  ;; 有効化
  (selected-global-mode 1))

主な変更点

  • counselの削除
  • swiperの削除
  • consultの導入(consult-apropos, consult-selected, consult-line-thing-at-point

consult-selectedconsult-line-thing-at-pointは新たに書いた関数なので、以下で詳しく説明する。

consult系の関数群の導入

takaxp氏により、helm-selected.elcounsel-selected.elが書かれていたので、これのconsult用の代替ライブラリとしてconsult-selected.elを書いた。

さらに、選択されたリージョンを元にconsult-lineを発動させるために、consult-thing-at-point.elを書いた。

このライブラリにより、consult-line-thing-at-pointという関数が提供されるので、これを適当なキーにバインドして使うことができる。

おわりに

selected.elは便利なので、利用を勧めたい。