使用Emacs开发iPhone应用程序的教程_第1页
使用Emacs开发iPhone应用程序的教程_第2页
使用Emacs开发iPhone应用程序的教程_第3页
使用Emacs开发iPhone应用程序的教程_第4页
使用Emacs开发iPhone应用程序的教程_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用Emacs开发iPhone应用程序的教程前言环境设定设定XCode的外部编辑器Emacs中管理Objective-C文件编译与执行查找帮助扩展设置打开头文件补全安装设置安装设置Textmacros(模板)安装设置自动插入匹配的括号缩进选择矩形区域语法检查启动优化通常,在Mac下开发Cocoa应用程序或是iPhone应用程序的时候使用的是XCode,但是习惯了Emacs的人也许已经不习惯这样的IDE了。比如本人,自从接触Emacs以后,基本上所有的程序,博客,工作报告等都是用它来完成的。这里,我将给大家介绍在Emacs下开发iPhone应用程序的方法,也许试过之后你也会喜欢上它的(在windows/linux下开发的用户也可以试试,一切都可以自动化的完成,参考这里和这里。前言设定XCode的外部编辑器

首先将缺省的编辑器由XCode更改为Emacs。这样一来,双击XCode的源文件后,将用Emacs打开。

在「环境设定」->「文件类型」->「file」->「text」->「sourcecode」->「sourcecode.c」->「外部编辑器」->「其他」中选择「Emacs.app」。

必须选择「其他」。最初emacs由Terminal内启动。

这里,工程文件还是由XCode打开的。iPhone开发环境设定利用Emacs开发Objective-C语言程序的时候,需要打开objc-mode。

首先在~/.emacs.el中设定关联objc语言的文件后缀名.m、.mm、.h。(add-to-list'auto-mode-alist'("\\.mm?[

wind_phpcode_1

]quot;.objc-mode))(add-to-list'auto-mode-alist'("\\.h[

wind_phpcode_1

]quot;.objc-mode))

但是,后缀名为.m的文件除了Objective-C以外,matlab中也在使用,后缀名为.h的文件C/C++中也被应用。如果只是想这样单纯的设置,应该还是会带来一些不便的。不过不要紧,在Emacs22以后,为了解决这个问题可以设定magic-mode-alist。它可以解析具体文件中的内容确定具体的mode。

这里,判断文件行头是否有@implementation、@interface、@protocol,如果有,就设定objc-mode。(add-to-list'magic-mode-alist'("\\(.\\|\n\\)*\n@implementation".objc-mode))(add-to-list'magic-mode-alist'("\\(.\\|\n\\)*\n@interface".objc-mode))(add-to-list'magic-mode-alist'("\\(.\\|\n\\)*\n@protocol".objc-mode))Emacs中管理Objective-C文件这里使用xcodebuild命令行实现命令行的编译方式,你也可以使用这里的方法,使用gcc&Makefile。

编译可以使用下面的命令:

xcodebuild-configurationDebug-sdkiphonesimulator3.1.2执行可以通过AppleScript来实现。1tellapplication"Xcode"toactivatetellapplication"SystemEvents"

tellprocess"Xcode"

keycode36using{commanddown}

endtellendtelliPhone开发之编译与执行这里直接使用了keycode。如果你自定义了Mac的keycode话,就不能正常工作了。这里使用的keycode的意思如下:

using

意思

Unicode

菜单上的记号

commanddown

命令键

0x2318

?

controldown

控制键

0x2303

?

optiondown

alt键

0x2325

?

shiftdown

shift键

0x21E7

?

以及键

keycode

esc

53

tab

48

space

49

return

36

delete

51

leftarrow

123

rightarrow

124

downarrow

125

uparrow

