engine-mode
engine-mode
ist ein globaler Nebenmodus für Emacs. Damit können Sie ganz einfach Suchmaschinen definieren, sie an Tastenkombinationen binden und sie bequem von Ihrem Editor aus abfragen.
Angenommen, wir möchten GitHub einfach durchsuchen können:
(defengine github
" https://github.com/search?ref=simplesearch&q=%s " )
Dies definiert eine interaktive Funktion engine/search-github
. Bei der Ausführung nimmt es die ausgewählte Region (oder fordert zur Eingabe auf, wenn keine Region ausgewählt ist) und durchsucht GitHub danach und zeigt die Ergebnisse in Ihrem Standardbrowser an.
Das defengine
Makro kann auch eine optionale Tastenkombination mit dem Präfix engine/keymap-prefix
(standardmäßig Cx /
) annehmen. Diese Tastenkombination wird in einen Aufruf von kbd
eingebunden.
(defengine duckduckgo
" https://duckduckgo.com/?q=%s "
:keybinding " d " )
Cx / d
ist jetzt an die neue Funktion engine/search-duckduckgo
gebunden! Raffiniert.
Wenn Sie ein Video zum Warum und Warum dieses Modus sehen möchten, schauen Sie sich den Vortrag an, den @hrs bei EmacsNYC gehalten hat.
engine-mode
ist auf MELPA verfügbar.
Verwendung use-package
:
( use-package engine-mode
:ensure t
:config
(engine-mode t ))
Sie können es auch wie jede andere Elisp-Datei installieren, indem Sie es Ihrem Ladepfad hinzufügen und global aktivieren:
( require 'engine-mode )
(engine-mode t )
engine-mode
verwendet die Variable engine/browser-function
um zu bestimmen, welchen Browser er zum Öffnen der von ihm erstellten URL verwenden soll. Um den Standardbrowser zu ändern, definieren Sie engine/browser-function
neu. Um beispielsweise immer den integrierten eww
-Browser von Emacs zu verwenden:
( setq engine/browser-function 'eww-browse-url )
engine/browser-function
ist standardmäßig browse-url-browser-function
, die Emacs global zum Öffnen von Links verwendet.
Die Implementierung der Variable browse-url-browser-function
enthält eine umfassende Liste möglicher Browserfunktionen. Sie können dorthin gelangen, indem Sie auf Ch v browse-url-browser-function <RETURN>
drücken und dem Link zu browse-url.el
folgen.
Um den Browser nur für eine einzelne Engine zu ändern, verwenden Sie beim Definieren der Engine das Schlüsselwortargument :browser
. Um beispielsweise eww
nur für Ihre GitHub-Suchergebnisse zu verwenden, versuchen Sie Folgendes:
(defengine github
" https://github.com/search?ref=simplesearch&q=%s "
:browser 'eww-browse-url )
Wie bereits erwähnt, finden Sie in der Implementierung der browse-url-browser-function
eine endgültige Liste der Browser.
Das Standard-Keymap-Präfix für engine-mode
ist Cx /
. Wenn Sie die Tastaturbelegung an ein zusätzliches Präfix binden möchten (z. B. Cc s
), können Sie Folgendes tun:
(engine/set-keymap-prefix ( kbd " C-c s " ))
Wenn Sie use-package
verwenden, können Sie dasselbe erreichen mit:
:bind-keymap ( " C-c s " . engine-mode-prefixed-map)
defengine
weist jeder Engine einen angemessenen Standard-Docstring zu, aber Sie können diesen von Fall zu Fall mit dem Schlüsselwortargument :docstring
überschreiben:
(defengine ctan
" https://www.ctan.org/search/?x=1&PORTAL=on&phrase=%s "
:docstring " Search the Comprehensive TeX Archive Network (ctan.org) " )
Eine Suchmaschine möchte möglicherweise einen Suchbegriff auf irgendeine Weise umwandeln, bevor sie den Begriff in die URL interpoliert. Vielleicht sollte der Begriff eine andere Kodierung haben, anders großgeschrieben werden oder, ähm, durch ROT13 weitergeleitet werden. Was auch immer der Grund sein mag, Sie können eine benutzerdefinierte Transformation auf einen Suchbegriff anwenden, indem Sie eine Funktion über das Schlüsselwortargument :term-transformation-hook
an defengine
übergeben.
So können Sie beispielsweise alle Ihre DuckDuckGo-Suchanfragen UPCASE-fähig machen:
(defengine duckduckgo
" https://duckduckgo.com/?q=%s "
:term-transformation-hook upcase)
Oder um sicherzustellen, dass alle Ihre Abfragen als Latin-1 kodiert sind:
(defengine diec2
" dlc.iec.cat/results.asp?txtEntrada=%s "
:term-transformation-hook ( lambda ( term ) ( encode-coding-string term latin-1))
:keybinding " c " )
Sie können auch einen :term-transformation-hook
verwenden, um dafür zu sorgen, dass sich eine Engine anders verhält, wenn ein Präfixargument angegeben wird (z. B. indem Sie Cu
eingeben, bevor Sie die Engine aufrufen).
Einige Suchmaschinen unterstützen die Suche nach genauen Phrasen, indem sie die Suchzeichenfolge in doppelte Anführungszeichen setzen. Transformationen könnten in diesem Fall nützlich sein, um stattdessen eine Literalsuche durchzuführen, wenn das universelle Argument vorhanden ist:
(defengine duckduckgo
" https://duckduckgo.com/?q=%s "
:term-transformation-hook ( lambda ( term ) ( if current-prefix-arg
( concat " " " term " " " )
term ))
:keybinding " d " )
Wenn Sie Cx / d
eingeben, wird eine reguläre Suche durchgeführt. Wenn Sie jedoch Cu Cx / d
eingeben, wird Ihre Abfrage in Anführungszeichen gesetzt, bevor danach gesucht wird. Dies ist besonders nützlich, wenn Sie nach Inhalten der Region suchen.
Da viele Browser Schlüsselwortsuchen im gleichen Format wie im Engine-Modus speichern (das heißt, indem sie %s
in einer URL verwenden, um einen Suchbegriff anzugeben), ist es nicht allzu schwierig, sie in Emacs zu importieren.
@sshaw hat ein Skript zum Importieren aus Chrome unter OS X geschrieben. Vielen Dank dafür!
webjump
Emacs verfügt über ein wunderschönes integriertes webjump
Paket, das es dem Benutzer ermöglicht, eine Reihe von URLs zu definieren, Suchbegriffe darin zu interpolieren und sie im Browser aufzurufen.
Warum könnten Sie engine-mode
anstelle von webjump
verwenden?
engine-mode
für jede Engine eine Funktion definiert, können Tastenkombinationen im engine-mode
direkt bestimmten Suchvorgängen zugeordnet werden.eww
durchführen möchten, ist das im engine-mode
trivial.engine-mode
. Wenn Sie beispielsweise eine Region ausgewählt haben, verwendet engine-mode
diese als Suchabfrage, während webjump
sie ignoriert und eine leere Eingabeaufforderung anbietet. Wenn Sie an diesen Funktionen nicht interessiert sind, ist webjump
eine gute Wahl! Ehrlich gesagt hätte sich der Autor von engine-mode
wahrscheinlich nicht die Mühe gemacht, es zu schreiben, wenn er damals gewusst hätte, dass webjump
existiert. ?
(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 " )