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 " )