engine-mode
engine-mode
es un modo menor global para Emacs. Le permite definir fácilmente motores de búsqueda, vincularlos a combinaciones de teclas y consultarlos desde la comodidad de su editor.
Por ejemplo, supongamos que queremos poder buscar fácilmente en GitHub:
(defengine github
" https://github.com/search?ref=simplesearch&q=%s " )
Esto define una función interactiva engine/search-github
. Cuando se ejecute, tomará la región seleccionada (o solicitará información, si no se selecciona ninguna región) y la buscará en GitHub, mostrando los resultados en su navegador predeterminado.
La macro defengine
también puede tomar una combinación de teclas opcional, con engine/keymap-prefix
(que por defecto es Cx /
). Esa combinación de teclas se incluirá en una llamada a kbd
.
(defengine duckduckgo
" https://duckduckgo.com/?q=%s "
:keybinding " d " )
Cx / d
ahora está vinculado a la nueva función engine/search-duckduckgo
! Hábil.
Si desea ver un video sobre los porqués de este modo, consulte la charla que dio @hrs en EmacsNYC.
engine-mode
está disponible en MELPA.
Usando use-package
:
( use-package engine-mode
:ensure t
:config
(engine-mode t ))
También puedes instalarlo como cualquier otro archivo elisp agregándolo a tu ruta de carga y habilitándolo globalmente:
( require 'engine-mode )
(engine-mode t )
engine-mode
usa la variable engine/browser-function
para determinar qué navegador debe usar para abrir la URL que construye. Para cambiar el navegador predeterminado, redefina engine/browser-function
. Por ejemplo, para utilizar siempre el navegador eww
integrado de Emacs:
( setq engine/browser-function 'eww-browse-url )
El valor predeterminado engine/browser-function
es browse-url-browser-function
, que Emacs usa globalmente para abrir enlaces.
La implementación de la variable browse-url-browser-function
contiene una lista completa de posibles funciones del navegador. Puede acceder a eso presionando Ch v browse-url-browser-function <RETURN>
y siguiendo el enlace a browse-url.el
.
Para cambiar únicamente el navegador de un único motor, utilice el argumento de palabra clave :browser
cuando defina el motor. Por ejemplo, para usar eww
solo para los resultados de búsqueda de GitHub, intente:
(defengine github
" https://github.com/search?ref=simplesearch&q=%s "
:browser 'eww-browse-url )
Como se mencionó anteriormente, consulte la implementación de la browse-url-browser-function
para obtener una lista definitiva de navegadores.
El prefijo del mapa de teclas predeterminado para engine-mode
es Cx /
. Si desea vincular el mapa de teclas a un prefijo adicional (por ejemplo, Cc s
), puede hacerlo:
(engine/set-keymap-prefix ( kbd " C-c s " ))
Si usa use-package
, puede lograr lo mismo con:
:bind-keymap ( " C-c s " . engine-mode-prefixed-map)
defengine
asigna a cada motor una cadena de documentación predeterminada razonable, pero puede anularla caso por caso con el argumento de palabra clave :docstring
:
(defengine ctan
" https://www.ctan.org/search/?x=1&PORTAL=on&phrase=%s "
:docstring " Search the Comprehensive TeX Archive Network (ctan.org) " )
Es posible que un motor desee transformar un término de búsqueda de alguna manera antes de interpolarlo en la URL. Tal vez el término debería tener una codificación diferente, o escribirse en mayúscula de manera diferente, o pasarse por ROT13. Cualquiera sea el motivo, puede aplicar una transformación personalizada a un término de búsqueda pasando una función para defengine
a través del argumento de palabra clave :term-transformation-hook
.
Por ejemplo, para poner en UPCASE todas sus búsquedas de DuckDuckGo:
(defengine duckduckgo
" https://duckduckgo.com/?q=%s "
:term-transformation-hook upcase)
O, para asegurarse de que todas sus consultas estén codificadas como latin-1:
(defengine diec2
" dlc.iec.cat/results.asp?txtEntrada=%s "
:term-transformation-hook ( lambda ( term ) ( encode-coding-string term latin-1))
:keybinding " c " )
También puede usar un :term-transformation-hook
para hacer que un motor se comporte de manera diferente cuando se le da un argumento de prefijo (es decir, escribir Cu
antes de invocar el motor).
Algunos motores de búsqueda admiten la consulta de frases exactas encerrando la cadena de búsqueda entre comillas dobles. Las transformaciones podrían ser útiles en este caso para realizar una búsqueda literal si el argumento universal está presente:
(defengine duckduckgo
" https://duckduckgo.com/?q=%s "
:term-transformation-hook ( lambda ( term ) ( if current-prefix-arg
( concat " " " term " " " )
term ))
:keybinding " d " )
Al escribir Cx / d
se realizará una búsqueda normal, pero al escribir Cu Cx / d
se envolverá la consulta entre comillas antes de buscarla. Esto es especialmente útil cuando se buscan contenidos de la región.
Dado que muchos navegadores guardan las búsquedas de palabras clave usando el mismo formato que el modo motor (es decir, usando %s
en una URL para indicar un término de búsqueda), no es demasiado difícil importarlas a Emacs.
@sshaw ha escrito un script para importar desde Chrome en OS X. ¡Gracias por eso!
webjump
Emacs tiene un paquete webjump
incorporado perfectamente encantador que permite al usuario definir un conjunto de URL, interpolar términos de búsqueda en ellas y visitarlas en el navegador.
¿Por qué podrías utilizar engine-mode
en lugar de webjump
?
engine-mode
define una función para cada motor, las combinaciones de teclas en engine-mode
se pueden asociar directamente con búsquedas específicas.eww
, eso es trivial en engine-mode
.engine-mode
. Si tiene una región seleccionada, por ejemplo, engine-mode
la usará como consulta de búsqueda, mientras que webjump
la ignorará y ofrecerá un mensaje vacío. Si no está interesado en estas funciones, webjump
es una excelente opción! Honestamente, el autor del engine-mode
probablemente no se habría molestado en escribirlo si hubiera sabido que existía webjump
en ese momento. ?
(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 " )