126iPhone开发教程所以,这里的例子就是Ctr+return。然后将该AppleScript嵌入到EmacsLisp中。(这里只针对CarbonEmacs或CocoaEmacs有效)(defunxcode:buildandrun()(interactive)(do-applescript

(format

(concat

"tellapplication\"Xcode\"toactivate\r"

"tellapplication\"SystemEvents\"\r"

"

tellprocess\"Xcode\"\r"

"

keycode36using{commanddown}\r"

"

endtell\r"

"endtell\r"

))))iPhone开发教程然后使用M-xxcode:buildandrun来执行。或者绑定下面的快捷键。(add-hook'objc-mode-hook

(lambda()

(define-keyobjc-mode-map(kbd"C-cC-r")'xcode:buildandrun)

))iPhone开发教程开发程序的时候经常会用到帮助文档,类似windows下的MSDN。在Mac下利用命令行形式检索帮助时用docsetutil命令。比如下面的方法:/Developer/usr/bin/docsetutilsearch/Developer/Platforms/iPhoneOS.platform/Developer/Documentation/DocSets/com.apple.adc.documentation.AppleiPhone3_1.iPhoneLibrary.docset-query'word'

Emacs中利用这一命令,可以使用xcode-document-viewer.el。运行的时候需要emacs-w3m。可以在这里下载w3m,按照下面的方法安装。iPhone开发教程查找帮助curl-O/personal/Hans_Boehm/gc/gc_source/gc.tar.gz

tarxvfzgc.tar.gz

cdgc

./configure

make

sudomakeinstall

cd..

tarxvfzw3m-0.5.2.tar.gz

./configure

make

sudomakeinstall这之后,安装emacs-w3m到.emacs.d/lisp下。cvs-d:pserver:anonymous@:/storage/cvsrootcoemacs-w3m

cdemacs-w3m

autoconf

./configure--with-lispdir=~/.emacs.d/lisp/w3m--datarootdir=~/.emacs.d/share--with-icondir=~/.emacs.d/share/icon

make

makeinstall

makeinstall-iconsiPhone开发教程cd~/.emacs.d/lisp

curl-O/emacs/download/anything.el

curl-O/sakito/emacs-xcode-document-viewer/raw/master/xcode-document-viewer.el#这里是原始版

#curl-O/imakado/emacs-xcode-document-viewer/raw/master/xcode-document-viewer.eliPhone开发教程然后在.emacs.el中像下面一样设置。;;自动加载emacs-w3m(autoload'w3m"w3m""Interfaceforw3monEmacs."t)(require'xcode-document-viewer)(setqxcdoc:document-path"/Developer/Platforms/iPhoneOS.platform/Developer/Documentation/DocSets/com.apple.adc.documentation.AppleiPhone3_1.iPhoneLibrary.docset")(setqxcdoc:open-w3m-other-buffert)(add-hook'objc-mode-hook

(lambda()

;;用C-cw来检索文档

(define-keyobjc-mode-map(kbd"C-cw")'xcdoc:ask-search)))打开头文件

比如像打开#import<UIKit/UIKit.h>处的头文件时,可以使用Emacs中自带的ffap(findfile(orurl)atpoint)。

快捷键是C-xC-f,在光标处的头文件执行它,将打开对应的头文件。(ffap-bindings);;设定搜索的路径ffap-c-path;;(setqffap-c-path;;

'("/usr/include""/usr/local/include"));;如果是新文件要确认(setqffap-newfile-promptt);;ffap-kpathsea-expand-path展开路径的深度(setqffap-kpathsea-depth5)iPhone开发教程之扩展设置另外,由.h文件切换到.m文件、或者由.m文件切换到对应的.h文件、可以使用ff-find-other-file。

如下设置,使用C-co来切换文件。(setqff-other-file-alist

'(("\\.mm?[

wind_phpcode_9

]quot;(".h"))

("\\.cc[

wind_phpcode_9

]quot;

(".hh"".h"))

("\\.hh[

wind_phpcode_9

]quot;

(".cc"".C"))

("\\.c[

wind_phpcode_9

]quot;

(".h"))

("\\.h[

wind_phpcode_9

]quot;

(".c"".cc"".C"".CC"".cxx"".cpp"".m"".mm"))

("\\.C[

wind_phpcode_9

]quot;

(".H"

".hh"".h"))

("\\.H[

wind_phpcode_9

]quot;

(".C"

".CC"))

("\\.CC[

wind_phpcode_9

]quot;

(".HH"".H"

".hh"".h"))

("\\.HH[

wind_phpcode_9

]quot;

