engine-mode
engine-mode
est un mode mineur global pour Emacs. Il vous permet de définir facilement des moteurs de recherche, de les lier à des raccourcis clavier et de les interroger dans le confort de votre éditeur.
Par exemple, supposons que nous souhaitions pouvoir effectuer facilement une recherche sur GitHub :
(defengine github
" https://github.com/search?ref=simplesearch&q=%s " )
Ceci définit une fonction interactive engine/search-github
. Une fois exécuté, il prendra la région sélectionnée (ou demandera une saisie, si aucune région n'est sélectionnée) et la recherchera sur GitHub, affichant les résultats dans votre navigateur par défaut.
La macro defengine
peut également prendre une combinaison de touches facultative, préfixée par engine/keymap-prefix
(qui est par défaut Cx /
). Cette liaison de touches sera enveloppée dans un appel à kbd
.
(defengine duckduckgo
" https://duckduckgo.com/?q=%s "
:keybinding " d " )
Cx / d
est désormais lié à la nouvelle fonction engine/search-duckduckgo
! Chouette.
Si vous souhaitez voir une vidéo sur le pourquoi et le comment de ce mode, consultez la conférence donnée par @hrs à EmacsNYC.
engine-mode
est disponible sur MELPA.
Utilisation use-package
:
( use-package engine-mode
:ensure t
:config
(engine-mode t ))
Vous pouvez également l'installer comme n'importe quel autre fichier elisp en l'ajoutant à votre chemin de chargement et en l'activant globalement :
( require 'engine-mode )
(engine-mode t )
engine-mode
utilise la variable engine/browser-function
pour déterminer quel navigateur il doit utiliser pour ouvrir l'URL qu'il construit. Pour modifier le navigateur par défaut, redéfinissez engine/browser-function
. Par exemple, pour toujours utiliser le navigateur eww
intégré d'Emacs :
( setq engine/browser-function 'eww-browse-url )
engine/browser-function
est par défaut browse-url-browser-function
, qu'Emacs utilise globalement pour ouvrir les liens.
L'implémentation de la variable browse-url-browser-function
contient une liste complète des fonctions de navigateur possibles. Vous pouvez y accéder en appuyant sur Ch v browse-url-browser-function <RETURN>
et en suivant le lien vers browse-url.el
.
Pour modifier le navigateur uniquement pour un seul moteur, utilisez l'argument de mot-clé :browser
lorsque vous définissez le moteur. Par exemple, pour utiliser eww
uniquement pour vos résultats de recherche GitHub, essayez :
(defengine github
" https://github.com/search?ref=simplesearch&q=%s "
:browser 'eww-browse-url )
Comme mentionné, consultez l'implémentation de la browse-url-browser-function
pour une liste définitive des navigateurs.
Le préfixe de clavier par défaut pour engine-mode
est Cx /
. Si vous souhaitez lier le keymap à un préfixe supplémentaire (par exemple, Cc s
), vous pouvez tout à fait :
(engine/set-keymap-prefix ( kbd " C-c s " ))
Si vous utilisez use-package
, vous pouvez obtenir la même chose avec :
:bind-keymap ( " C-c s " . engine-mode-prefixed-map)
defengine
attribue à chaque moteur une docstring par défaut raisonnable, mais vous pouvez la remplacer au cas par cas avec l'argument de mot-clé :docstring
:
(defengine ctan
" https://www.ctan.org/search/?x=1&PORTAL=on&phrase=%s "
:docstring " Search the Comprehensive TeX Archive Network (ctan.org) " )
Un moteur peut vouloir transformer un terme de recherche d'une manière ou d'une autre avant de l'interpoler dans l'URL. Peut-être que le terme devrait avoir un codage différent, ou être mis en majuscule différemment, ou, euh, être transmis via ROT13. Quelle que soit la raison, vous pouvez appliquer une transformation personnalisée à un terme de recherche en passant une fonction à defengine
via l'argument de mot-clé :term-transformation-hook
.
Par exemple, pour mettre en casse toutes vos recherches DuckDuckGo :
(defengine duckduckgo
" https://duckduckgo.com/?q=%s "
:term-transformation-hook upcase)
Ou, pour vous assurer que toutes vos requêtes sont codées en latin-1 :
(defengine diec2
" dlc.iec.cat/results.asp?txtEntrada=%s "
:term-transformation-hook ( lambda ( term ) ( encode-coding-string term latin-1))
:keybinding " c " )
Vous pouvez également utiliser un :term-transformation-hook
pour qu'un moteur se comporte différemment lorsqu'on lui donne un argument de préfixe (c'est-à-dire en tapant Cu
avant d'invoquer le moteur).
Certains moteurs de recherche prennent en charge les requêtes d'expressions exactes en plaçant la chaîne de recherche entre guillemets doubles. Les transformations pourraient être utiles dans ce cas pour effectuer une recherche littérale si l'argument universel est présent :
(defengine duckduckgo
" https://duckduckgo.com/?q=%s "
:term-transformation-hook ( lambda ( term ) ( if current-prefix-arg
( concat " " " term " " " )
term ))
:keybinding " d " )
Taper Cx / d
effectuera une recherche régulière, mais taper Cu Cx / d
mettra votre requête entre guillemets avant de la rechercher. C'est particulièrement utile lors de la recherche du contenu de la région.
Étant donné que de nombreux navigateurs enregistrent les recherches par mots-clés en utilisant le même format que le mode moteur (c'est-à-dire en utilisant %s
dans une URL pour indiquer un terme de recherche), il n'est pas trop difficile de les importer dans Emacs.
@sshaw a écrit un script pour importer depuis Chrome sur OS X. Merci pour cela !
webjump
Emacs dispose d'un package webjump
intégré parfaitement charmant qui permet à l'utilisateur de définir un ensemble d'URL, d'y interpoler des termes de recherche et de les visiter dans le navigateur.
Pourquoi pourriez-vous utiliser engine-mode
au lieu de webjump
?
engine-mode
définit une fonction pour chaque moteur, les raccourcis clavier en engine-mode
peuvent être associés directement à des recherches spécifiques.eww
, c'est trivial en engine-mode
.engine-mode
. Si vous avez sélectionné une région, par exemple, engine-mode
l'utilisera comme requête de recherche, tandis que webjump
l'ignorera et proposera une invite vide. Si ces fonctionnalités ne vous intéressent pas, webjump
est un excellent choix ! Honnêtement, l'auteur de engine-mode
n'aurait probablement pas pris la peine de l'écrire s'il avait su que webjump
existait à l'époque. ?
(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 " )