سؤال

وأنا البدء في استخدام موضوعي C، ووضع C موضوعي يعمل بشكل جيد تماما. ومع ذلك، يستخدم ObjC. ح الملفات، تماما مثل C و C ++. أنا بحاجة إلى أن يكون قادرا على استخدام كل ثلاثة. لا أحد يعرف كيفية الحصول على ايماكس لمعرفة ما إذا كان ينبغي أن يكون في وضع objC أو C / C ++ الوضع؟

وتحرير: يبدو أن هناك بعض الالتباس حول ما أنا أسأل عنه. المشكلة هي أن لدي بعض الملفات .H التي ترتبط مع ملفات .M، وبعض الملفات .H التي ترتبط مع ملفات .C وبعض التي ترتبط مع ملفات .CPP. ما أنا <م> تريد شيء أستطيع أن عصا في بلدي ج-وضع مشترك هوك أو في مكان ما من شأنها أن تحقق لمعرفة ما اذا كان على موضوعي C. ح ملف، ومن ثم إجبارها على موضوعي C-وضع ، أو شيء ما. والفكرة هي أن بعد ذلك يمكنني أن مجرد فتح ملف .h وسيكون تلقائيا في الوضع الصحيح.

من الواضح يمكنني تغيير يدويا الوضع عندما أكون في الملف، ولكن هذا الألم، وأنا كثيرا ما ننسى حتى أنا ضربت التبويب وشيء أحمق يحدث. هذا هو الحل أنا باستخدام الآن.

وأعتقد أن تعليق رأس هو على الأرجح الطريقة الصحيحة للقيام بذلك، ولكن من أجل أن تكون مفيدة حقا، ولست بحاجة لمعرفة كيفية الحصول على كسكودي لوضع تعليق في هناك عندما انها لإنشاء ملف بالنسبة لي ...

وEDIT2:

وأنا حاليا باستخدام الحل رأس تعليق. حتى أستطيع معرفة كيفية جعل كسكودي إضافة تعليق تلقائيا، أنا باستخدام وظيفة elisp التالية:

(defun bp-add-objC-comment ()
  "Adds the /* -*- mode: objc -*- */ line at the top of the file"
  (interactive)
  (objc-mode)
  (let((p (point)))
    (goto-char 0)
    (insert "/* -*- mode: objc -*- */\n")
    (goto-char (+ p  (length "/* -*- mode: objc -*- */\n")))))
هل كانت مفيدة؟

المحلول

ويمكنك وضع تعليق مثل هذا في السطر الأول من الملف:

/* -*- mode: objc -*- */

أو

// -*- mode: c++ -*-

وحسب الاقتضاء. مزيد من التفاصيل في تحديد المتغيرات الملف في دليل إيماكس.

نصائح أخرى

وطيب، ماذا عن الحل الذي لا يتطلب وضع تعليق خاص في الملف؟

والتحقق من ذلك:

;; need find-file to do this
(require 'find-file)
;; find-file doesn't grok objc files for some reason, add that
(push ".m" (cadr (assoc "\\.h\\'" cc-other-file-alist)))

(defun my-find-proper-mode ()
  (interactive)
  ;; only run on .h files
  (when (string-match "\\.h\\'" (buffer-file-name))
    (save-window-excursion
      (save-excursion
        (let* ((alist (append auto-mode-alist nil))  ;; use whatever auto-mode-alist has
               (ff-ignore-include t)                 ;; operate on buffer name only
               (src (ff-other-file-name))            ;; find the src file corresponding to .h
               re mode)
          ;; go through the association list
          ;; and find the mode associated with the source file
          ;; that is the mode we want to use for the .h file
          (while (and alist
                      (setq mode (cdar alist))
                      (setq re (caar alist))
                      (not (string-match re src)))
            (setq alist (cdr alist)))
          (when mode (funcall mode)))))))

(add-hook 'find-file-hook 'my-find-proper-mode)

وهذا يستخدم إيماكس "التي بنيت في حزمة للعثور على. ح الموافق / ملفات .CC. لذلك، إذا كان ملف الرأس التي فتحت للتو يتوافق مع ملف في c ++ - واسطة، ويحصل على وضع الملف .h في هذا الوضع، وإذا كان المصدر هو ملف objc واسطة، ورأس يحصل على وضع في هذا الوضع

ولا متغيرات إيماكس الخاصة في التعليقات المطلوبة.

وأود أن استخدام المشاريع الإلكترونية لمساعدتي التعامل مع هذا. على افتراض اللغات التي لا خلط والمباراة داخل مشروع معين، أنا فقط يمكن إنشاء ملف .eproject في جذر المشروع الذي يحتوي على النص:

:cc-header-type :objc

وبعد ذلك، فما استقاموا لكم فاستقيموا تعيين بعض نوع من الوضع الافتراضي لملفات .H:

(add-to-list 'auto-mode-alist '("[.]h$" . c-mode))

وبعد ذلك، إضافة هوك لهذا الوضع:

(add-hook 'c-mode-hook (lambda ()
    (let ((header-style (eproject-attribute :cc-header-type)))
        (when (and header-style
                   (string-match "[.]h$" (buffer-file-name)))
            (case header-style
                (:objc (objc-mode))
                (:c++  (c++-mode))
                (:c    (c-mode))))))

والآن سيتم تغيير الوضع تلقائيا وفقا إلى الإعداد الذي جعل في ملف .eproject. (لاحظ أن ملف .eproject ليست الطريقة الوحيدة لتعيين المتغيرات المشاريع الإلكترونية، وإذا كان لديك ارشادي للكشف عن مشاريع ج موضوعية، يمكن الحصول على المشاريع الإلكترونية متغير بهذه الطريقة أيضا)

وعلى أي حال، إذا كان هذا يعمل للكم، واسمحوا لي أن أعرف حتى أستطيع إضافته إلى المشاريع الإلكترونية ويكي .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top