[分享] selected.el

当选中一个区别之后,可以绑定一些键进行选区的操作。我的配置如下:

(use-package selected
  :load-path "packages/selected.el/"
  :hook (post-select-region . selected-minor-mode)
  :bind (:map selected-keymap
              ("q" . selected-off)
              ("u" . upcase-region)
              ("d" . downcase-region)
              ("c" . kill-ring-save)
              ("x" . kill-region)
              ("w" . count-words-region)
              ("s" . my/search)
              ("t" . my/gts-do-translate)
              ("m" . apply-macro-to-region-lines)
              ("\\" . indent-region)
              (";" . comment-dwim)))

my/search 的内容如下:

  (setq my/browser-engines
        '((DoubanMovie . "https://search.douban.com/movie/subject_search?search_text=")
          (DoubanBook . "https://search.douban.com/book/subject_search?search_text=")
          (Zhihu . "https://www.zhihu.com/search?type=content&q=")
          (Google . "https://www.google.com/search?q=")
          (Scholar . "https://scholar.google.com/scholar?hl=zh-CN&as_sdt=0%2C33&q=")
          (Github . "github.com/search?q=")
          (Youtube . "http://www.youtube.com/results?aq=f&oq=&search_query=")))

  ;;;###autoload
  (defun my/search ()
    "Search using the specified engine for the text in the currently selected region or user input."
    (interactive)
    (let* ((selected-engine (completing-read "Choose a search engine: " (mapcar 'car my/browser-engines) nil t))
           (selected-url (cdr (assoc (intern selected-engine) my/browser-engines))))
      (let* ((region (if (region-active-p)
                         (buffer-substring-no-properties (region-beginning) (region-end))
                       (read-string "Enter search terms: ")))
             (encoded-region (url-encode-url region))
             (search-url (concat selected-url encoded-region)))
        (browse-url search-url)))
    (when (region-active-p)
      (deactivate-mark)))

流程示例:比如 Telega 关注了一些影视频道,有时候看到电影名想知道这个电影怎样,就选中电影名然后按“s”,调用 DoubanMovie 查看下评分和影评。原先的操作需要选中区域、复制区域,使用 webjump 选用 doubanmovie 再粘贴复制的内容进行搜索,略显复杂。

3 个赞

这个有按键提示语吗?我用的是hydra,绑定的键太多,根本记不住每个键是做什么的(也没必要记),虽然按了很多回了,但每次按的时候还是会习惯扫一下提示语,确定下没按错

这个需求直接用hydra+绑定快捷键或者自动触发就可以实现了,不需要minor mode

1 个赞

hydra需要绑定一个leader-key来触发吧,我理解的selected.el的区别在于没有leader-key,选中文本后即可以直接通过按键触发绑定的函数,更适用于那些基于当前选中文本的操作。

有什么包能提供方便地文本选择功能?

不太清楚你说的“文本选择”具体指什么,如果是选中一个region,我一般用 expand-region

和selected一样的原理,用hook就可以自动触发