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
. Например, чтобы всегда использовать встроенный браузер eww
Emacs:
( 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. Какой бы ни была причина, вы можете применить пользовательское преобразование к поисковому запросу, передав defengine
функцию через аргумент ключевого слова :term-transformation-hook
.
Например, чтобы UPCASE все ваши поисковые запросы 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
заключит ваш запрос в кавычки перед его поиском. Это особенно полезно при поиске содержимого региона.
Поскольку многие браузеры сохраняют результаты поиска по ключевым словам, используя тот же формат, что и в режиме движка (то есть, используя %s
в URL-адресе для обозначения условия поиска), импортировать их в Emacs не так уж и сложно.
@sshaw написал скрипт для импорта из Chrome в OS X. Спасибо за это!
webjump
В Emacs есть прекрасный встроенный пакет webjump
, который позволяет пользователю определять набор URL-адресов, вставлять в них условия поиска и посещать их в браузере.
Почему вы можете использовать engine-mode
вместо webjump
?
engine-mode
определяет функцию для каждого механизма, сочетания клавиш в engine-mode
могут быть напрямую связаны с конкретными поисковыми запросами.eww
, это тривиально в engine-mode
.engine-mode
. Например, если у вас выбран регион, 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 " )