Skip to content

Instantly share code, notes, and snippets.

@fujimisakari
Last active August 29, 2015 14:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fujimisakari/c6b70e80fc9f84206ad6 to your computer and use it in GitHub Desktop.
Save fujimisakari/c6b70e80fc9f84206ad6 to your computer and use it in GitHub Desktop.
EmacsでiOS開発(objective-c)するための環境構築 ref: http://qiita.com/fujimisakari/items/a6ff082f0e8eddc09511
;; iOS SDKへのPATH
(defvar xcode:sdk "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk")
;; TABスペースは利用せず、半角スペースを4つにする(デフォルトのままでは2になってました)
(add-hook 'objc-mode-hook
'(lambda()
(setq c-basic-offset 4)
(setq tab-width 4)
(setq indent-tabs-mode nil)))
;; .hファイルもobjc-modeで開くけるようにする
(add-to-list 'magic-mode-alist
`(,(lambda ()
(and (string= (file-name-extension buffer-file-name) "h")
(re-search-forward "@\\<interface\\>"
magic-mode-regexp-match-limit t)))
. objc-mode))
;; FoundationやUIKit等のFrameworkの.hファイルを検索対象に含めるようにする
(setq xcode:frameworks (concat xcode:sdk "/System/Library/Frameworks"))
(setq cc-search-directories (list xcode:frameworks))
(defadvice ff-get-file-name (around ff-get-file-name-framework
(search-dirs
fname-stub
&optional suffix-list))
"Search for Mac framework headers as well as POSIX headers."
(or
(if (string-match "\\(.*?\\)/\\(.*\\)" fname-stub)
(let* ((framework (match-string 1 fname-stub))
(header (match-string 2 fname-stub))
(fname-stub (concat framework ".framework/Headers/" header)))
ad-do-it))
ad-do-it))
(ad-enable-advice 'ff-get-file-name 'around 'ff-get-file-name-framework)
(ad-activate 'ff-get-file-name)
;; 対になってる.hファイルと.mファイルをトグルできるようにする
(require 'find-file) ;; for the "cc-other-file-alist" variable
(nconc (cadr (assoc "\\.h\\'" cc-other-file-alist)) '(".m" ".mm"))
(define-key c-mode-base-map (kbd "C-c '") 'ff-find-other-file)
;; .hと.mを左右に並べて開く
(defun open-header-and-method-file ()
(interactive)
(other-window-or-split)
(ff-find-other-file))
(define-key objc-mode-map (kbd "C-c ;") 'open-header-and-method-file)
$ brew install clang-format
$ cd ~/ios_project
$ find . -name "*.[hm]" -follow -print | /usr/local/bin/gtags --gtagslabel=pygments-parser -f - ./
(require 'gtags)
;; ファイル保存時にGTAGSを更新する
(setq gtags-auto-UPDATE t)
;; 相対pathで表示
(setq gtags-path-style 'relative)
;; (setq gtags-path-style 'absolute)
;; *GTAGS SELECT* のバッファは1つだけ生成する
(setq gtags-select-buffer-single t)
;;; flymakeでシンタックスチェック
(defvar flymake-objc-compiler (executable-find "clang"))
(defvar flymake-objc-compile-default-options (list "-D__IPHONE_OS_VERSION_MIN_REQUIRED=30200" "-fsyntax-only" "-fobjc-arc" "-fblocks" "-fno-color-diagnostics" "-Wreturn-type" "-Wparentheses" "-Wswitch" "-Wno-unused-parameter" "-Wunused-variable" "-Wunused-value" "-isysroot" xcode:sdk))
(defvar flymake-last-position nil)
(defcustom flymake-objc-compile-options '("-I.")
"Compile option for objc check."
:group 'flymake
:type '(repeat (string)))
(defun flymake-objc-init ()
(let* ((temp-file (flymake-init-create-temp-buffer-copy
'flymake-create-temp-inplace))
(local-file (file-relative-name
temp-file
(file-name-directory buffer-file-name))))
(list flymake-objc-compiler (append flymake-objc-compile-default-options flymake-objc-compile-options (list local-file)))))
(defun flymake-display-err-minibuffer ()
(interactive)
(let* ((line-no (flymake-current-line-no))
(line-err-info-list
(nth 0 (flymake-find-err-info flymake-err-info line-no)))
(count (length line-err-info-list)))
(while (> count 0)
(when line-err-info-list
(let* ((file (flymake-ler-file (nth (1- count) line-err-info-list)))
(full-file (flymake-ler-full-file
(nth (1- count) line-err-info-list)))
(text (flymake-ler-text (nth (1- count) line-err-info-list)))
(line (flymake-ler-line (nth (1- count) line-err-info-list))))
(message "[%s] %s" line text)))
(setq count (1- count)))))
(defun flymake-display-err-minibuffer-safe ()
(ignore-errors flymake-display-err-minibuffer))
;; もともとのパターンにマッチしなかったので追加
(setq flymake-err-line-patterns
(cons
'("\\(.+\\):\\([0-9]+\\):\\([0-9]+\\): \\(.+\\)" 1 2 3 4)
flymake-err-line-patterns))
;; 拡張子 m と h に対して flymake を有効にする設定
(add-hook 'objc-mode-hook
(lambda ()
(push '("\\.m$" flymake-objc-init) flymake-allowed-file-name-masks)
(push '("\\.h$" flymake-objc-init) flymake-allowed-file-name-masks)
;; 存在するファイルかつ書き込み可能ファイル時のみ flymake-mode を有効にします
(if (and (not (null buffer-file-name)) (file-writable-p buffer-file-name))
(flymake-mode t))))
(require 'clang-format)
;; 以下で整形スタイルを設定できます(defult: "file")
(setq clang-format-style "Google")
;; キーバインド指定
(define-key objc-mode-map (kbd "C-c ") 'clang-format-region)
;; quickrunにclangでの実行環境を追加しておきます
(add-to-list 'quickrun-file-alist '("\\.m$" . "objc/clang"))
(quickrun-add-command "objc/clang"
'((:command . "clang")
(:exec . ("%c -fobjc-arc -framework Foundation %s -o %e" "%e"))
(:remove . ("%e")))
:default "objc")
(require 'helm-xcdoc)
(setq helm-xcdoc-command-path "/Applications/Xcode.app/Contents/Developer/usr/bin/docsetutil")
(setq helm-xcdoc-document-path "~/Library/Developer/Shared/Documentation/DocSets/com.apple.adc.documentation.AppleiOS8.1.iOSLibrary.docset")
(define-key objc-mode-map (kbd "C-c d") 'helm-xcdoc-search-other-window)
(require 'popwin)
(push '("*eww*") popwin:special-display-config)
;; 'emaXcode設定
(require 'emaXcode)
(setq xcode:foundation (concat xcode:sdk "/System/Library/Frameworks/Foundation.framework/Headers/"))
(setq xcode:uikit (concat xcode:sdk "/System/Library/Frameworks/UIKit.framework/Headers/"))
(setq emaXcode-yas-objc-header-directories-list (list xcode:foundation xcode:uikit))
;; auto-complete設定
(ac-config-default)
;;ac-auto-startが整数値の場合、文字列の長さがac-auto-start以上になると自動補完開始
(setq ac-auto-start 3)
;; yasnippet設定
(require 'yasnippet)
(setq yas-snippet-dirs
'("~/.emacs.d/share/snippets"))
(yas-global-mode 1)
;; (必須)最初にロードしておく
(yas-load-directory "~/.emacs.d/share/snippets")
;; ロードしていない場合、*.[mh]を開く時に始めてsnippetのloadが走ります。
;; 情報源(ac-source-emaXcode-yasnippet)の作成はsnippetのloadの前に
;; 行なわれますので空の情報源になってしまいます
$ brew install global --with-exuberant-ctags --with-pygments
$ sudo pip install pygments
$ vim ~/.ctags
--langdef=objc
--langmap=objc:.m.h
--regex-objc=/^[[:space:]]*[-+][[:space:]]*\([[:alpha:]]+[[:space:]]*\*?\)[[:space:]]*([[:alnum:]]+):[[:space:]]*\(/\1/m,method/
--regex-objc=/^[[:space:]]*[-+][[:space:]]*\([[:alpha:]]+[[:space:]]*\*?\)[[:space:]]*([[:alnum:]]+)[[:space:]]*\{/\1/m,method/
--regex-objc=/^[[:space:]]*[-+][[:space:]]*\([[:alpha:]]+[[:space:]]*\*?\)[[:space:]]*([[:alnum:]]+)[[:space:]]*\;/\1/m,method/
--regex-objc=/^[[:space:]]*\@property[[:space:]]+.*[[:space:]]+\*?(.*);$/\1/p,property/
--regex-objc=/^[[:space:]]*\@implementation[[:space:]]+(.*)$/\1/c,class/
--regex-objc=/^[[:space:]]*\@interface[[:space:]]+(.*)[[:space:]]+:.*{/\1/i,interface/
$ cd ~/ios_project
$ ln -s /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks frameworks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment