2013-02-05 9 views
10

मैं Emacs में निम्नलिखित खरोज प्राप्त करने के लिए कोशिश कर रहा हूँ के लिए अलग खरोज:Emacs: वर्ग और struct

class A 
{ 
    // I ALWAYS use access labels in classes 

    public: // access-label 
     int member; // inclass 
}; 

struct B 
{ 
    // I NEVER use access labels in structs 

    int member; // inclass 
}; 
हालांकि निम्नलिखित विन्यास फाइल के साथ

...

(defun my-cpp-mode() 
    "My C++ mode" 
    (c++-mode) 
    (c-set-style "K&R") 
    (setq c-basic-offset 4) 
    (c-set-offset 'access-label '-) 
    (c-set-offset 'inclass '++) 
    ;; ... 
    (setq mode-name "My C++") 
) 
(add-to-list 'auto-mode-alist '("\\.[ch]p?p?\\'" . my-cpp-mode)) 

... मैं केवल प्राप्त:

class A 
{ 
    public: // access-label 
     int member; // inclass 
}; 

struct B 
{ 
     // this indentation is too long 
     int member; // inclass 
}; 
पाठ्यक्रम है कि के

है क्योंकि:

012,
    खरोज के लिए
  • वहाँ स्पष्ट रूप से "वर्ग" और "struct" के बीच कोई अंतर नहीं है, (यह सब "inclass" है)
  • "inclass" सामान की खरोज पहुँच लेबल या नहीं की उपस्थिति पर निर्भर नहीं करता ।

कोई विचार है कि मैं कक्षा/संरचना या एक्सेस लेबल्स की उपस्थिति पर निर्भर सामानों का इंडेंटेशन कैसे कर सकता हूं?

+0

मुझे लगता है कि आप सिर्फ सार्वजनिक चाहते हैं: और निजी: इंडेंटेशन स्तर जोड़ने के लिए नहीं। – djechlin

+0

धन्यवाद लेकिन यदि आप एक ही कॉलम पर "{" और "public:" का मतलब है, तो ऐसा नहीं है जो मैं चाहता हूं। – Aurelien

+1

मैं आपकी इच्छा को समझ सकता हूं, और पर्याप्त tweaking दिया जाना चाहिए यह संभव होना चाहिए। दूसरी तरफ, यह अच्छी तरह से हो सकता है कि यह आसानी से हासिल नहीं किया जाता है, क्योंकि वर्गों और संरचनाओं के बीच गैर-भेद सी ++ में बहुत गहराई से चलता है: आप संरचनाओं के लिए एक्सेस विनिर्देशों का भी उपयोग कर सकते हैं। चूंकि यह उपयोग दुर्लभ है, हालांकि, मैं इस प्रश्न को +1 कर दूंगा और यह देखने में दिलचस्पी होगी कि कोई समाधान चालू है या नहीं। – MvG

उत्तर

7

न्यू उत्तर

मैं सटीक आवश्यकता है कि आप अपने प्रश्न में कहा था में भाग गया। मुझे अपनी नई परियोजना की कोडिंग शैली के अनुसार इंडेंटेशन सेट करना पड़ा। कुछ शोध के बाद, मैंने इसे Custom Line-up Functions का उपयोग करके हासिल किया।

अपने my-cpp-mode इस तरह देखने के लिए संशोधित करें:

