OmniSharp(on Mountain Lion)導入メモ

最近横から「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ファイルを開いてやれば,以下のようにいい感じに補完候補がでるようになる.

![Screen Shot 2013-07-07 at 0.35.29.png](https://qiita-image-store.s3.amazonaws.com/0/1835/70363040-6ea7-ee6d-f2a1-e4e56c194d36.png "Screen Shot 2013-07-07 at 0.35.29.png")

なお,自分の環境では,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
```