문제

목표 C를 사용하기 시작했고 목표 C 모드는 완벽하게 작동합니다. 그러나 OBJC는 C 및 C ++와 마찬가지로 .h 파일을 사용합니다. 세 가지를 모두 사용할 수 있어야합니다. EMAC가 OBJC 모드 또는 C/C ++ 모드에 있어야하는지 알려주는 방법을 아는 사람이 있습니까?

편집 : 내가 요구하는 것에 약간의 혼란이있는 것 같습니다. 문제는 .M 파일과 관련된 일부 .H 파일과 .C 파일과 관련된 일부 .H 파일과 .CPP 파일과 관련된 일부 .H 파일이 있다는 것입니다. 내가 뭐야 원하다 C-Mode-Common-Hook 또는 어딘가에 객관적인 C.h 파일인지 확인한 다음 객관적인 C 모드 또는 무언가로 강제로 할 수있는 것입니다. 아이디어는 .h 파일을 열 수 있으며 자동으로 올바른 모드에 있습니다.

분명히 파일에있을 때 모드를 수동으로 변경할 수는 있지만 고통스럽고 탭을 누르고 엉뚱한 일이 발생할 때까지 종종 잊어 버립니다. 이것이 제가 지금 사용하고있는 솔루션입니다.

헤더 댓글이 아마도 올바른 방법이라고 생각하지만, 진정으로 유용하기 위해서는 Xcode를 가져 오는 방법을 알아 내야합니다.

edit2 :

현재 헤더 코멘트 솔루션을 사용하고 있습니다. Xcode가 주석을 자동으로 추가하는 방법을 알아낼 수있을 때까지 다음 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++ -*-

적절한. 자세한 내용 파일 변수 지정 EMACS 매뉴얼에서.

다른 팁

좋아, 파일에 특별한 의견을 제시 할 필요가없는 솔루션은 어떻습니까?

이것 좀 봐:

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

이는 EMACS의 내장 패키지를 사용하여 해당 .h/.cc 파일을 찾습니다. 따라서 방금 열린 헤더 파일이 C ++-모드의 파일에 해당하면 .h 파일이 해당 모드에 넣습니다. 소스가 OBJC 모드 파일 인 경우 헤더가 해당 모드에 넣습니다.

주석에 특별한 EMACS 변수가 필요하지 않습니다.

나는 사용할 것이다 eproject 내가 이것을 처리하는 데 도움이됩니다. 주어진 프로젝트 내에서 언어를 혼합하고 매치하지 않는다고 가정하면 .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 파일이 eproject의 변수를 설정하는 유일한 방법은 아닙니다. 객관적인 C 프로젝트를 감지 할 휴리스틱이있는 경우 eproject는 변수를 그런 식으로 얻을 수 있습니다.)

어쨌든, 이것이 당신을 위해 효과가 있다면, 내가 그것을 추가 할 수 있도록 알려주세요. eproject wiki.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top