(".CC"))

("\\.cxx[

wind_phpcode_9

]quot;(".hh"".h"))

("\\.cpp[

wind_phpcode_9

]quot;(".hpp"".hh"".h"))

("\\.hpp[

wind_phpcode_9

]quot;(".cpp"".c"))))(add-hook'objc-mode-hook

(lambda()

(define-keyc-mode-base-map(kbd"C-co")'ff-find-other-file)

))在Emacs中也能完成Objective-C的补全功能。设立,我们使用auto-complete、company-mode、ac-company。iPhone开发教程:补全cd~/.emacs.dmkdirlispcdlispcurl-O/m2ym/auto-complete/raw/master/auto-complete.elcurl-O/m2ym/auto-complete/raw/master/auto-complete-config.elcurl-O/m2ym/auto-complete/raw/master/popup.elcurl-O/m2ym/auto-complete/raw/master/fuzzy.elcurl-Ohttp://nschum.de/src/emacs/company-mode/company-0.4.3.tar.bz2curl-O/buzztaiki/auto-complete/raw/master/ac-company.eltarxvfjcompany-0.4.3.tar.bz2安装在.emacs.el中添加下面的设置:;;load-path路径(let((default-directory(expand-file-name"~/.emacs.d/lisp")))(add-to-list'load-pathdefault-directory)(if(fboundp'normal-top-level-add-subdirs-to-load-path)

(normal-top-level-add-subdirs-to-load-path)))

;;加载(require'auto-complete)(require'auto-complete-config)(require'ac-company)设置(global-auto-complete-modet);;ac-company中设置company-xcode有效(ac-company-define-sourceac-source-company-xcodecompany-xcode);;设定objc-mode中补全ac-mode(setqac-modes(appendac-modes'(objc-mode)));;hook(add-hook'objc-mode-hook

(lambda()

(define-keyobjc-mode-map(kbd"\t")'ac-complete)

;;使用XCode的补全功能有效

(push'ac-source-company-xcodeac-sources)

;;C++关键词补全

(push'ac-source-c++-keywordsac-sources)

));;补全窗口中的热键(define-keyac-completing-map(kbd"C-n")'ac-next)(define-keyac-completing-map(kbd"C-p")'ac-previous)(define-keyac-completing-map(kbd"M-/")'ac-stop);;是否自动启动补全功能(setqac-auto-startnil);;启动热键(ac-set-trigger-key"TAB");;候補的最大件数(缺省10件)(setqac-candidate-max20)如果不能很好的完成补全,先用XCode编译一次源代码,然后再试应该没有什么问题了。因为上记补全的方法实际上是使用了XCode的xcodeindex命令,需要动态地收集补全的信息。

etags

如果你不喜欢这种方式,还可以试试etags(或者gtags,这里只介绍etags,有兴趣的朋友可以自己试试gtags)。它主要是利用了源代码文件(类名,函数名等)来建立索引(tag)。

首先,使用etags命令生成tag文件。以下的例子生成tag到~/.emacs.d/share/tags下。cd~/.emacs.d

mkdir-pshare/tags

cdshare/tags

find/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS${VER}.sdk/System/Library/Frameworks-name"*.h"|xargsetags-fobjc.TAGS-lobjc生成的文件名为objc.TAGS,内部只是类的名称。如果要得到比较详细的信息(函数名等)使用下面的shell脚本。#!/bin/shs="\t"S="[$s]*"w="_a-zA-Z0-9"CN="[A-Z][$w]*"NM="[$w][$w]*"

SDK="/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS${VER}.sdk/System/Library/Frameworks"

find$SDK-name"*.h"|xargsetags-a--declarations-r"/$S[-+]$S(\($S$NM\)\{1,3\}$S\**$S)?$S\($NM\)$S[:;]/\2/"-ffrm.tagssed"/^@class/d"frm.tags>objc.TAGStag文件比较大,这里我们只是作为objc-mode的补全候补来使用,这里使用到了etags-table.el。cd~/.emacs.d/lispcurl-O/sakito/dot.emacs.d/raw/tip/local-lisp/etags-table.el安装在.emacs.el文件中添加下面的设置:;;etags-table有效(require'etags-table)(add-to-list

'etags-table-alist

'("\\.[mh][

wind_phpcode_14

]quot;"~/.emacs.d/share/tags/objc.TAGS"));;auto-complete中待确认的etags参数;;3文字以上时,补全功能有效(defvarac-source-etags

'((candidates.(lambda()

(all-completionsac-target(tags-completion-table))))

(candidate-face.ac-candidate-face)

(selection-face.ac-selection-face)

(requires.3))

