Git Product home page Git Product logo

omnisharp-vim's Introduction

OmniSharp

Vader status Vint status

OmniSharp-vim is a plugin for Vim to provide IDE like abilities for C#.

OmniSharp works on Windows, Linux and MacOS.

The plugin relies on the OmniSharp-Roslyn server, a .NET development platform used by several editors including Visual Studio Code and Emacs.

Popup Demo

(see the wiki example config for a similar configuration to this demo)

Features

  • Contextual code completion

    • Code documentation and type lookup, displayed in popups or the preview window, when available (depends on installed SDKs)
    • Completion Sources are provided for:
    • Completion snippets are supported. e.g. Console.WriteLine(TAB) (ENTER) will complete to Console.WriteLine(string value) and expand a dynamic snippet, this will place you in SELECT mode and the first method argument will be selected.
  • Jump to the definition of a type/variable/method

  • Find symbols interactively (uses selector plugin by default: fzf, vim-clap, CtrlP or unite.vim)

  • Find implementations/derived types

  • Find usages (optionally uses selector plugin: fzf or vim-clap)

  • Contextual code actions (unused usings, use var....etc.) (uses selector plugin by default: fzf, vim-clap, CtrlP or unite.vim)

  • Find code issues (unused usings, use base type where possible....etc.) (requires plugin: ALE or Syntastic)

  • Find all code issues in solution and populate the quickfix window

  • Fix using statements for the current buffer (sort, remove and add any missing using statements where possible)

  • Rename refactoring

  • Full semantic highlighting

  • Code error checking

  • Code formatter

  • Run unit tests and navigate to failing assertions

Asynchronous server interactions over stdio

For vim8 and neovim, OmniSharp-vim uses the OmniSharp-roslyn stdio server instead of the older HTTP server, using pure vimscript (no python dependency!). All server operations are asynchronous and this results in a much smoother coding experience.

To use the HTTP server instead, add this to your .vimrc:

let g:OmniSharp_server_stdio = 0

Any time g:OmniSharp_server_stdio is modified, the server needs to be re-installed with :OmniSharpInstall.

Installation

Plugin

Install the Vim plugin using your preferred plugin manager:

Plugin Manager Command
Vim-plug Plug 'OmniSharp/omnisharp-vim'
Vundle Bundle 'OmniSharp/omnisharp-vim'
NeoBundle NeoBundle 'OmniSharp/omnisharp-vim'

... or git:

'runtimepath' handler Command
Vim 8.0+ Native packages $ git clone https://github.com/OmniSharp/omnisharp-vim ~/.vim/pack/plugins/start/omnisharp-vim
Pathogen $ git clone https://github.com/OmniSharp/omnisharp-vim ~/.vim/bundle/omnisharp-vim

If not using a plugin manager such as Vim-plug (which does this automatically), make sure your .vimrc contains these lines:

filetype indent plugin on
syntax enable

Server

OmniSharp-vim depends on the OmniSharp-Roslyn server. The first time OmniSharp-vim tries to open a C# file, it will check for the presence of the server, and if not found it will ask if it should be downloaded. Answer y and the latest version will be downloaded and extracted to ~/.cache/omnisharp-vim/omnisharp-roslyn, ready to use. Note: Requires curl or wget on Linux, macOS, Cygwin and WSL.

Running the command :OmniSharpInstall in vim will also install/upgrade to the latest OmniSharp-roslyn release. To install a particular release, including pre-releases, specify the version number like this:

:OmniSharpInstall v1.35.2

Note: These methods depend on the g:OmniSharp_server_stdio variable to decide which OmniSharp-roslyn server to download. If you are unsure, try using the default stdio option first, and only fall back to HTTP if you have problems.

  • vim8.0+ or neovim: Use the stdio server, it is used asynchronously and there is no python requirement.

  • < vim8.0: Use the HTTP server. Your vim must have python (2 or 3) support, and you'll need either vim-dispatch or vimproc.vim to be installed

" Use the stdio version of OmniSharp-roslyn - this is the default
let g:OmniSharp_server_stdio = 1

" Use the HTTP version of OmniSharp-roslyn:
let g:OmniSharp_server_stdio = 0

Manual installation

To install the server manually, first decide which version (stdio or HTTP) you wish to use, as described above. Download the latest release for your platform from the OmniSharp-roslyn releases page. For stdio on a 64-bit Windows system, the omnisharp.win-x64.zip package should be downloaded, whereas Mac users wanting to use the HTTP version should select omnisharp.http-osx.tar.gz etc.

Extract the binaries and configure your vimrc with the path to the run script (Linux and Mac) or OmniSharp.exe file (Window), e.g.:

let g:OmniSharp_server_path = 'C:\OmniSharp\omnisharp.win-x64\OmniSharp.exe'
let g:OmniSharp_server_path = '/home/me/omnisharp/omnisharp.http-linux-x64/run'

Windows Subsystem for Linux (WSL)

