Linux上使用VIM进行.Net Core
如何在Linux上使用VIM进行.Net Core开发
对于在Linux上开发.Net Core的程序员来说, 似乎都缺少一个好的IDE.
Windows上有Visual Studio, Mac上有Visual Studio for Mac, 难道Linux只有Visual Studio Code了吗?
Linux上有两个最好的编辑器: VIM和Emacs, 哪个更好不是这一篇的主题, 这一篇的主题是如何在Linux上简单的构建一个比较好用的.Net Core开发环境.
以下的内容面向的是刚接触VIM的新手, 如果你完全未接触过, 可以去找一些入门的文章看看.
以下使用的环境是 Ubuntu 16.04 LTS + .Net Core 2.0 preview 2.
导入一个通用的vimrc
如果你是新手, 并且你的vimrc(vim的配置文件)空空如也, 请导入下面这个vimrc.
这个配置文件启用了智能缩进和改善了快捷键等等, 强烈推荐新手一开始使用它.
地址: https://github.com/amix/vimrc
git clone --depth=1 git://github.com/amix/vimrc.git ~/.vim_runtime
sh ~/.vim_runtime/install_basic_vimrc.sh
安装模块管理工具pathogen.vim
跟众多IDE中一样, vim可以模块化管理功能.
管理工具除了pathogen外还有Vundle等, 但pathogen是最简单的, 安装完以后把插件放在"~/.vim/bundle"下即可.
地址: https://github.com/tpope/vim-pathogen
mkdir -p ~/.vim/autoload ~/.vim/bundle
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
echo -e "\nexecute pathogen#infect()" >> ~/.vimrc
安装mono
虽然这篇文章介绍的是.Net Core开发, 但是C#的智能语法提示插件基于mono,所以必须先安装mono.
ubuntu 16.04自带的mono版本比较低, 需要从官方安装, 步骤如下:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb http://download.mono-project.com/repo/ubuntu xenial main" | sudo tee /etc/apt/sources.list.d/mono-official.list
sudo apt-get update
sudo apt-get install mono-devel
安装vim.nox
ubuntu 16.04上的vim默认不带python支持, 而omnisharp-vim要求python支持, 所以需要另外安装一个vim.nox.
sudo apt-get install vim.nox-py2
sudo update-alternatives --set vi /usr/bin/vim.nox-py2
sudo update-alternatives --set vim /usr/bin/vim.nox-py2
安装OmniSharp
OmniSharp用于动态解析C#的语法, 为语法分析和补全提示等功能提供支持, Visual Studio Code中用的也是它.
地址: https://github.com/OmniSharp/omnisharp-vim
cd ~/.vim/bundle
git clone https://github.com/OmniSharp/omnisharp-vim.git
cd omnisharp-vim
git submodule update --init --recursive
cd server
xbuild
cd ~/.vim/bundle/omnisharp-vim/omnisharp-roslyn
./build.sh
安装OmniSharp需要的其他组件
OmniSharp只提供了语言服务, 还需要安装其他组件来实现智能提示等功能.
dispatch.vim
用于后台启动OmniSharp的语言服务
地址: https://github.com/tpope/vim-dispatch
cd ~/.vim/bundle
git clone https://github.com/tpope/vim-dispatch
CtrlP
用于查找和定位类型
地址: https://github.com/ctrlpvim/ctrlp.vim
cd ~/.vim/bundle
git clone https://github.com/ctrlpvim/ctrlp.vim
syntastic
用于实现语法检查
地址: https://github.com/vim-syntastic/syntastic
cd ~/.vim/bundle
git clone https://github.com/vim-syntastic/syntastic
vim-deus
替换默认的配色
地址: https://github.com/ajmwagar/vim-deus
cd ~/.vim/bundle
git clone https://github.com/ajmwagar/vim-deus
添加自定义的配置
创建我们自己使用的配置文件
mkdir -p ~/.vim/bundle/myconf/plugin
vi ~/.vim/bundle/myconf/plugin/myconf.vim
添加以下的部分到myconf.vim中, 更多配置可以参考omnisharp-vim中的README.
粘贴前需要使用":set paste"防止粘贴的内容触发快捷键.
" 让omnisharp使用roslyn
let g:OmniSharp_server_type = 'v1'
let g:OmniSharp_server_type = 'roslyn'
let g:OmniSharp_prefer_global_sln = 1
" 设置omnisharp
let g:OmniSharp_timeout = 1
set noshowmatch
set completeopt=longest,menuone,preview
let g:syntastic_cs_checkers = ['code_checker']
set updatetime=500
augroup omnisharp_commands
autocmd!
autocmd FileType cs call s:SetCSharpOptions()
setlocal omnifunc=OmniSharp#Complete
fun! s:SetCSharpOptions()
autocmd BufEnter,TextChanged,InsertLeave *.cs SyntasticCheck
autocmd BufWritePost *.cs call OmniSharp#AddToProject()
autocmd CursorHold *.cs call OmniSharp#TypeLookupWithoutDocumentation()
" 设置快捷键
" F12转到定义
nnoremap <F12> :OmniSharpGotoDefinition<cr>
nnoremap gd :OmniSharpGotoDefinition<cr>
" Ctrl+F12转到实现
nnoremap <C-F12> :OmniSharpFindImplementations<cr>
nnoremap fi :OmniSharpFindImplementations<cr>
" F11查找使用
nnoremap <F11> :OmniSharpFindUsages<cr>
nnoremap fu :OmniSharpFindUsages<cr>
nnoremap ft :OmniSharpFindType<cr>
nnoremap fs :OmniSharpFindSymbol<cr>
nnoremap fm :OmniSharpFindMembers<cr>
nnoremap fx :OmniSharpFixIssue<cr>
nnoremap fxu :OmniSharpFixUsings<cr>
nnoremap tt :OmniSharpTypeLookup<cr>
nnoremap dc :OmniSharpDocumentation<cr>
nnoremap <C-Up> :OmniSharpNavigateUp<cr>
nnoremap <C-Down> :OmniSharpNavigateDown<cr>
nnoremap gc :OmniSharpGetCodeActions<cr>
vnoremap gcv :call OmniSharp#GetCodeActions('visual')<cr>
" F2重命名
nnoremap <F2> :OmniSharpRename<cr>
nnoremap rl :OmniSharpReloadSolution<cr>
nnoremap cf :OmniSharpCodeFormat<cr>
nnoremap tp :OmniSharpAddToProject<cr>
nnoremap ss :OmniSharpStartServer<cr>
nnoremap sp :OmniSharpStopServer<cr>
nnoremap th :OmniSharpHighlightTypes<cr>
" F1切换buffer
nnoremap <F1> :buffers<CR>:buffer
" F5编译+运行
nnoremap <F5> :make<CR>
" Enter选择提示内容+显示文档
inoremap <expr><Enter> pumvisible() ? "\<C-Y>\<Esc>:OmniSharpDocumentation<CR>a" : "\<Enter>"
" Tab切换提示内容
inoremap <expr><Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
" (选择提示内容+显示文档
inoremap <expr>( pumvisible() ? "\<Esc>:OmniSharpDocumentation<CR>a(" : "("
" 添加多行注释
inoremap /// ///<Space><summary><CR><CR></summary><Esc>kA<Space>
" 设置即时提示
set completeopt+=menu
set completeopt+=menuone
set completeopt+=noinsert
autocmd InsertCharPre * call s:TypeComplete()
fun! s:TypeComplete()
if pumvisible() && v:char !~ '\.'
return ''
endif
if v:char =~ '\(\K\|\.\)'
call feedkeys("\<C-x>\<C-o>", 'n')
endif
endfun
endfun
augroup END
" 定义有多行时不提示Enter继续
set cmdheight=2
" 转到定义时不询问保存
set hidden
" 开启256色支持
set t_Co=256
" 显示行号
set number
" 替换默认的配色
colorscheme deus
.Net Core 2.0支持
如果系统同时如果安装了.Net Core 2.0 preview 2, 可能会导致Omnisharp的语言服务启动失败, 可以用下面的办法解决.
cp -i ~/.nuget/packages/runtime.ubuntu.16.04-x64.runtime.native.System/1.0.1/runtimes/ubuntu.16.04-x64/native/System.Native.so ~/.vim/bundle/omnisharp-vim/omnisharp-roslyn/artifacts/publish/OmniSharp/default/net46/libSystem.Native.so
cp -i /usr/share/dotnet/sdk/2.0.0-preview2-006497/Sdks/Microsoft.NET.Sdk/tools/net46/NuGet.*.dll ~/.vim/bundle/omnisharp-vim/omnisharp-roslyn/artifacts/publish/OmniSharp/default/net46/
另外由于omnisharp的目前的一个bug(#309), 还需要执行以下的命令
cd ~/.vim/bundle/omnisharp-vim/omnisharp-roslyn/artifacts/scripts
ln -s OmniSharp Omnisharp
如果仍然无法得到智能提示, 可以手动启动语言服务确认是否出错.
~/.vim/bundle/omnisharp-vim/omnisharp-roslyn/artifacts/scripts/OmniSharp -p 2000 -s ~/NewProject/NewProject.sln
开发示例
首先创建一个项目
mkdir NewProject
cd NewProject
dotnet new console
dotnet new sln
dotnet sln add NewProject.csproj
然后生成一个Makefile, 这样可以支持":Make"或者"F5"时编译运行
echo -e "PHONY: run\nrun:\n\tdotnet run\n" > Makefile
最后使用vim打开代码文件即可
vim Program.cs
效果(静态图)

效果(gif)

教程就到此为止了, 需要更多功能可以查看omnisharp-vim的官方Github.
Linux上使用VIM进行.Net Core的更多相关文章
- 如何在Linux上使用VIM进行.Net Core开发
对于在Linux上开发.Net Core的程序员来说, 似乎都缺少一个好的IDE. Windows上有Visual Studio, Mac上有Visual Studio for Mac, 难道Linu ...
- 【转】Linux上vi(vim)编辑器使用教程
Linux上vi(vim)编辑器使用教程 ------------------------------------------------------------ ikong ------------ ...
- Linux上vi(vim)编辑器使用教程
vi(vim)是上Linux非常常用的编辑器,很多Linux发行版都默认安装了vi(vim).vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率.vi是“visual interface”的缩 ...
- 新手指南:Linux上vi(vim)编辑器使用教程
vi(vim)是上Linux非常常用的编辑器,很多Linux发行版都默认安装了vi(vim).vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率.vi是“visual interface”的缩 ...
- Linux上用Docker部署Net Core项目
前提:本地配置好Docker环境1.构建Net Core镜像 docker pull microsoft/dotnet 2.新建一个DockerFile文件并填充内容 #基于 `microsoft/d ...
- linux上的vim永久显示行号
步骤1: cp /usr/share/vim/vimrc ~/.vimrc 先复制一份vim配置模板到个人目录下 注:redhat 改成 cp /etc/vimrc ~/.vimrc 步骤2: vi ...
- Linux上 .vimrc文件
在Linux上面对VIM编辑器的格式的设置通常可以提升工作效率,下面对工作机器上的.vimrc文件的内容进行一总结,以备后续的查询 set smarttab set tabstop=4 set shi ...
- .NET跨平台之旅:在生产环境中上线第一个运行于Linux上的ASP.NET Core站点
2016年7月10日,我们在生产环境中上线了第一个运行于Linux上的ASP.NET Core站点,这是一个简单的提供后端服务的ASP.NET Core Web API站点. 项目是在Windows上 ...
- 【无私分享:ASP.NET CORE 项目实战(第十章)】发布项目到 Linux 上运行 Core 项目
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win7)上用虚拟机建了个 CentOS7 ,来演示下 ...
随机推荐
- T57
“期待使我产生了介于幸福与恐惧之间的激动”The anticipation produced in me a sensation somewhat between bliss and fear他猛一下 ...
- listen 68 Theoretical Physicist Stephen Hawking Dies at 76
World-renowned British physicist Stephen Hawking, who sought to understand a range of cosmic topics ...
- kmp算法模板及理解
kmp算法是复杂度为O(n+m)的字符串匹配算法; 首先kmp算法的核心是在模式串中获得next数组,这个数组表示模式串的子串的前缀和后缀相同的最长长度; 这样在匹配的过程中如果指到不匹配的位置,模式 ...
- BZOJ-4003:城池攻占(可并堆+lazy标记)
小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 到 n 的整数表示.除 号城池外,城池 i 会受到另一座城池 fi 的管辖, 其中 fi <i.也就是 ...
- LuoguP1419 寻找段落(二分 单调队列
题目描述 给定一个长度为n的序列a_i,定义a[i]为第i个元素的价值.现在需要找出序列中最有价值的“段落”.段落的定义是长度在[S,T]之间的连续序列.最有价值段落是指平均值最大的段落, 段落的平均 ...
- BZOJ3932:[CQOI2015]任务查询系统
浅谈主席树:https://www.cnblogs.com/AKMer/p/9956734.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem.p ...
- 关于分支和主干Merge时要注意的事项
现在我们同时在主干和分支上进行开发, 当你需要将主干上某一工程代码 Merge到分支上(或者相反)时, 不要用check out 然后全部覆盖的方法, 这样不会关联源上的任何 history, 而且需 ...
- request实现请求转发
ServletContext可以实现请求转发,request也可以. 在forward之前输入到response缓冲区中的数据,如果已经被发送到了客户端,forward将失败,抛出异常 在forwar ...
- [poj1986]Distance Queries(LCA)
解题关键:LCA模板题 复杂度:$O(n\log n)$ #pragma comment(linker, "/STACK:1024000000,1024000000") #incl ...
- 性能测试之Jmeter学习(八)
本节主要学习:断言 JMeter也有像LR中的检查点,本节就来介绍下JMeter的检查点如何去实现. JMeter里面的检查点通过添加断言来完成. 检查点:上一节讲到,我们对用户名和密码进行了参数化, ...