热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在Linux上使用VIM进行.NetCore开发

对于在Linux上开发.NetCore的程序员来说,似乎都缺少一个好的IDE.Windows上有VisualStudio,Mac上有VisualStudioforMac,难道Linux

对于在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 :OmniSharpGotoDefinition
nnoremap gd :OmniSharpGotoDefinition
" Ctrl+F12转到实现
nnoremap :OmniSharpFindImplementations
nnoremap fi :OmniSharpFindImplementations
" F11查找使用
nnoremap :OmniSharpFindUsages
nnoremap fu :OmniSharpFindUsages
nnoremap ft :OmniSharpFindType
nnoremap fs :OmniSharpFindSymbol
nnoremap fm :OmniSharpFindMembers
nnoremap fx :OmniSharpFixIssue
nnoremap fxu :OmniSharpFixUsings
nnoremap tt :OmniSharpTypeLookup
nnoremap dc :OmniSharpDocumentation
nnoremap :OmniSharpNavigateUp
nnoremap :OmniSharpNavigateDown
nnoremap gc :OmniSharpGetCodeActions
vnoremap gcv :call OmniSharp#GetCodeActions('visual')
" F2重命名
nnoremap :OmniSharpRename
nnoremap rl :OmniSharpReloadSolution
nnoremap cf :OmniSharpCodeFormat
nnoremap tp :OmniSharpAddToProject
nnoremap ss :OmniSharpStartServer
nnoremap sp :OmniSharpStopServer
nnoremap th :OmniSharpHighlightTypes
" F1切换buffer
nnoremap :buffers:buffer
" F5编译+运行
nnoremap :make
" Enter选择提示内容+显示文档
inoremap pumvisible() ? "\\:OmniSharpDocumentationa" : "\"
" Tab切换提示内容
inoremap pumvisible() ? "\" : "\"
" (选择提示内容+显示文档
inoremap ( pumvisible() ? "\:OmniSharpDocumentationa(" : "("
" 添加多行注释
inoremap /// ///kA
" 设置即时提示
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("\\", 'n')
endif
endfun
endfun
augroup END

" 定义有多行时不提示Enter继续
set cmd 转到定义时不询问保存
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.


推荐阅读
  • Spring框架入门指南:专为新手打造的详细学习笔记
    Spring框架是Java Web开发中广泛应用的轻量级应用框架,以其卓越的功能和出色的性能赢得了广大开发者的青睐。本文为初学者提供了详尽的学习指南,涵盖基础概念、核心组件及实际应用案例,帮助新手快速掌握Spring框架的核心技术与实践技巧。 ... [详细]
  • 如何构建和部署C# Windows服务应用程序
    本文介绍了如何从零开始构建和部署C# Windows服务应用程序。通过详细步骤和代码示例,帮助读者掌握创建、配置和部署Windows服务的关键技术点,适合初学者和有经验的开发人员参考。 ... [详细]
  • 深入解析经典卷积神经网络及其实现代码
    深入解析经典卷积神经网络及其实现代码 ... [详细]
  • 利用C#技术实现Word文档的动态生成与编辑
    本文通过一个简单的示例,介绍了如何使用C#语言实现Word文档的动态生成与编辑功能。文章详细阐述了在项目中引用Word动态库的方法,并通过具体代码示例展示了如何创建和操作Word表格。此内容旨在为初学者提供参考和学习资料,欢迎读者提出宝贵意见和建议。 ... [详细]
  • 使用 MyEclipse 和 TestNG 测试框架在 Java 中高效进行单元测试
    通过MyEclipse集成TestNG测试框架,可以在Java开发中高效地进行单元测试。本文介绍了在JDK 1.8.0_121和MyEclipse 10.0离线环境下配置和使用TestNG的具体步骤,帮助开发者提高测试效率和代码质量。 ... [详细]
  • 开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用
    开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • 在当前各种算法实现和开源软件包层出不穷的背景下,算法对程序员的重要性是否有所减弱?回顾历史,早期程序员必须熟练掌握算法并频繁自行编写。然而,随着技术的发展,算法逐渐成为一种“商品”,现代开发者更多依赖现成的库和商业算法解决方案。有观点认为,机器学习领域中,许多算法已经被高度封装,不再需要深入理解其背后的数学原理。然而,这种趋势也引发了关于技术深度与广度平衡的讨论,强调了基础理论知识在应对复杂问题时的不可替代性。 ... [详细]
  • 利用PaddleSharp模块在C#中实现图像文字识别功能测试
    PaddleSharp 是 PaddleInferenceCAPI 的 C# 封装库,适用于 Windows (x64)、NVIDIA GPU 和 Linux (Ubuntu 20.04) 等平台。本文详细介绍了如何使用 PaddleSharp 在 C# 环境中实现图像文字识别功能,并进行了全面的功能测试,验证了其在多种硬件配置下的稳定性和准确性。 ... [详细]
  • 深入解析:RKHunter与AIDE在入侵检测中的应用与优势
    本文深入探讨了RKHunter与AIDE在入侵检测领域的应用及其独特优势。通过对比分析,详细阐述了这两种工具在系统完整性验证、恶意软件检测及日志文件监控等方面的技术特点和实际效果,为安全管理人员提供了有效的防护策略建议。 ... [详细]
  • 在Linux系统中,原本已安装了多个版本的Python 2,并且还安装了Anaconda,其中包含了Python 3。本文详细介绍了如何通过配置环境变量,使系统默认使用指定版本的Python,以便在不同版本之间轻松切换。此外,文章还提供了具体的实践步骤和注意事项,帮助用户高效地管理和使用不同版本的Python环境。 ... [详细]
  • 如何利用Apache与Nginx高效实现动静态内容分离
    如何利用Apache与Nginx高效实现动静态内容分离 ... [详细]
  • 深入解析Wget CVE-2016-4971漏洞的利用方法与安全防范措施
    ### 摘要Wget 是一个广泛使用的命令行工具,用于从 Web 服务器下载文件。CVE-2016-4971 漏洞涉及 Wget 在处理特定 HTTP 响应头时的缺陷,可能导致远程代码执行。本文详细分析了该漏洞的成因、利用方法以及相应的安全防范措施,包括更新 Wget 版本、配置防火墙规则和使用安全的 HTTP 头。通过这些措施,可以有效防止潜在的安全威胁。 ... [详细]
  • 2019年斯坦福大学CS224n课程笔记:深度学习在自然语言处理中的应用——Word2Vec与GloVe模型解析
    本文详细解析了2019年斯坦福大学CS224n课程中关于深度学习在自然语言处理(NLP)领域的应用,重点探讨了Word2Vec和GloVe两种词嵌入模型的原理与实现方法。通过具体案例分析,深入阐述了这两种模型在提升NLP任务性能方面的优势与应用场景。 ... [详细]
  • Windows环境下详细教程:如何搭建Git服务
    Windows环境下详细教程:如何搭建Git服务 ... [详细]
author-avatar
易_拉罐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有