मेरी .emacsफाइल में, मेरे पास कमांड्स हैं जो केवल ग्राफिकल मोड (जैसे (set-frame-size (selected-frame) 166 100)) में समझ में आता है । मैं इन्हें केवल चित्रमय मोड में कैसे चलाता हूं और टर्मिनल मोड (यानी emacs -nw) में नहीं।
धन्यवाद!
जवाबों:
window-systemचर लिस्प कार्यक्रमों क्या खिड़की प्रणाली Emacs के तहत चल रहा है बताता है। संभव मान हैं
से दस्तावेज़ ।
संपादित करें : ऐसा लगता है कि विंडो-सिस्टम के पक्ष में पदावनत किया गया है display-graphic-p(स्रोत: Ch f विंडो-सिस्टम RET emacs 23.3.1 पर)।
(display-graphic-p &optional DISPLAY)
Return non-nil if DISPLAY is a graphic display.
Graphical displays are those which are capable of displaying several
frames and several different fonts at once. This is true for displays
that use a window system such as X, and false for text-only terminals.
DISPLAY can be a display name, a frame, or nil (meaning the selected
frame's display).
तो आप क्या करना चाहते हैं:
(if (display-graphic-p)
(progn
;; if graphic
(your)
(code))
;; else (optional)
(your)
(code))
और अगर आपके पास एक और खंड नहीं है, तो आप बस:
;; more readable :)
(when (display-graphic-p)
(your)
(code))
उत्तर window-systemदेने वाले और display-graphic-pगलत नहीं हैं, लेकिन वे पूरी तस्वीर नहीं बताते हैं।
वास्तव में, एक एकल Emacs उदाहरण में कई फ्रेम हो सकते हैं, जिनमें से कुछ एक टर्मिनल पर हो सकते हैं, और अन्य जिनमें से एक विंडो सिस्टम पर हो सकता है। यह कहना है, आप window-systemएक ही Emacs उदाहरण के भीतर भी विभिन्न मूल्यों को प्राप्त कर सकते हैं ।
उदाहरण के लिए, आप एक विंडो-सिस्टम एमएसीएस शुरू कर सकते हैं और फिर emacsclient -tएक टर्मिनल में इसके माध्यम से कनेक्ट कर सकते हैं ; जिसके परिणामस्वरूप टर्मिनल फ्रेम के nilलिए एक मूल्य दिखाई देगा window-system। इसी तरह, आप डेमॉन मोड में ईमैक्स शुरू कर सकते हैं, फिर बाद में इसे ग्राफिकल फ्रेम बनाने के लिए कह सकते हैं।
इसके परिणामस्वरूप, अपने .emacs में कोड डालने से बचें जो निर्भर करता है window-system। इसके बजाय, set-frame-sizeएक हुक फ़ंक्शन में अपने उदाहरण की तरह कोड डालें जो एक फ्रेम बनने के बाद चलता है:
(add-hook 'after-make-frame-functions
(lambda ()
(if window-system
(set-frame-size (selected-frame) 166 100)))))
ध्यान दें कि 'after-make-frame-functionsहुक प्रारंभिक फ्रेम के लिए नहीं चलाया गया है, इसलिए अक्सर यह भी आवश्यक है कि फ्रेम-संबंधित हुक फ़ंक्शन को ऊपर से जोड़ा जाए 'after-init-hook।
split-window-horizontallyवर्तमान विंडो ("फ्रेम") में वर्तमान में सक्रिय फलक ("विंडो") को दो पैन ("विंडो") में विभाजित करता है।
'after-init-hook।
विंडो-सिस्टम `C सोर्स कोड’ में परिभाषित एक चर है। इसका मान x है
प्रलेखन: खिड़की प्रणाली का नाम जिसके माध्यम से चयनित फ्रेम प्रदर्शित होता है। मान एक प्रतीक है - उदाहरण के लिए, एक्स विंडो के लिए `x’। यदि पाठ केवल-टर्मिनल पर है, तो मान शून्य है।
मूल रूप से एक:
(if window-system
(progn
(something)
(something-else)))
यदि गुई मोड में है, तो निम्नलिखित सही होगा।
(यदि विंडो-सिस्टम)
मैंने विंडो-नाम की कार्यक्षमता को लपेटने के लिए एक अतिरिक्त फ़ंक्शन को परिभाषित किया है क्योंकि मैं हर जगह एमएसीएस का उपयोग कर रहा हूं, अर्थात् टर्मिनल से और ग्राफिक्स मोड में और लिनक्स और मैकओएस में:
(defun window-system-name()
(cond ((eq system-type 'gnu/linux) (if (display-graphic-p) "x" "nox"))
((eq system-type 'darwin) (if (display-graphic-p) "mac" "nox"))
(t (error "Unsupported window-system") nil)))
इसे विंडोज या पुराने सिस्टम जैसी अन्य प्रणालियों को कवर करने के लिए बढ़ाया जा सकता है जहां एक सीरियल टर्मिनल का उपयोग किया जाता है। लेकिन मेरे पास ऐसा करने का कोई समय नहीं है ;;;