OmniSharp-roslyn can function perfectly well in WSL using linux binaries, if the environment is correctly configured (see OmniSharp-roslyn for requirements). However, if you have the .NET Framework installed in Windows, you may have better results using the Windows binaries. To do this, let OmniSharp-vim know that you are operating in WSL mode (indicating that file paths need to be translated by OmniSharp-vim from Unix-Windows and back:

let g:OmniSharp_translate_cygwin_wsl = 1

Running :OmniSharpInstall from WSL when g:OmniSharp_translate_cygwin_wsl = 1 results in the Windows version of OmniSharp-roslyn being installed to the standard Windows location %LocalAppData%\omnisharp-vim\omnisharp-roslyn.

Windows: Cygwin

The automatic installation script for cygwin downloads the Windows OmniSharp-roslyn release. OmniSharp-vim detects that it is running in a cygwin environment and automatically enables Windows/cygwin file path translations by setting the default value of g:OmniSharp_translate_cygwin_wsl to 1.

Note: The Windows stdio server unfortunately does not work from cygwin, so when cygwin is detected (has('win32unix')) the HTTP server is used by default.

Linux and MacOS

The default version of OmniSharp-roslyn requires mono on Linux and MacOS. The roslyn server releases come with an embedded mono, but this can be overridden to use the installed mono by setting g:OmniSharp_server_use_mono in your vimrc. See The Mono Project for installation details.

    let g:OmniSharp_server_use_mono = 1

Any time g:OmniSharp_server_use_mono is modified, the server needs to be re-installed with :OmniSharpInstall.

Native net6.0

From version 1.38.0 of OmniSharp-roslyn, a dotnet native net6.0 server version is available. To use this version, set g:OmniSharp_server_use_net6 in your vimrc before installing the server.

    let g:OmniSharp_server_use_net6 = 1
libuv

For the HTTP server, OmniSharp-Roslyn also requires libuv on Linux and Mac. This is typically a simple install step, e.g. brew install libuv on Mac, apt-get install libuv1-dev on debian/Ubuntu, pacman -S libuv on arch linux, dnf install libuv libuv-devel on Fedora/CentOS, etc.

Please note that if your distro has a "dev" package (libuv1-dev, libuv-devel etc.) then you will probably need it.

Note: This is not necessary for the default stdio version of OmniSharp-roslyn.

Install Python (HTTP only)

Install python 3 or 2: python downloads. Make sure that you pick correct version of Python to match your vim's architecture (32-bit python for 32-bit vim, 64-bit python for 64-bit vim).

Verify that Python is working inside Vim with

:echo has('python3') || has('python')

Note: If you are using the default stdio version of OmniSharp-roslyn, you do not need python.

Asynchronous command execution

OmniSharp-vim can start the server only if any of the following criteria is met:

  • Vim with job control API is used (8.0+)
  • neovim with job control API is used
  • vim-dispatch is installed
  • vimproc.vim is installed

(optional) Install ALE

If ALE is installed, it will automatically be used to asynchronously check your code for errors.

No further configuration is necessary. However, be aware that ALE supports multiple C# linters, and will run all linters that are available on your system. To limit ALE to only use OmniSharp (recommended), add this to your .vimrc:

let g:ale_linters = {
\ 'cs': ['OmniSharp']
\}

(optional) Install syntastic

The vim plugin syntastic can be used if you don't have ALE. Configure it to work with OmniSharp with the following line in your vimrc.

let g:syntastic_cs_checkers = ['code_checker']

(optional) Install fzf, vim-clap, ctrlp.vim or unite.vim

If one of these plugins is detected, it will be used as the selector for Code Actions and Find Symbols features:

If you have installed more than one, or you prefer to use native vim functionality (command line, quickfix window etc.) rather than a selector plugin, you can choose an option with the g:OmniSharp_selector_ui variable.

let g:OmniSharp_selector_ui = 'fzf'    " Use fzf
let g:OmniSharp_selector_ui = 'clap'   " Use vim-clap
let g:OmniSharp_selector_ui = 'ctrlp'  " Use ctrlp.vim
let g:OmniSharp_selector_ui = 'unite'  " Use unite.vim
let g:OmniSharp_selector_ui = ''       " Use vim - command line, quickfix etc.

To use fzf or vim-clap as a selector for :OmniSharpFindUsages results instead of the quickfix list, configure it explicitly:

let g:OmniSharp_selector_findusages = 'fzf'
let g:OmniSharp_selector_findusages = 'clap'

How to use

By default, the server is started automatically when you open a .cs file. It tries to detect your solution file (.sln) and starts the OmniSharp-roslyn server, passing the path to the solution file.

In vim8 and neovim, the server is started invisibly by a vim job. In older versions of vim, the server will be started in different ways depending on whether you are using vim-dispatch in tmux, or are using vim-proc, gvim or running vim in a terminal.

This behaviour can be disabled by setting let g:OmniSharp_start_server = 0 in your vimrc. You can then start the server manually from within vim with :OmniSharpStartServer.

To get completions, open a C# file from your solution within Vim and press <C-x><C-o> (that is ctrl x followed by ctrl o) in Insert mode, or use a completion or autocompletion plugin.

To use the other features, you'll want to create key bindings for them. See the example vimrc below for more info.

See the wiki for more custom configuration examples.

Semantic Highlighting

OmniSharp-roslyn can provide highlighting information about every symbol of the document.

To highlight a document, use command :OmniSharpHighlight. By default, .cs files are automatically highlighted when entering a buffer and leaving insert mode. To disable automatic highlighting, add this to your .vimrc:

let g:OmniSharp_highlighting = 0

To update highlighting after all text changes, even while in insert mode, use g:OmniSharp_highlighting = 3 instead.

The g:OmniSharp_highlight_groups dictionary is used to configure highlighting:

let g:OmniSharp_highlight_groups = {
\ 'Comment': 'NonText',
\ 'XmlDocCommentName': 'Identifier',
\ 'XmlDocCommentText': 'NonText'
\}

The :OmniSharpHighlightEcho command can be used to find out what type of symbol is under the cursor. See the wiki for the full list of symbol types, and configuration details.

Note: Full semantic highlighting uses Vim's text properties and neovim's namespaces, and is only available when using the stdio server, not for HTTP server usage. Check the wiki for how to configure the simpler regex-highlighting when using the HTTP server, or older Vim/neovims.

Diagnostics

Diagnostics are returned from OmniSharp-roslyn in various ways - via linting plugins such as ALE or Syntastic, and using the :OmniSharpGlobalCodeCheck command. These diagnostics come from roslyn and roslyn analyzers, and as such they can be managed at the server level in 2 ways - using rulesets, and using an .editorconfig file.

However, not all diagnostics can only be managed by an .editorconfig file, and rulesets are not always a good solution as they involve modifying .csproj files, which might not suit your project policies - not all project users necessarily use the same analyzers.

OmniSharp-vim provides a global override dictionary, where any diagnostic can be marked as having severity Error, Warning or Info, and for ALE/Syntastic users, a 'subtype': 'Style' may be specified. Diagnostics may be ignored completely by setting their 'type' to 'None', in which case they will not be passed to linters, and will not be displayed in :OmniSharpGlobalCodeCheck results.

" IDE0010: Populate switch - display in ALE as `Info`
" IDE0055: Fix formatting - display in ALE as `Warning` style error
" CS8019: Duplicate of IDE0005
" RemoveUnnecessaryImportsFixable: Generic warning that an unused using exists
let g:OmniSharp_diagnostic_overrides = {
\ 'IDE0010': {'type': 'I'},
\ 'IDE0055': {'type': 'W', 'subtype': 'Style'},
\ 'CS8019': {'type': 'None'},
\ 'RemoveUnnecessaryImportsFixable': {'type': 'None'}
\}

To find the relevent diagnostic ID, it can be included in diagnostic descriptions (ALE/Syntastic messages and :OmniSharpGlobalCodeCheck results) by setting g:OmniSharp_diagnostic_showid to 1 - either in your .vimrc, or temporarily via the Vim command line:

let g:OmniSharp_diagnostic_showid = 1

Note: Diagnostic overrides are only available in stdio mode, not HTTP mode.

Another method for filtering out diagnostic results is via path exclusion using g:OmniSharp_diagnostic_exclude_paths. This variable is a list of regular expressions that will exclude paths that have a match to any of its entries:

let g:OmniSharp_diagnostic_exclude_paths = [
\ 'obj\\',
\ '[Tt]emp\\',
\ '\.nuget\\',
\ '\<AssemblyInfo\.cs\>'
\]

Popups

When a recent enough Vim or neovim is used, OmniSharp-vim will use Vim's popup windows or neovim's floating windows in certain situations:

  • :OmniSharpDocumentation
  • :OmniSharpSignatureHelp
  • :OmniSharpPreviewDefinition (including metadata)
  • :OmniSharpPreviewImplementation
  • completion documentation (Vim only)

OmniSharp-vim will use popups by default for Vims/neovims which support them. To disable popups completely, set g:OmniSharp_popup to 0:

let g:OmniSharp_popup = 0

Popup mappings

Apart from the insert-completion documentation window, all popups are closeable/scrollable using these mappings:

Action name Default mapping
close (Gvim, neovim) <Esc>, gq
close (terminal Vim) * gq
lineDown <C-e>
lineUp <C-y>
halfPageDown <C-d>
halfPageUp <C-u>
pageDown <C-f>
pageUp <C-b>

Additionally, the signature-help popup window provides the following mappings for navigating through method signatures and selected parameters:

Action name Default mapping
sigNext <C-j>
sigPrev <C-k>
sigParamNext <C-l>
sigParamPrev <C-h>

These mappings are all configurable, and you can assign more than one mapping for an action. So to use e.g. CTRL-N and CTRL-P to navigate between signatures instead of CTRL-J and CTRL-K, and to use either CTRL-E/CTRL-Y or j/k for single line scrolling, use g:OmniSharp_popup_mappings like this:

let g:OmniSharp_popup_mappings = {
\ 'sigNext': '<C-n>',
\ 'sigPrev': '<C-p>',
\ 'lineDown': ['<C-e>', 'j'],
\ 'lineUp': ['<C-y>', 'k']
\}

Popups can be closed by using the close action mapping (gq or <Esc> by default), and also by simply navigating to another line.

* NOTE: Vim in the terminal does not have a default <Esc> close mapping, because <Esc> mappings interfere with escape codes in terminal Vim, meaning that key-codes such as arrow keys and <PageUp>/<PageDown> do not work as expected. Therefore, terminal Vim only has the gq mapping. Gvim and neovim handle escape codes differently, so are not affected, and have both gq and <Esc> as default close mappings.

If you are happy with this limitation and prefer to use <Esc> anyway, configure it in g:OmniSharp_popup_mappings:

let g:OmniSharp_popup_mappings.close = '<Esc>'

Popup options

Vim and neovim have different options for styling popups, due to the different ways the editors have implemented this feature.

Popup styling for Vim

The popup options from :help popup_create-arguments can be used to style Vim popups. By default, Vim uses the Pmenu highlight group, with no border or padding.

Add a rounded border and padding, and use the Normal highlight group for the window and the Special highlight group for the border like this:

let g:OmniSharp_popup_options = {
\ 'highlight': 'Normal',
\ 'padding': [1],
\ 'border': [1],
\ 'borderchars': ['', '', '', '', '', '', '', ''],
\ 'borderhighlight': ['Special']
\}

See the :help link above for options for border characters, border highlight groups etc.

Popup styling for neovim

The g:OmniSharp_popup_options dictionary is a set of window options which can be set for the popup. The dictionary may also contain an additional property, 'border', which is used as the config.border property passed to :help nvim_open_win().

Enable pseudo-transparency, add a rounded border and change the highlight groups from the default NormalFloat with FloatBorder border to Normal and Special border like this:

let g:OmniSharp_popup_options = {
\ 'winblend': 30,
\ 'winhl': 'Normal:Normal,FloatBorder:Special',
\ 'border': 'rounded'
\}

Popup position

The "documentation" popups (including signature help) are always opened as close as possible to the cursor. However "buffer" popups (previewing definitions and implementations) may be configured to open in different ways, using the g:OmniSharp_popup_position value:

  • atcursor: (default) Next to the cursor. Height expands to display as much as possible, so this may result in a very high window.
  • peek: Opens below or above the cursor, with the full width of the current window. Looks like a split, without altering window layout.
  • center: Centered in the Vim window, filling the entire workspace.

Run unit tests

It is possible to run unit tests via OmniSharp-roslyn, with success/failures listed in the quickfix window for easy navigation:

" Run the current unit test (the cursor should be on/inside the test method)
:OmniSharpRunTest

" Debug the current unit test (This will not populate the quickfix list with the result)
:OmniSharpDebugTest

" Run all unit tests in the current file
:OmniSharpRunTestsInFile

" Run all unit tests in the current file, and file `tests/test1.cs`
:OmniSharpRunTestsInFile % tests/test1.cs

Note: this is only available using the stdio server, and unfortunately does not work in translated WSL, due to the way OmniSharp-roslyn runs the tests.

Debugging

Using Vimspector, you can debug C# projects and tests. For debugging tests see the Run unit tests section.

" Starts vimspector with an ad-hoc config that will debug the current project
:OmniSharpDebugProject

" Create a .vimspector config that you can use to debug the current project and
" change as needed.
:OmniSharpCreateDebugConfig

Configuration

Example vimrc

Below is an example .vimrc for getting started with OmniSharp-vim. For a more complete example with autocompletion, fzf integration, statusline indicators etc., have a look at the Example config in the wiki.

" Use the vim-plug plugin manager: https://github.com/junegunn/vim-plug
" Remember to run :PlugInstall when loading this vimrc for the first time, so
" vim-plug downloads the plugins listed.
silent! if plug#begin('~/.vim/plugged')
Plug 'OmniSharp/omnisharp-vim'
Plug 'dense-analysis/ale'
call plug#end()
endif

" Don't autoselect first omnicomplete option, show options even if there is only
" one (so the preview documentation is accessible). Remove 'preview', 'popup'
" and 'popuphidden' if you don't want to see any documentation whatsoever.
" Note that neovim does not support `popuphidden` or `popup` yet:
" https://github.com/neovim/neovim/issues/10996
if has('patch-8.1.1880')
  set completeopt=longest,menuone,popuphidden
  " Highlight the completion documentation popup background/foreground the same as
  " the completion menu itself, for better readability with highlighted
  " documentation.
  set completepopup=highlight:Pmenu,border:off
else
  set completeopt=longest,menuone,preview
  " Set desired preview window height for viewing documentation.
  set previewheight=5
endif

" Tell ALE to use OmniSharp for linting C# files, and no other linters.
let g:ale_linters = { 'cs': ['OmniSharp'] }

augroup omnisharp_commands
  autocmd!

  " Show type information automatically when the cursor stops moving.
  " Note that the type is echoed to the Vim command line, and will overwrite
  " any other messages in this space including e.g. ALE linting messages.
  autocmd CursorHold *.cs OmniSharpTypeLookup

  " The following commands are contextual, based on the cursor position.
  autocmd FileType cs nmap <silent> <buffer> gd <Plug>(omnisharp_go_to_definition)
  autocmd FileType cs nmap <silent> <buffer> <Leader>osfu <Plug>(omnisharp_find_usages)
  autocmd FileType cs nmap <silent> <buffer> <Leader>osfi <Plug>(omnisharp_find_implementations)
  autocmd FileType cs nmap <silent> <buffer> <Leader>ospd <Plug>(omnisharp_preview_definition)
  autocmd FileType cs nmap <silent> <buffer> <Leader>ospi <Plug>(omnisharp_preview_implementations)
  autocmd FileType cs nmap <silent> <buffer> <Leader>ost <Plug>(omnisharp_type_lookup)
  autocmd FileType cs nmap <silent> <buffer> <Leader>osd <Plug>(omnisharp_documentation)
  autocmd FileType cs nmap <silent> <buffer> <Leader>osfs <Plug>(omnisharp_find_symbol)
  autocmd FileType cs nmap <silent> <buffer> <Leader>osfx <Plug>(omnisharp_fix_usings)
  autocmd FileType cs nmap <silent> <buffer> <C-\> <Plug>(omnisharp_signature_help)
  autocmd FileType cs imap <silent> <buffer> <C-\> <Plug>(omnisharp_signature_help)

  " Navigate up and down by method/property/field
  autocmd FileType cs nmap <silent> <buffer> [[ <Plug>(omnisharp_navigate_up)
  autocmd FileType cs nmap <silent> <buffer> ]] <Plug>(omnisharp_navigate_down)
  " Find all code errors/warnings for the current solution and populate the quickfix window
  autocmd FileType cs nmap <silent> <buffer> <Leader>osgcc <Plug>(omnisharp_global_code_check)
  " Contextual code actions (uses fzf, vim-clap, CtrlP or unite.vim selector when available)
  autocmd FileType cs nmap <silent> <buffer> <Leader>osca <Plug>(omnisharp_code_actions)
  autocmd FileType cs xmap <silent> <buffer> <Leader>osca <Plug>(omnisharp_code_actions)
  " Repeat the last code action performed (does not use a selector)
  autocmd FileType cs nmap <silent> <buffer> <Leader>os. <Plug>(omnisharp_code_action_repeat)
  autocmd FileType cs xmap <silent> <buffer> <Leader>os. <Plug>(omnisharp_code_action_repeat)

  autocmd FileType cs nmap <silent> <buffer> <Leader>os= <Plug>(omnisharp_code_format)

  autocmd FileType cs nmap <silent> <buffer> <Leader>osnm <Plug>(omnisharp_rename)

  autocmd FileType cs nmap <silent> <buffer> <Leader>osre <Plug>(omnisharp_restart_server)
  autocmd FileType cs nmap <silent> <buffer> <Leader>osst <Plug>(omnisharp_start_server)
  autocmd FileType cs nmap <silent> <buffer> <Leader>ossp <Plug>(omnisharp_stop_server)
augroup END

" Enable snippet completion, using the ultisnips plugin
" let g:OmniSharp_want_snippet=1

Contributing

Pull requests welcome!

We have slack room as well. Get yourself invited and make sure to join the #vim channel.

omnisharp-vim's People

Contributors

aignas avatar amosonn avatar aprilwade avatar atomsand1101its avatar austincrft avatar axvr avatar cedarbaum avatar chtenb avatar dear avatar dianeofthemoon avatar get-me-power avatar idbrii avatar jpfeiffer16 avatar juliuszint avatar laptop765 avatar lrdickson avatar markwoodhall avatar matteobaglini avatar mattn avatar melandel avatar nickspoons avatar nosami avatar osyo-manga avatar paulcampbell avatar simulshift avatar sriramgd avatar stevearc avatar svermeulen avatar thinca avatar tlo-johnson avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

omnisharp-vim's Issues

Getting all kinds of errors

Hi! First of all, thank you for such a great plugin.

I'm posting to let you know that the last bunch of commits broke my build. I'm working with Unity3D, and neither the unity api nor my own api is showing up in completion. It is indeed showing completions for C# files though.

I reverted to 512f766 on the server submodule and that fixed it for me, however, I didn't test all the Dec 28th commits.

Also, there are several other errors I'm getting. I crash on FindSymbol and FindType. I have ctrlP installed. It's a segmentation fault (Im running MacVim though). If you would like me to get you some logs, please provide instructions on how to do so and I will gladly get you whatever information you need. I am running MacVim. Here's my MacVim info;

https://gist.github.com/JosephFerano/8198311

Also, I installed the Python 2.7.6 binary and that's the version MacVim outputs.

There was also another issue that I found, but since FindSymbol and FindType are crashing, I can't test it again...

Apparently, on line 72 of Omnisharp/autoload/OmniSharp.vim

function! OmniSharp#JumpToLocation(filename, line, column)
    if a:filename != bufname('%')
        exec 'e ' . a:filename
    endif
    "row is 1 based, column is 0 based
    call cursor(a:line, a:column)
endfunction

When FindSymbol and FindType were working for me, directories with a space in them would not work when doing " exec 'e ' . a:filename

I tried several workarounds but it would keep crashing the application. This time around though I'm trying to access files in all kinds of places and I still crash.

Finally, I think I have a pretty good pattern matching thing for .cs files, I'm using neocomplete

let g:neocomplete#sources#omni#input_patterns.cs = '[^-)\=;.[:digit:] _\t]%(._|)'

That seems to be doing a better job at giving me completion. It even allows me to enter types when I press < for generics, so good job there. I'm using neocomplete, not neocomplcache, by the way.

https://gist.github.com/JosephFerano/8190641

That's my vimrc, if you wish to check it out.

I appreciate your help. Thank you so much!

MonoDoc documentation not displaying

On a screenshot in #13 I saw that the Description is essentially different from DisplayText. However, for me they are exactly the same. Is this a known issue for Linux?

Rename clobbers changes

I'm finding that "OmniSharp#RenameTo" causes all files in which the rename occurs to be reverted back to the last state that they were in when the server reloaded the solution.

My current solution is to call OmniSharp#ReloadSolution before RenameTo() which fixes the problem.

This could potentially be very frustrating for anyone that uses this feature.

OmniSharp/SuperTab/horizontal split - extra window on completion

Windows/gVim

I'm observing weird issue when completing in one of horizontal split windows (same file) - new window (like 3 lines height) created after completion is accepted.

I've tried it with keys (C-X, C-O), then C-N and Enter, so it's likely not caused by interacting with SuperTab, but not sure about anything.

Thanks

Omnisharp server takes 100% CPU

I don't know if Omnisharp can be blamed for this, but everytime I start the server, the cli process (which is mono runtime) takes up 100% CPU usage.
This is certainly an unwanted thing.
I'm on Linux.

Add to project fails when solution is specified with forward slashes instead of backslashes

Produces the following error, which is fixed by simply changing forward slashes to backslashes

System.ArgumentException: String cannot be of zero length.
Parameter name: oldValue
at System.String.ReplaceInternal(String oldValue, String newValue)
at OmniSharp.ProjectManipulation.AddToProject.AddToProjectHandler.AddToProjec
t(AddToProjectRequest request) in c:\Users\Steve.vim\bundle\Omnisharp\server\Om
niSharp\ProjectManipulation\AddToProject\AddToProjectHandler.cs:line 40
at OmniSharp.ProjectManipulation.AddToProject.AddToProjectModule.<>c__Display
Class2.<.ctor>b__0(Object x) in c:\Users\Steve.vim\bundle\Omnisharp\server\Omni
Sharp\ProjectManipulation\AddToProject\AddToProjectModule.cs:line 13
at Nancy.Routing.DefaultRouteInvoker.Invoke(Route route, DynamicDictionary pa
rameters, NancyContext context)
at Nancy.Routing.DefaultRequestDispatcher.Dispatch(NancyContext context)
at Nancy.NancyEngine.InvokeRequestLifeCycle(NancyContext context, IPipelines
pipelines)

Weird behaviour while using OmniSharp + Neocomplete

I've noticed that in some cases, OmniSharp + Neocomplete causes strange errors when using the repeat operator .

To reproduce, I've created a blank solution with just this file:

using System;

namespace BlankTestProject
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Out.WriteLine("1");
        }
    }
}

