engine-mode
engine-mode
是 Emacs 的全局次要模式。它使您能够轻松定义搜索引擎,将它们绑定到键绑定,并从编辑器中舒适地查询它们。
例如,假设我们希望能够轻松搜索 GitHub:
(defengine github
" https://github.com/search?ref=simplesearch&q=%s " )
这定义了一个交互功能engine/search-github
。执行时,它将获取所选区域(如果未选择区域,则提示输入)并在 GitHub 中搜索,并在默认浏览器中显示结果。
defengine
宏还可以采用可选的按键组合,以engine/keymap-prefix
为前缀(默认为Cx /
)。该键绑定将包含在对kbd
调用中。
(defengine duckduckgo
" https://duckduckgo.com/?q=%s "
:keybinding " d " )
Cx / d
现在绑定到新功能engine/search-duckduckgo
!漂亮。
如果您想观看有关此模式的原因和原因的视频,请查看 @hrs 在 EmacsNYC 上的演讲。
engine-mode
在 MELPA 上可用。
使用use-package
:
( use-package engine-mode
:ensure t
:config
(engine-mode t ))
您还可以像安装任何其他 elisp 文件一样安装它,方法是将其添加到加载路径并全局启用它:
( require 'engine-mode )
(engine-mode t )
engine-mode
使用engine/browser-function
变量来确定应该使用哪个浏览器来打开它构造的 URL。要更改默认浏览器,请重新定义engine/browser-function
。例如,要始终使用 Emacs 的内置eww
浏览器:
( setq engine/browser-function 'eww-browse-url )
engine/browser-function
默认为browse-url-browser-function
,Emacs 在全局范围内使用它来打开链接。
browse-url-browser-function
变量的实现包含可能的浏览器功能的完整列表。您可以通过点击Ch v browse-url-browser-function <RETURN>
并点击browse-url.el
链接来实现这一点。
要仅更改单个引擎的浏览器,请在定义引擎时使用:browser
关键字参数。例如,要仅将eww
用于 GitHub 搜索结果,请尝试:
(defengine github
" https://github.com/search?ref=simplesearch&q=%s "
:browser 'eww-browse-url )
如前所述,请参阅browse-url-browser-function
的实现以获取明确的浏览器列表。
engine-mode
的默认键盘映射前缀是Cx /
。如果您想将键盘映射绑定到附加前缀(例如Cc s
),您完全可以:
(engine/set-keymap-prefix ( kbd " C-c s " ))
如果您使用use-package
,您可以通过以下方式实现相同的效果:
:bind-keymap ( " C-c s " . engine-mode-prefixed-map)
defengine
为每个引擎分配一个合理的默认文档字符串,但您可以根据具体情况使用:docstring
关键字参数覆盖它:
(defengine ctan
" https://www.ctan.org/search/?x=1&PORTAL=on&phrase=%s "
:docstring " Search the Comprehensive TeX Archive Network (ctan.org) " )
引擎可能希望在将搜索词插入 URL 之前以某种方式对其进行转换。也许该术语应该有不同的编码,或者大写不同,或者,呃,通过 ROT13 传递。无论出于何种原因,您都可以通过:term-transformation-hook
关键字参数将函数传递给defengine
对搜索词应用自定义转换。
例如,要大写所有 DuckDuckGo 搜索:
(defengine duckduckgo
" https://duckduckgo.com/?q=%s "
:term-transformation-hook upcase)
或者,确保所有查询都编码为 latin-1:
(defengine diec2
" dlc.iec.cat/results.asp?txtEntrada=%s "
:term-transformation-hook ( lambda ( term ) ( encode-coding-string term latin-1))
:keybinding " c " )
您还可以使用:term-transformation-hook
使引擎在给定前缀参数时表现不同(即在调用引擎之前键入Cu
)。
某些搜索引擎支持通过用双引号将搜索字符串括起来来查询精确的短语。在这种情况下,如果存在通用参数,则转换可能有助于执行文字搜索:
(defengine duckduckgo
" https://duckduckgo.com/?q=%s "
:term-transformation-hook ( lambda ( term ) ( if current-prefix-arg
( concat " " " term " " " )
term ))
:keybinding " d " )
键入Cx / d
将执行常规搜索,但键入Cu Cx / d
会在搜索之前将查询括在引号中。这在搜索该区域的内容时特别有用。
由于许多浏览器使用与引擎模式相同的格式保存关键字搜索(即通过在 url 中使用%s
来指示搜索词),因此将它们导入 Emacs 并不太难。
@sshaw 编写了一个从 OS X 上的 Chrome 导入的脚本。谢谢!
webjump
的比较Emacs 有一个非常可爱的内置webjump
包,它允许用户定义一组 URL,将搜索词插入其中,并在浏览器中访问它们。
为什么你可以使用engine-mode
而不是webjump
?
engine-mode
为每个引擎定义了一个函数,因此engine-mode
中的键绑定可以直接与特定搜索相关联。eww
中执行其他搜索,那么在engine-mode
中这很简单。engine-mode
的一些较小的 UI 便利性。例如,如果您选择了一个区域, engine-mode
将使用它作为搜索查询,而webjump
将忽略它并提供一个空提示。如果您对这些功能不感兴趣, webjump
是一个不错的选择!老实说,如果engine-mode
的作者当时知道webjump
的存在,他们可能就不会费心去写它了。 ?
(defengine amazon
" https://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=%s " )
(defengine duckduckgo
" https://duckduckgo.com/?q=%s "
:keybinding " d " )
(defengine github
" https://github.com/search?ref=simplesearch&q=%s " )
(defengine google
" https://www.google.com/search?ie=utf-8&oe=utf-8&q=%s "
:keybinding " g " )
(defengine google-images
" https://www.google.com/images?hl=en&source=hp&biw=1440&bih=795&gbv=2&aq=f&aqi=&aql=&oq=&q=%s " )
(defengine google-maps
" https://maps.google.com/maps?q=%s "
:docstring " Mappin' it up. " )
(defengine project-gutenberg
" https://www.gutenberg.org/ebooks/search/?query=%s " )
(defengine qwant
" https://www.qwant.com/?q=%s " )
(defengine stack-overflow
" https://stackoverflow.com/search?q=%s " )
(defengine twitter
" https://twitter.com/search?q=%s " )
(defengine wikipedia
" https://www.wikipedia.org/search-redirect.php?language=en&go=Go&search=%s "
:keybinding " w "
:docstring " Searchin' the wikis. " )
(defengine wiktionary
" https://www.wikipedia.org/search-redirect.php?family=wiktionary&language=en&go=Go&search=%s " )
(defengine wolfram-alpha
" https://www.wolframalpha.com/input/?i=%s " )
(defengine youtube
" https://www.youtube.com/results?aq=f&oq=&search_query=%s " )