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
.
على سبيل المثال، لتغيير جميع عمليات البحث في DuckDuckGo:
(defengine duckduckgo
" https://duckduckgo.com/?q=%s "
:term-transformation-hook upcase)
أو للتأكد من أن جميع استعلاماتك مشفرة بالصيغة اللاتينية-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 " )