And then replace WriteLine with 'foo':

using System;

namespace BlankTestProject
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Out.foo("1");
        }
    }
}

If you then undo that change, then go to the start of 'foo' and hit '.', you see the following. ([x] marks cursor position)

using System;

namespace BlankTestProject
{
    class Program
    {
        static void Main(string[] args)
        {[x]
            Console.Out.foo("0");
        }
    }
}

That is, the 1 gets decremented to 0 and the cursor moves up one line for some reason.

I am using vanilla vim with NeoBundle and the following .vimrc:

set nocompatible

set runtimepath+=~/.vim2/bundle/neobundle.vim/

let g:neobundle#types#git#default_protocol = 'https'

call neobundle#rc(expand('~/.vim2/bundle/'))

NeoBundleFetch 'Shougo/neobundle.vim'

NeoBundle 'Shougo/vimproc', {
        \ 'build' : {
        \     'windows' : 'mingw32-make -f make_mingw64.mak',
        \    },
        \ }

NeoBundle 'Shougo/neocomplete.vim'

NeoBundle 'nosami/Omnisharp'

filetype plugin indent on " Required by NeoBundle

NeoBundleCheck

set ignorecase

let g:neocomplete#lock_buffer_name_pattern = '\V[Command Line]'
let g:neocomplete#enable_at_startup = 1
let g:neocomplete#enable_smart_case = 1
let g:neocomplete#use_vimproc = 1
let g:neocomplete#enable_camel_case = 1
let g:neocomplete#enable_ignore_case = 1
let g:neocomplete#sources#syntax#min_keyword_length = 3

