यह कैसे पता लगाएं कि एमएसीएस टर्मिनल-मोड में है?


81

मेरी .emacsफाइल में, मेरे पास कमांड्स हैं जो केवल ग्राफिकल मोड (जैसे (set-frame-size (selected-frame) 166 100)) में समझ में आता है । मैं इन्हें केवल चित्रमय मोड में कैसे चलाता हूं और टर्मिनल मोड (यानी emacs -nw) में नहीं।

धन्यवाद!

जवाबों:


101

window-systemचर लिस्प कार्यक्रमों क्या खिड़की प्रणाली Emacs के तहत चल रहा है बताता है। संभव मान हैं

एक्स
Emacs X का उपयोग करके फ्रेम प्रदर्शित कर रहा है।
W32
Emacs देशी MS-Windows GUI का उपयोग करके फ्रेम प्रदर्शित कर रहा है।
एनएस
एमएसीएस नेक्स्टस्टेप इंटरफेस (जीएनयूस्टेप और मैक ओएस एक्स पर प्रयुक्त) का उपयोग करके फ्रेम प्रदर्शित कर रहा है।
पीसी
Emacs MS-DOS डायरेक्ट स्क्रीन राइट्स का उपयोग करके फ्रेम प्रदर्शित कर रहा है।
शून्य
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) == "ns" मेरे मैक पर
निकोलस

43

उत्तर 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


धन्यवाद! मैं शब्दावली पर स्पष्ट नहीं हूं, लेकिन अगर मैं (विभाजन-खिड़की-क्षैतिज रूप से) चलाता हूं, तो क्या यह एक नया फ्रेम बनाता है और इस तरह इसे आमंत्रित करता है? या क्या यह केवल इस उदाहरण से जुड़ी एक पूरी तरह से नई विंडो बनाते समय चलता है (जैसे कि emacsclient का उपयोग करके)?
स्लिगोकी

6
एमएसीएस शब्दावली "फ्रेम" का उपयोग करती है, जिसका अर्थ है कि आप सामान्य रूप से "विंडो" कहते हैं, और यह "विंडो" का उपयोग यह बताने के लिए करता है कि आप सामान्य रूप से "फलक" क्या कहेंगे। भ्रामक, लेकिन आपको अंततः इसकी आदत हो जाती है। उम्मीद है की वो मदद करदे। :-)
संन्यासी

4
और, अपने प्रश्न का स्पष्ट रूप से उत्तर देने के लिए: split-window-horizontallyवर्तमान विंडो ("फ्रेम") में वर्तमान में सक्रिय फलक ("विंडो") को दो पैन ("विंडो") में विभाजित करता है।
१inc:

2
यह तब से काम नहीं करेगा: फ्रेम बनाने के बाद मेक-फ्रेम-फ़ंक्शन चलाया जाता है। यह प्रारंभिक स्टार्टअप फ्रेम (स्टार्टअप पर) पर लागू नहीं होता है क्योंकि फ्रेम के पहले से ही निर्मित होने के बाद आपके .emacs को पढ़ा जाता है। stackoverflow.com/questions/875667/…
रुबाइक

1
@ रूबाइक सहमत हो गए। मुझे यह उल्लेख करना चाहिए कि फ्रेम-संबंधी हुक कार्यों को उस तरह जोड़ना आवश्यक है 'after-init-hook
पवित्रता

8

विंडो-सिस्टम `C सोर्स कोड’ में परिभाषित एक चर है। इसका मान x है

प्रलेखन: खिड़की प्रणाली का नाम जिसके माध्यम से चयनित फ्रेम प्रदर्शित होता है। मान एक प्रतीक है - उदाहरण के लिए, एक्स विंडो के लिए `x’। यदि पाठ केवल-टर्मिनल पर है, तो मान शून्य है।

मूल रूप से एक:

(if window-system
    (progn
      (something)
      (something-else)))

डिस्प्ले-ग्राफिक-पी के पक्ष में पदावनत किया गया
iv वेल्च

6

यदि गुई मोड में है, तो निम्नलिखित सही होगा।

(यदि विंडो-सिस्टम)


2

मैंने विंडो-नाम की कार्यक्षमता को लपेटने के लिए एक अतिरिक्त फ़ंक्शन को परिभाषित किया है क्योंकि मैं हर जगह एमएसीएस का उपयोग कर रहा हूं, अर्थात् टर्मिनल से और ग्राफिक्स मोड में और लिनक्स और मैकओएस में:

(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)))

इसे विंडोज या पुराने सिस्टम जैसी अन्य प्रणालियों को कवर करने के लिए बढ़ाया जा सकता है जहां एक सीरियल टर्मिनल का उपयोग किया जाता है। लेकिन मेरे पास ऐसा करने का कोई समय नहीं है ;;;

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.