(defun my-c-lineup-inclass (langelem) 
    (let ((inclass (assoc 'inclass c-syntactic-context))) 
    (save-excursion 
     (goto-char (c-langelem-pos inclass)) 
     (if (or (looking-at "struct") 
       (looking-at "typedef struct")) 
      '+ 
     '++)))) 

(defun my-cpp-mode() 
    "My C++ mode" 
    (c++-mode) 
    (c-set-style "K&R") 
    (setq c-basic-offset 4) 
    (c-set-offset 'access-label '-) 
    (c-set-offset 'inclass 'my-c-lineup-inclass) 
    ;; ... 
    (setq mode-name "My C++") 
) 

यदि यह जवाब स्वीकार्य है, मैं आगे जाना है और वर्ष जवाब निकाल देंगे।

ओल्ड उत्तर

आप क्या हासिल करने की कोशिश कर रहे हैं के आधार पर, मैं एक अलग दृष्टिकोण का सुझाव दे सकते? आप कक्षा और वर्ग के सदस्यों की तुलना में एक अलग इंडेंटेशन स्तर पर एक्सेस लेबल चाहते हैं। इसे प्राप्त करने के लिए निम्नलिखित का प्रयोग करें।

(access-label . /) 

Emacs प्रलेखन से: - ', ++', -', *', or/' तो `का एक सकारात्मक या नकारात्मक एकाधिक सी बुनियादी ऑफसेट

तो OFFSET प्रतीकों +', में से एक है 'बेस इंडेंटेशन में जोड़ा गया है; क्रमशः 1, -1, 2, -2, 0.5, और -0.5।

यहां परिभाषित कस्टम शैलियों में से एक से स्निपेट है।

(c-add-style 
"xyz-style" 
'((indent-tabs-mode . nil) 
    (fill-column . 75) 
    (c-basic-offset . 4) 
    (c-offsets-alist . (
         (access-label . /) 
         (inextern-lang . 0) 
         (innamespace . 0) 
         (member-init-intro . ++) 
         )))) 

4 को c-basic-offset सेट के साथ, (access-label . /) पहुँच लेबल के लिए 2 रिक्त स्थान की एक नकारात्मक खरोज कहते हैं। अपने नमूना कोड पर मेरे इंडेंटेशन मोड का वास्तविक परिणाम यहां दिया गया है।

class A 
{ 
    // I ALWAYS use access labels in classes 

    public: // access-label 
    int member; // inclass 
}; 

struct B 
{ 
    // I NEVER use access labels in structs 

    int member; // inclass 
}; 

मैं इस मोड की अनुशंसा करता हूं क्योंकि, सदस्य चर/संरचना सदस्यों का इंडेंटेशन स्तर सुसंगत है। एफडब्ल्यूआईडब्ल्यू, Google C Style एक ही दृष्टिकोण का पालन करता है।

जहां तक ​​मैं कह सकता हूं, कोई वर्ग सदस्य या संरचना सदस्य (inclass sytax तत्व) के बीच अंतर नहीं कर सकता है। आप किसी क्षेत्र पर सिंटैक्टिक विश्लेषण करने के लिए M-x c-syntactic-information-on-region का उपयोग कर सकते हैं। उदाहरण पर आपके जैसे एक विश्लेषण निम्नलिखित उत्पन्न करता है। आउटपुट से, यदि आप कक्षा या संरचना में हैं तो अंतर करने के लिए कुछ भी नहीं है।

class A         // ((topmost-intro 1)) 
{          // ((class-open 1)) 
             // ((inclass 64) (topmost-intro 64) (comment-intro))I ALWAYS use access labels in classes 
             // ((inclass 64) (topmost-intro 64)) 
    public:        // ((inclass 64) (access-label 64))access-label 
    int member;       // ((inclass 64) (topmost-intro 64))inclass 
};          // ((class-close 1)) 
             // ((topmost-intro 503)) 
struct B        // ((topmost-intro 503)) 
{          // ((class-open 629)) 
             // ((inclass 694) (topmost-intro 694) (comment-intro))I NEVER use access labels in structs 
             // ((inclass 694) (topmost-intro 694)) 
    int member;       // ((inclass 694) (topmost-intro 694))inclass 
};          // ((class-close 629)) 
+0

हां, धन्यवाद, यह वास्तव में समझौता है जिसका मैंने उपयोग करने का निर्णय लिया है, इसलिए मैं आपका जवाब +1 कर दूंगा क्योंकि इसमें बहुत से लोग हैं। लेकिन जैसा कि आपने कहा था कि यह वास्तविक प्रश्न का उत्तर नहीं देता है। – Aurelien

+1

आपके आखिरी संपादन में ठीक है आप दिखाते हैं कि यह संभव नहीं है, जो अब निश्चित रूप से प्रश्न का उत्तर देता है। धन्यवाद। – Aurelien

+0

यह मानता है कि 'स्ट्रक्चर' में हमेशा कोई एक्सेस लेबल नहीं है। मेरी इच्छा है कि एक समाधान था जो पहचान लेता है जब एक्सेस लेबल मौजूद होते हैं ... – Arkadiy

0

मेरे प्रोजेक्ट पर कोडिंग मानकों को अब इस तरह के इंडेंटेशन की आवश्यकता है। Arkadiy की तरह, मैं एक समाधान पसंद करते हैं जो पहुंच लेबल का सम्मान करता है।

(defun indent-after-access-label (langelem) 
    "Return the appropriate indent for a class or a struct." 
    (save-excursion 
    (save-match-data 
     ;; Optimization to avoid at least a few calls to re-search-backward. 
     (if (assoc 'access-label c-syntactic-context) 
      '++ 
     (if (re-search-backward "\\(?:p\\(?:ublic\\|r\\(?:otected\\|ivate\\)\\)\\)" c-langelem-pos langelem) t) 
      '++ 
      '+))))) 

जैसा कि पहले उल्लेख, indent-after-acess-label प्रतीक (c-set-offset या c-offset-alist, आदि के माध्यम से) inclass के लिए खरोज के रूप में स्थापित करने की आवश्यकता है: यह है कि मैं क्या के साथ आया है।

re-search-backward के कारण यह शायद ही आदर्श है, लेकिन यह काम करता है।

2

प्रवीण कुमार के जवाब के आधार पर ऊपर, मैं कस्टम लाइन अप समारोह की एक अलग संस्करण लागू किया: ब्रेस अगली पंक्ति पर था

(defun my-c-lineup-inclass (langelem) 
    (let ((inclass (assoc 'inclass c-syntactic-context))) 
    (save-excursion 
     (c-beginning-of-defun) ; This sees the correct string. 
     (if (or (looking-at "struct") 
       (looking-at "typedef struct")) 
      '+ 
     '++)))) 

; In particular, the following offsets need to be specified: 
(c-set-offset 'access-label '-) 
(c-set-offset 'inclass 'my-c-lineup-inclass) 
; ... 

मूल कोड के मामले में काम नहीं किया, यानी

struct foo 
{ 
     int bar; 
}; 

अभी भी "++" को इंडेंट करेगा।

अस्वीकरण: मुझे कोई लिस्प नहीं पता है। मैंने अभी खेला और यह मेरे लिए काम करता है। मुझे नहीं पता, उदाहरण के लिए, यदि इसके साथ जुड़े कोई प्रदर्शन समस्याएं हैं।

+0

'(सी-स्टार्ट-ऑफ-डिफुन) 'का उपयोग पूरी तरह से सही नहीं है, क्योंकि यह संरचना/कक्षाओं में परिभाषित इनलाइन फ़ंक्शंस के साथ काम नहीं करेगा ... –

संबंधित मुद्दे