"etagssource")(add-hook'objc-mode-hook

(lambda()

(push'ac-source-etagsac-sources)))设置另外,使用etags除了补全功能以外,还可以在代码间跳转。使用“M+.”跳到光标处源代码位置(比如函数定义处),使用“Alt+*”还可以跳回来。XCode中有一个名为「Textmacros」的功能,使用它可以自动生成模板代码,提高了开发的效率,Emacs中YASnippet就可以实现同样的功能。iPhone开发教程:Textmacros(模板)cd~/.emacs.d/lisp

curl-O/files/yasnippet-0.6.1c.tar.bz2

tarxvfjyasnippet-0.6.1c.tar.bz2

cdyasnippet-0.6.1c安装在.emacs.el文件中添加下面的设置:(let((default-directory(expand-file-name"~/.emacs.d/lisp")))(add-to-list'load-pathdefault-directory)(if(fboundp'normal-top-level-add-subdirs-to-load-path)

(normal-top-level-add-subdirs-to-load-path)))

(require'yasnippet);;设置snippet的位置(setqyas/root-directory"~/.emacs.d/lisp/yasnippet-0.6.1c/snippets");;不要菜单(setqyas/use-menunil);;初始化(yas/initialize)(yas/load-directoryyas/root-directory)设置这样一来,在objc-mode中按下Tab键、就可以启动YASnippet了。你可以输入for按后点击tab试试。

但是YASnippet中供objc-mode使用的snippets并不是很多、利用XCode的TextMacro可以解决这个问题。

XCode的TextMacros位于下面的位置,因为是文本文件,你可以用[[Emacs]]打开来查看。/Developer/Applications/Xcode.app/Contents/PlugIns/TextMacros.xctxtmacro/

Contents/Resources/ObjectiveC.xctxtmacro首先添加新的目录用来保存snippets。这里我们创建~/.emacs.d/etc/snippets目录,然后在.emacs.el文件中设置:;;设置复数的snippets路径(setqyas/root-directory'("~/.emacs.d/lisp/yasnippet-0.6.1c/snippets"

"~/.emacs.d/etc/snippets"))(mapc'yas/load-directoryyas/root-directory)iPhone开发教程在~/.emacs.d/etc/snippets目录下创建objc-mode子目录、在其下创建后缀名为.yasnippet的模板文件。比如像下面try.yasnippet的文件。#-*-mode:snippet-*-#name:@try{...}@catch{...}@finally{...}#--@try{

$1}@catch(NSException*e){

$2}@finally{

$3}$0你可以参考XCode中的TextMacros实现所需的模板。Emacs中标准的括号自动插入功能如下所示:(add-hook'c-mode-common-hook

'(lambda()

;;插入对称的括号

(make-variable-buffer-local'skeleton-pair)

(make-variable-buffer-local'skeleton-pair-on-word)

(setqskeleton-pair-on-wordt)

(setqskeleton-pairt)

(make-variable-buffer-local'skeleton-pair-alist)

(local-set-key(kbd"(")'skeleton-pair-insert-maybe)

(local-set-key(kbd"[")'skeleton-pair-insert-maybe)

(local-set-key(kbd"{")'skeleton-pair-insert-maybe)

(local-set-key(kbd"`")'skeleton-pair-insert-maybe)

(local-set-key(kbd"\"")'skeleton-pair-insert-maybe)

))iPhone开发教程:自动插入匹配的括号你也可以使用smartchr.el,也许能更方便一些。(defunik:insert-eol(s)

(interactive)

(lexical-let((ss))

(smartchr-make-struct

:insert-fn(lambda()

(save-excursion

(goto-char(point-at-eol))

(when(not(string=(char-to-string(preceding-char))s))

(inserts))))

:cleanup-fn(lambda()

(save-excursion

(goto-char(point-at-eol))

(delete-backward-char(lengths)))))))

(defunik:insert-semicolon-eol()

(ik:insert-eol";"))(defunsmartchr-custom-keybindings()

(local-set-key(kbd"=")(smartchr'("=""=="

"=")))

(local-set-key(kbd"(")(smartchr'("(`!!')""(")))

(local-set-key(kbd"[")(smartchr'("[`!!']""[[`!!']]""[")))

(local-set-key(kbd"{")(smartchr'("{\n`!!'\n}""{`!!'}""{")))

(local-set-key(kbd"`")(smartchr'("\``!!''""\`")))

(local-set-key(kbd"\"")(smartchr'("\"`!!'\"""\"")))

(local-set-key(kbd">")(smartchr'(">""=>""=>'`!!''""=>\"`!!'\"")))

(lobal-set-key(kbd"F")(smartchr'("F""[

wind_phpcode_19

]quot;"$_""$_->""@[

wind_phpcode_19

]quot;)))

(lobal-set-key(kbd"j")(smartchr'("j"ik:insert-semicolon-eol)))

)

(defunsmartchr-custom-keybindings-objc()

(local-set-key(kbd"@")(smartchr'("@\"`!!'\"""@")))

)iPhone开发教程(add-hook'c-mode-common-hook'smartchr-custom-keybindings)(add-hook'objc-mode-hook'smartchr-custom-keybindings-objc)当你按下一位「==」键时,自动输出「=」,前后自动添加空白。当再一次输入「=」时,得到的是「==」。另外也可以匹配地输入带改行的文字,自定义各种特定的输入等。(比如这里,2回按下“j”键后,自动在改行末尾添加“;”)。将下面的设定添加到.emacs.el中,使用tab的距离为4个空白位。(add-hook'c-mode-common-hook

'(lambda()

(c-set-style"cc-mode")))

(setq-defaultindent-tabs-modenil)(setq-defaulttab-width4)缩进使用cua-mode可以方便地实现代码中的矩形选择。将下面的代码添加到.emacs.el中,使用C-RET可以进入矩形选择模式。(setqcua-enable-cua-keysnil)(cua-modet)选择矩形区域可以使用flymake来完成语法检查。在.emacs.el中添加下面的设置:(require'flymake)(defvarxcode:gccver"4.0")(defvarxcode:sdkver"3.1.2")(defvarxcode:sdkpath"/Developer/Platforms/iPhoneSimulator.platform/Developer")(defvarxcode:sdk(concatxcode:sdkpath"/SDKs/iPhoneSimulator"xcode:sdkver".sdk"))(defvarflymake-objc-compiler(concatxcode:sdkpath"/usr/bin/gcc-"xcode:gccver))(defvarflymake-objc-compile-default-options(list"-Wall""-Wextra""-fsyntax-only""-ObjC""-std=c99""-isysroot"xcode:sdk))(defvarflymake-last-positionnil)(defvarflymake-objc-compile-options'("-I."))(defunflymake-objc-init()

(let*((temp-file(flymake-init-create-temp-buffer-copyiPhone开发教程:语法检查

'flymake-create-temp-inplace))

(local-file(file-relative-name

temp-file

(file-name-directorybuffer-file-name))))

(listflymake-objc-compiler(appendflymake-objc-compile-default-optionsflymake-objc-compile-options(listlocal-file)))))

(add-hook'objc-mode-hook

(lambda()

(push'("\\.m[

wind_phpcode_22

]quot;flymake-objc-init)flymake-allowed-file-name-masks)

(push'("\\.h[

wind_phpcode_22

]quot;flymake-objc-init)flymake-allowed-file-name-masks)

(if(and(not(nullbuffer-file-name))(file-writable-pbuffer-file-name))

(flymake-modet))

))如果检查到有语法错误,有错误的代码行自动显示到minibuffer中,如下设置。(defunflymake-display-err-minibuffer()

"改行有error或warinig显示在minibuffer"

(interactive)

(let*((line-no(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论