if !exists('g:neocomplete#sources#omni#input_patterns')
    let g:neocomplete#force_omni_input_patterns = {}
endif
let g:neocomplete#force_omni_input_patterns.cs = '.*'

set completeopt-=preview

autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS
autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
autocmd FileType python setlocal omnifunc=pythoncomplete#Complete
autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags

Which I just took from the suggested configuration on the Neocomplete page, and added the force_omni_input_pattern from the Omnisharp suggested page.

Omnisharp crashes if .csproj file references a file that does not exist

If a .csproj file references a where "xxxxx.cs" does not exist, Omnisharp crashes.
I changed BuilderHandler.cs:77 to the following:
if (matches.Count > 0 && !Regex.IsMatch(matches[0].Groups[1].Value, @"\d+>"))

This fix causes Omnisharp not to crash and to output the error to the output window. It would be better if Omnisharp would parse the exact error and add it to the Quickfix window but at least this fix prevents the crash. The exact error to parse would be:
(CoreCompile target) ->
CSC : error CS2001: Source file 'IClaimPricingMethodRecord.cs' could not be found [C:\Projects\TFS\NCN - Other\MRASystem\Main\MRA.Pricing.Client\MRA.Pricing.Client.csproj]

Add option for autocompleting parens?

Right now the default behavior is to insert opening brace if method has params, and to insert both () if there are none.

