最近横から「M○N○ Developェ…」みたいな呪詛が聞こえ続けているため,何か代替ないか探したところ,OmniSharpというvimプラグインが熱いらしい.ということで実際に導入してみた.
概ね先人の道をなぞるだけでOKだったので,ハマったポイントのみ記載する.
読むと分かるが,ハマったのは自分の環境の問題のため,OmniSharpは何も悪くない.(今のところ)
(ref) http://d.hatena.ne.jp/thinca/20130522/1369234427
ハマり1:NeoBundle経由のインストールでハマる
NeoBundle経由でOmniSharpをインストールするために,以下の設定をvimrcに加えた.
NeoBundleLazy 'nosami/Omnisharp', {
\ 'autoload': {'filetypes': ['cs']},
\ 'build': {
\ 'mac': 'xbuild server/OmniSharp.sln',
\ 'unix': 'xbuild server/OmniSharp.sln',
\ }
\ }
しかし,ビルドの段階で失敗...
Not installed bundles: ['Omnisharp']
Install bundles now?
(y)es, [N]o: y
[neobundle/install] (1/1): |Omnisharp| git clone --depth 1 git://github.com/nosami/Omnisharp.git "/Users/tatsuro/.vim/bundle/Omnisharp"
[neobundle/install] (1/1): |Omnisharp| Updated
[neobundle/install] -> 6637145b31985a30fc746c62a854d28c3b77562c
[neobundle/install] Building...
XBuild Engine Version 2.6.5.0^@Mono, Version 2.6.5.0^@Copyright (C) Marek Sieradzki 2005-2008, Novell 2008-2009.^@MSBUILD: error MSBUILD0000: Project file 'server/OmniSharp.sln' not found.
[neobundle/install] Installed/Updated bundles:
Omnisharp
OminiSharpがローカルに立てるサーバ(serverディレクトリ)はgitサブモジュール化されているが,それが上手くダウンロードできていないようだ.
…何のことはない.NeoBundleのバージョンが古いだけだった.最新のバージョンでは,プロジェクトをcloneする際, git clone --recursive
とするため,サブモジュールは自動的にダウンロードされる.
Not installed bundles: ['Omnisharp']
Install bundles now?
(y)es, [N]o: y
[neobundle/install] (1/1): |Omnisharp| git clone --recursive git://github.com/nosami/Omnisharp.git "/Users/tatsuro/.vim/bundle/Omnisharp"
[neobundle/install] (1/1): |Omnisharp| Updated
[neobundle/install] |Omnisharp| -> 6637145b31985a30fc746c62a854d28c3b77562c
[neobundle/install] Building...
[neobundle/install] XBuild Engine Version 2.10.11.0
Mono, Version 2.10.11.0
Copyright (C) Marek Sieradzki 2005-2008, Novell 2008-2011.
ハマリ2:コンパイルできずにハマる
上記の問題解決後,今度はコンパイルエラーに遭遇する…
今後の原因は,Monoのサポートしている.Netのバージョン.
OmniSharpをコンパイルするには,.Net4.0が必要.
$ vi ~/repos/Omnisharp/server/OmniSharp/OmniSharp.csproj
<PropertyGroup>
...
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
...
</PropertyGroup>
自分はUnityにバンドルされているMonoを使用していたのだが,どうもこのバージョンが.Net4.0をサポートしていない.
$ /Users/tatsuro/.vim/bundle/neobundle.vim% /Applications/Unity/Unity.app/Contents/Frameworks/Mono/bin/mono --version
Mono JIT compiler version 2.6.5 (tarball Mon May 27 21:28:32 CEST 2013)
Copyright (C) 2002-2010 Novell, Inc and Contributors. www.mono-project.com
TLS: normal
GC: Included Boehm (with typed GC)
SIGSEGV: altstack
Notification: Thread + polling
Architecture: x86
Disabled: none
$ vi /Applications/Unity/Unity.app/Contents/Frameworks/Mono/lib/mono/2.0/Microsoft.Common.targets
...
<GetFrameworkPath>
<Output Condition="'$(TargetFrameworkVersion)' == 'v3.5'"
TaskParameter="FrameworkVersion35Path"
ItemName="TargetFrameworkDirectories"/>
<Output Condition="'$(TargetFrameworkVersion)' == 'v3.0' or '$(TargetFrameworkVersion)' == 'v3.5'"
TaskParameter="FrameworkVersion30Path"
ItemName="TargetFrameworkDirectories"/>
<Output Condition="'$(TargetFrameworkVersion)' == 'v2.0' or '$(TargetFrameworkVersion)' == 'v3.0' or '$(TargetFrameworkVersion)' == 'v3.5'"
TaskParameter="FrameworkVersion20Path"
ItemName="TargetFrameworkDirectories"/>
</GetFrameworkPath>
...
ということで,最新のMonoを別途インストールしたところ,無事コンパイルできた.
http://www.go-mono.com/mono-downloads/download.html
$ /usr/bin/mono --version
Mono JIT compiler version 2.10.11 (mono-2-10/2baeee2 Wed Jan 16 16:40:16 EST 2013)
Copyright (C) 2002-2012 Novell, Inc, Xamarin, Inc and Contributors. www.mono-project.com
TLS: normal
SIGSEGV: normal
Notification: kqueue
Architecture: x86
Disabled: none
Misc: softdebug
LLVM: yes(2.9svn-mono)
GC: Included Boehm (with typed GC)
ここまできたら
あとはcsファイルを開いてやれば,以下のようにいい感じに補完候補がでるようになる.
なお,自分の環境では,OmniSharpサーバ起動直後に標準ライブラリの補完を行おうとすると,以下のようなエラーメッセージがでる.
最初の補完は必ず失敗するものの,二回目は補完できるので現状はスルーしている.
(エラーから見ると,初回時のDoc読み込みの問題かな?)
Error while reading monodoc file.System.ArgumentNullException: Argument cannot be null.
Parameter name: s
at System.IO.StringReader..ctor (System.String s) [0x00000] in <filename unknown>:0
at (wrapper remoting-invoke-with-check) System.IO.StringReader:.ctor (string)
at Mono.Xml2.XmlTextReader..ctor (System.String xmlFragment, XmlNodeType fragType, System.Xml.XmlParserContext context) [0x00000] in <filename unknown>:0
at System.Xml.XmlTextReader..ctor (System.String xmlFragment, XmlNodeType fragType, System.Xml.XmlParserContext context) [0x00000] in <filename unknown>:0
at System.Xml.XmlDocument.LoadXml (System.String xml) [0x00000] in <filename unknown>:0
at Monodoc.RootTree.GetHelpXml (System.String id) [0x00000] in <filename unknown>:0
at MonoDevelop.Ide.TypeSystem.MonoDocDocumentationProvider.GetDocumentation (IEntity entity) [0x00000] in <filename unknown>:0