Could you add option for turning it off completely?

Thanks

Small issue/Question

When ever I open a c# file in vim it asks me twice which sln I want to use...
example:
1 - /Users/vito-c/repo/MyProject/MyProject-csharp.sln
2 - /Users/vito-c/repo/MyProject/MyProject.sln

Then
Choose a solution file
Which solutionfile should be loaded?
[0] MyProject-csharp.sln, (1) MyProject.sln:

I think the second option should default if you already selected it... I could make this change if you want :)

Possible Issue with Singletons

I am seeing this error quite a bit when I try to run auto-completion on my singletons:

public class SingletonClass 
{
    protected SingletonClass()
    {
    }

    public static SingletonClass Instance
    {
        get {
            if (_instance == null) {
                _instance = new SingletonClass();
            }
            return _instance;
        }
    }

    public void Foo()
    {
        //do something or something
    }

    public string Bar( int num )
    {
             return "ha this is just a string";
    }
}

Then I type Singleton. and get the error below

hope this helps! :)

System.InvalidOperationException: Operation is not valid due to the current state of the object
at System.Linq.Enumerable.First[IProject](IEnumerable1 source, System.Func2 predicate, Fallback fallback) [0x00000] in :0
at System.Linq.Enumerable.First[IProject](IEnumerable1 source, System.Func2 predicate) [0x00000] in :0
at OmniSharp.Solution.CSharpSolution.ProjectContainingFile (System.String filename) [0x00000] in :0
at OmniSharp.Parser.BufferParser.ParsedContent (System.String editorText, System.String filename) [0x00000] in :0
at OmniSharp.AutoComplete.AutoCompleteHandler.CreateProvider (OmniSharp.AutoComplete.AutoCompleteRequest request) [0x00000] in :0
at OmniSharp.AutoComplete.AutoCompleteModule+c__AnonStorey21.<>m__41 (System.Object x) [0x00000] in :0
at Nancy.Routing.Route.Invoke (Nancy.DynamicDictionary parameters) [0x00000] in :0
at Nancy.Routing.DefaultRouteInvoker.Invoke (Nancy.Routing.Route route, Nancy.DynamicDictionary parameters, Nancy.NancyContext context) [0x00000] in :0
at Nancy.Routing.DefaultRequestDispatcher.Dispatch (Nancy.NancyContext context) [0x00000] in :0

complete other references

Can Omnisharp complete other third reference? I found that it can complete OmniSharp.xxxx and Nancy.xxx in OmnisharpServer project. I want to complete other third references in my project, like ADOX(Microsoft ADO Ext. 6.0 for DDL and Security) COM's reference and Oracle.DataAccess.dll. or other dll build by myself. how can I configure it?

OmniSharp Fails to Build Solutions with a space in the path

I have a solution at the following location:
C:\Projects\TFS\NCN - Other\MRASystem\Main\xxx.sln

OmniSharp fails to build the solution with an error stating that the arguments to MSBuild are not correct. I changed BuildHandler.cs:41 to the following and rebuild and that fixed the problem:
Arguments = IsUnix ? "" : "/m " + "/nologo /property:GenerateFullPaths=true "" + _solution.FileName + """,

Loading dummy_file?

My completion isn't working anymore and the server is only showing "Loading dummy_file" :(

OmniSharpAddReference yields internal server error

Not sure if this is an OmniSharpServer or OmniSharp issue.

:OmniSharpAddReference /usr/lib/monogame/MonoGame.Framework.dll
MonoGame.Framework.dll      MonoGame.Framework.dll.mdb
OmniSharp : Could not connect to http://localhost:2000/addreference: HTTP Error 500: Internal Server Error

The server is up and running. Going to the address above just gives a blank page.
Sending a POST gives 500 errors.

splitting the vim part from the server part

Is it an idea to split up the server from the vim files?
If they are in a separate repository, omnisharp is better pluggable into other software. For example, if one wants to use omnisharp for YCM, or within a different editor, one doesn't want to clone the vim files.

More specifically, I would create a repo for the server, and a repo for the vim plugin, which has the server as a submodule. The latter means that cloning the vim plugin would automatically clone the server as well.

Async build status indicator

In my fork I'm using a custom status line to display the status of the last asynchronous build. (green for successful, orange for in-progress, red for errors). I've also changed it to not pop up the quickfix list until told to do so, since I found it annoying to interrupt whatever else I had started doing, and you can do it yourself quite easily once you see it is red. Do you think any of that might be worth trying to merge into the main branch?

OmniSharp.py - os.path.relpath() Causing Issues

If you have an open file that is located at d:\test\test.cs whilst the current director in vim is c:\ for example and you call OmniSharp#FindUsages or FindImplementations it will error due to the os.path.relpath() call.

Not sure if we need to use the relative path (it doesn't matter on windows) but I'm not sure about linux or osx.

Work with projects without SLN file.

I'm working with some "flat" ASP.NET web site projects that only have .aspx, .vb, .cs, and .config files. Would it be difficult to add support for these kinds of projects?

Compiling problems (on linux)

I tried to compile OmniSharp in order to run the server, without success.
Running xbuild (mono equivalent of msbuild) in the plugin directory gives the following errors.

XBuild Engine Version 2.10.8.1
Mono, Version 2.10.8.1
Copyright (C) Marek Sieradzki 2005-2008, Novell 2008-2011.
        Configuration: Debug Platform: AnyCPU
    Could not load type 'NuGet.Commands.ProjectFactory' from assembly 'NuGet, Version=2.2.31210.9045, Culture=neutral, PublicKeyToken=null'.
/home/chiel/.vim/bundle/Omnisharp/.nuget/NuGet.targets: error : Command 'mono --runtime=v4.0.30319 /home/chiel/.vim/bundle/Omnisharp/.nuget/NuGet.exe install "packages.config" -source ""   -o "/home/chiel/.vim/bundle/Omnisharp/packages"' exited with code: 1.
Configuration: Debug Platform: AnyCPU
Configuration: Debug Platform: AnyCPU
Could not load type 'NuGet.Commands.ProjectFactory' from assembly 'NuGet, Version=2.2.31210.9045, Culture=neutral, PublicKeyToken=null'.
/home/chiel/.vim/bundle/Omnisharp/.nuget/NuGet.targets: error : Command 'mono --runtime=v4.0.30319 /home/chiel/.vim/bundle/Omnisharp/.nuget/NuGet.exe install "packages.config" -source ""   -o "/home/chiel/.vim/bundle/Omnisharp/packages"' exited with code: 1.

What is going wrong?

Issue when using mono?

Starting Server:
mono ./OmniSharp/bin/Debug/OmniSharp.exe -s /Users/vito-c/workrepos/myproject/project.sln

I am pretty sure the server is running on port 2000 (I can open localhost:2000/autocomplete in a browser and when I tried to echo "ack" to a port it gave me a bad response error back)

In Vim:
I start to type a method then type and it gives me: Could not connect to http://localhost:2000/autocomplete

Error Dump From Server:
System.InvalidOperationException: Operation is not valid due to the current state of the object
at System.Linq.Enumerable.First[IProject](IEnumerable1 source, System.Func2 predicate, Fallback fallback) [0x00000] in :0
at System.Linq.Enumerable.First[IProject](IEnumerable1 source, System.Func2 predicate) [0x00000] in :0
at OmniSharp.Solution.CSharpSolution.ProjectContainingFile (System.String filename) [0x00000] in :0
at OmniSharp.Parser.BufferParser.ParsedContent (System.String editorText, System.String filename) [0x00000] in :0
at OmniSharp.AutoComplete.AutoCompleteHandler.CreateProvider (OmniSharp.AutoComplete.AutoCompleteRequest request) [0x00000] in :0
at OmniSharp.AutoComplete.AutoCompleteModule+c__AnonStorey15.<>m__31 (System.Object x) [0x00000] in :0
at Nancy.Routing.Route.Invoke (Nancy.DynamicDictionary parameters) [0x00000] in :0
at Nancy.Routing.DefaultRouteInvoker.Invoke (Nancy.Routing.Route route, Nancy.DynamicDictionary parameters, Nancy.NancyContext context) [0x00000] in :0
at Nancy.Routing.DefaultRequestDispatcher.Dispatch (Nancy.NancyContext context) [0x00000] in :0

Fugitive Fails to Load Diff

When running the Omnisharp Server I now get this error when using Fugitives :Gdiff

Error detected while processing function OmniSharp#StartServerIfNotRunning..OmniSharp#StartServer:
line 38:
Did not find a solution file

Intermittent CSharpFile Parsing Errors

First off, OmniSharp is my new favorite thing. Thanks for making this.

Yesterday afternoon getting completion data stopped working. Other features of OmniSharp, like error checking on write, kept working. This is the type of message I kept getting:

OmniSharp Parsing Error

This was happening on files that will compile. The location it is referencing is the cursor position. I started the server on a different project to see if it had to do with the project I was working in, but I would get the same message regardless. I spent a lot of time trying to troubleshoot this, and I did find a way to get it to start working again, but I'm not sure at all why. This morning i started a new session, it was working, and at some point stopped working again, and I was able to reproduce the fix, but I don't know what I'm doing that is causing this to happen.

I made completion start working again by rolling back cs_omnisharp.vim to its state prior to when you reorganized the vimfiles (went from current back to a78af16 for that file only). After that it starts working again. I then replaced cs_omnisharp.vim with the current one, restart vim and the server, and it keeps working. Any ideas on what this is about would be greatly appreciated.

can't complete HashSet<....>

Hello, It's a very usefull tool for me. But OmniSharp can't complete HashSet<...> code, when I type "HashSet hash = new HashSet (); hash." it can't show the HashSet's member, Is it a bug, or something I should configure ?

Starting Fugitive Gdiff causes a "Did not find a solution file" error

Example:

File open from project, Omnisharp running in background. Wish to diff file, call :Gdiff.

Omnisharp attempts to start a new server (despite one already running), and throws the following error:

Error detected while processing function OmniSharp#StartServerIfNotRunning..OmniSharp#StartServer:
line 50:
Did not find solution file

The diff then fails to open, nor loads in to a buffer.

Omnisharp crash on auto-complete when file does not exist

If a .csproj file references a Compile file that does not exist, and auto-complete is attempted, then Omnisharp crashes I modified CSharpSolution.cs:114 as below and that resolved the crash:
if (project != null && File.Exists(filename))

Scratch with comments should auto-close

Is there a config option to have the scratch auto close or disable the scratch completely? I usually use split windows so having to o or kc every time is frustrating :(

Server is running but unreachable [OSX]

Hello, I'm really looking forward to use this plugin!

I'm on OSX with Mono and the Xamarin toolset installed. When I :echo !OmniSharp#ServerIsRunning() I get a 1. However if I try code completion with Ctrl-X/Ctrl-O I get:

`Could not connect to localhost:2000/autocomplete: <urlopen error [Errno 61]``

Firewall is disabled. Any idea on what I could be doing wrong?

Getting System.Net.HttpListenerException exception on Windows 8.1

Just got a new Windows 8.1 machine and OmniSharp refuses to start, throwing System.Net.HttpListenerException. The firewall is down on the box. What could be the issue? Here's the complete error (in French, because of stupid work language rules):

Loading dummy_file

Exception non gérée : System.Net.HttpListenerException: Accès refusé
   à System.Net.HttpListener.AddAllPrefixes()
   à System.Net.HttpListener.Start()
   à Nancy.Hosting.Self.NancyHost.Start()
   à OmniSharp.Program.StartServer(String solutionPath, Int32 port, Boolean verbose) dans c:\Users\pprovost\Omnisharp\server\OmniSharp\Program.cs:ligne 82
   à OmniSharp.Program.Main(String[] args) dans c:<my Home>Omnisharp\server\OmniSharp\Program.cs:ligne 59

Completions missing

I noticed recently that in some cases simply no completions are offered.
For example, when typing Console., no completion are offered. Same with Math.. However, the completer is not completely broken, since int. does complete correctly.
Formerly this has not been the case. I haven't been able to figure out when exactly this behaviour was introduced.

Does anyone have the same experience?

Python x64 Support on Windows

The docs specifically state that only Python X32 is supported. This issue is to track support of Python X64 support on Windows.

[IDEA] c# debugging

I pretty much like the way one can debug in Visual Studio...

Is it possible with mono under linux/Max OSX or the c# stuff under windows to get some of these awesome debugging features into vim?

Compile error

I can't seem to compile the newest Omnisharp. Here is the error printed:

Could not load type 'NuGet.Commands.ProjectFactory' from assembly 'NuGet, Version=2.2.31210.9045, Culture=neutral, PublicKeyToken=null'.
/home/chiel/.vim/bundle/Omnisharp/server/.nuget/NuGet.targets: 
error : Command 'mono --runtime=v4.0.30319 /home/chiel/.vim/bundle/Omnisharp/server/.nuget/NuGet.exe install "packages.config" -source ""   -o "/home/chiel/.vim/bundle/Omnisharp/server/packages"' exited with code: 1.

Can't init server submodule

When trying to update/init the server submodule, I get the following error:

fatal: reference is not a tree: 3a91202a33dc15fd71de4ae315ea62e53eb9263c
Unable to checkout '3a91202a33dc15fd71de4ae315ea62e53eb9263c' in submodule path 'server'

Not sure if I'm doing something wrong, but the link to the submodule within github also fails. I think the SHA reference that Omnisharp uses for OmniSharpServer hasn't actually been committed to OmniSharpServer yet?

Start server from within Vim

Okay... I've just added a new feature to start the server from within Vim. It requires the vim-dispatch plugin (https://github.com/tpope/vim-dispatch) in order to launch the server asynchronously.

The function to call is OmniSharp#StartServer() when you have a C# file open. It will attempt to locate both the server and the solution file by traversing upwards. If more than one solution file is found then it will prompt you to choose which sln you want to use.

I've tested this on a windows machine which launches a new cmd window to host the OmniSharp server and also on a linux box (with tmux).

It's not friction free and I'm sure that there are problems with this approach, but I thought I would raise this as an issue to start getting your feedback.

Omnisharp without ports

Omnisharp looks fantastic, by the way. I am trying to set it up on a heavily-locked down machine and when I start the CLI app, I get the following error:

Unhandled Exception: System.Net.HttpListenerException: Access is denied
   at System.Net.HttpListener.AddAllPrefixes()
   at System.Net.HttpListener.Start()
   at Nancy.Hosting.Self.NancyHost.Start()
   at OmniSharp.Program.Main(String[] args) in Omnisharp\OmniSharp\Program.cs:line 57

This happens with any port, not just port 2000, and appears to be due to firewalling. I had the same issue when developing a WCF service--outside of some whitelisted applications, nothing on this box can open a port.

What I was thinking about doing was looking for a way to set up Omnisharp to communicate without using a port, using some form of IPC. When I was working on the aforementioned WCF service, I had the service communicate over a named pipe endpoint on my local machine. I am not all that familiar with Nancy. Is there some way to set up Nancy to communicate over named pipes or some other IPC mechanism that does not require the use of ports?

Code Formatting

Is there plans to add a hook to trigger NRefactory code formatting? I saw no mention of it in the TODO list so I thought I'd mention it.

Not work with Unity3D's SLN file

This is my sln file (generated by Unity3D), is any error with it?

I try to modify this file, make it looks like the sln file of Omnisharp's, but still not work...

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2008

Project("{8BF4E6AD-DD72-A9C4-C471-4708D2941528}") = "monster", "Assembly-CSharp.csproj", "{FF63949A-EF6F-A9AE-D912-46CA2B18F2E6}"
EndProject
Project("{8BF4E6AD-DD72-A9C4-C471-4708D2941528}") = "monster", "Assembly-CSharp-Editor.csproj", "{7C09CA77-FDAD-0BFB-C2B8-AFF493D9FFDD}"
EndProject
Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        Debug|Any CPU = Debug|Any CPU
        Release|Any CPU = Release|Any CPU
    EndGlobalSection
    GlobalSection(ProjectConfigurationPlatforms) = postSolution
        {FF63949A-EF6F-A9AE-D912-46CA2B18F2E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {FF63949A-EF6F-A9AE-D912-46CA2B18F2E6}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {FF63949A-EF6F-A9AE-D912-46CA2B18F2E6}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {FF63949A-EF6F-A9AE-D912-46CA2B18F2E6}.Release|Any CPU.Build.0 = Release|Any CPU
        {7C09CA77-FDAD-0BFB-C2B8-AFF493D9FFDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {7C09CA77-FDAD-0BFB-C2B8-AFF493D9FFDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {7C09CA77-FDAD-0BFB-C2B8-AFF493D9FFDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {7C09CA77-FDAD-0BFB-C2B8-AFF493D9FFDD}.Release|Any CPU.Build.0 = Release|Any CPU
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE
    EndGlobalSection
        GlobalSection(MonoDevelopProperties) = preSolution
        StartupItem = Assembly-CSharp.csproj
        Policies = $0
        $0.TextStylePolicy = $1
        $1.inheritsSet = null
        $1.scope = text/x-csharp
        $0.CSharpFormattingPolicy = $2
        $2.inheritsSet = Mono
        $2.inheritsScope = text/x-csharp
        $2.scope = text/x-csharp
        $0.TextStylePolicy = $3
        $3.FileWidth = 120
        $3.TabWidth = 4
        $3.EolMarker = Unix
        $3.inheritsSet = Mono
        $3.inheritsScope = text/plain
        $3.scope = text/plain
    EndGlobalSection

EndGlobal

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.