vim IDE环境搭建

1.    使用ctags—建立标签,用于程序跳转

"tags"文件中包括这些对象的列表:

用#define定义的宏

枚举型变量的值

函数的定义、原型和声明

名字空间(namespace)

类型定义(typedefs)

变量(包括定义和声明)(局部变量不行)

类(class)、结构(struct)、枚举类型(enum)和联合(union)

类、结构和联合中成员变量或函数

 

在源码目录创建tag文件,进入源码目录后输入ctags -R

 "-R"表示递归创建,也就包括源代码根目录下的所有子目录下的源程序。(虽然目录下没有子目录,但不加-R居然不行,小写的r也不行)

若输入后提示错误,如:ctags: no input files specified. 最可能的原因就是ctags的版本太低了,

http:8//ctags.sourceforge.net 下载最新版本(目前是5.8),解压并安装:

tar-zxvf ctags-5.8.tar.gz

cdctags-5.8

./configure

make

sduomake install(需root权限)

 

最方便的使用方法就是打开你的源文件,把光标移到变量名或函数名上,然后按下""就会跳转到对应的定义。用"Ctrl+t或。

注意:运行vim的时候,必须在"tags"文件所在的目录下运行。否则,运行vim的时候还要用":set tags="命令设定"tags"文件的路径,这样vim才能找到"tags"文件。

gd转到当前光标所指的局部变量的定义,经测试Ctrl+o可退回原来的地方,此外可通过n/N上下来回切换。

 * 转到当前光标所指的单词下一次出现的地方(经测试,n就行,果断用这个)

 # 转到当前光标所指的单词上一次出现的地方(同上,N就行,果断用这个)

 

不过还有一个小瑕疵, 你修改程序后, 比如增加了函数定义,删除了变量定义, tags文件不能自动rebuild, 你必须手动再运行一下命令:

$ctags -R

使tags文件更新一下, 不过让人感到欣慰的是vim不用重新启动, 你可以通过输入

:!ctags -R 即可。

正在编写的程序也不用退出, 马上就可以又正确使用Ctrl+]了.。

 

2.    使用taglist—浏览源码,估计类似于source insight

       注意:taglist依赖于ctags,所以要先装ctags,否则taglist装了也没法用!

http://www.vim.org/scripts/script.php?script_id=273 下载最新版本

(目前是45)

下载后,把该文件在~/.vim/目录中解压缩,解压命令:unzip taglist_45.zip

这会在你的~/.vim/plugin和~/.vim/doc目录中各放入一个文件:

plugin/taglist.vim– taglist插件

doc/taglist.txt    - taglist帮助文件

 

       使用下面的命令生成帮助标签(下面的操作在VIM中进行):

:helptags~/.vim/doc

生成帮助标签后,你就可以用下面的命令查看taglist的帮助了:

:helptaglist.txt

 

接着先在你的~/.vimrc文件中添加下面两句:

letTlist_Show_One_File = 1      "不同时显示多个文件的tag,只显示当前文件的

letTlist_Exit_OnlyWindow = 1    "如果taglist窗口是最后一个窗口,则退出vim

此时用vim打开一个c源文件,

进入vim后用下面的命令打开taglist窗口

:Tlist

自建快捷方式:

在~/.vimrc中输入:

nnoremap<silent> <F9> :Tlist<CR>

意思是按F9代替:Tlist。(这种方法真好用)

 

左边的窗口就是TagList窗口, 其中列出了xx.c文件中的tag, 并且按照"typedef","variable", "function"等进行了分类.

将光标移到上面,按下回车键后, 会自动跳转到其在源码的定义处.

然后按下的是空格键, 在下面的命令栏中, 会显示该tag在源码中完整的写法, 而不会跳转到源码处。

 

taglist窗口中,可以使用下面的快捷键:

o            在一个新打开的窗口中显示光标下tag
<Space>   
显示光标下tag的原型定义

回车键   跳到光标所在的标记的定义处(如将光标移到main函数,按回车键)
u            
更新taglist窗口中的tag

(比如源文件新增了一个函数并在保存后,可在taglist窗口按u

s            更改排序方式,在按名字排序和按出现顺序排序间切换
x            taglist
窗口放大和缩小,方便查看较长的tag
+            
打开一个折叠,同zo
-            
tag折叠起来,同zc
*            
打开所有的折叠,同zR
=            
将所有tag折叠起来,同zM
[[             
跳到前一个文件
]]            
跳到后一个文件
q             
关闭taglist窗口

3.     a.vim—快速切换头文件/源文件

http://www.vim.org/scripts/script.php?script_id=31 下载a.vim

       将a.vim 放到 ~/.vim/plugin 文件夹中

 

       安装好a.vim后常用命令如下:

:A    在新Buffer中切换到c/h文件

:AS  横向分割窗口并打开c/h文件

:AV  纵向分割窗口并打开c/h文件

:AT  新建一个标签页并打开c/h文件(不懂有什么用)

 

自建快捷方式:

在~/.vimrc中输入:

nnoremap<silent> <F12> :A<CR>

意思是按F12代替:A。

 

4.     winmanager—文件浏览器和窗口管理器

我们通过WinManager来管理文件浏览器netrw和标签浏览器Taglist。

netrw是标准的vim插件, 已经随vim一起安装进系统里了, 不需要我们自行下载安装。

http://www.vim.org/scripts/script.php?script_id=95 下载winmanager,

       (目前版本2.3)

下载后,把该文件在~/.vim/目录中解压缩,解压命令:unzip winmanager.zip

这自动会在你的~/.vim/plugin和~/.vim/doc目录中放入相关文件。

帮助文件 :help winmanager

 

在~/.vimrc中输入:

g:winManagerWindowLayout='FileExplorer|TagList'

nnoremap<silent> <F3> :WMToggle<CR>

 

文件浏览器命令(在文件浏览器窗口中使用)

 

<enter>如果光标下是目录, 则进入该目录; 如果光标下是文件, 则打开该文件

<tab>如果光标下是目录, 则进入该目录; 如果光标下是文件, 则在新窗口打开该文件

<F5>刷新列表

-  返回上一层目录

c  使浏览目录成为vim当前工作目录(挺不错)

d  创建目录(无法创建,不知道为什么)

D  删除当前光标下的目录或文件(目录必须为空才能成功删除)

i  主要显示文件的大小和创建时间

R  文件或目录重命名

x  定制浏览方式, 使用你指定的程序打开该文件(目前估计用不到)

 

注:以下的s,z要在i关闭的情况下(即不显示文件的详细信息)使用,

以免提示错误。

s  选择排序方式(名字/创建日期/大小来回切换)

r  反向排序列表

winmanager帮助文档

:helpwinmanager

netrw帮助文档

:helpnetrw

 

5.     Cscope 

它被设计用来回答以下的问题:

*什么地方用到了这个符号?

*这是在什么地方定义的?

*这个变量在哪里被赋值?

*这个全局符号的定义在哪里?

*这个函数在源文件中的哪个地方?

*哪些函数调用了这个函数?

*这个函数调用了哪些函数?

*信息 "out of space" 从哪来?

*这个源文件在整个目录结构中处于什么位置?

*哪些文件包含这个头文件?

 

http://cscope.sourceforge.net 下载一个源码包, 解压后编译安装:

tar-zxvf cscope-15.7a.tar.bz2

cdcscope-15.7a

./configure

make

sduomake install(需root权限)

 

我在安装过程中出现一些问题:

如果 make 时出现“curses.h not found”之类的错误,则需要先安装“libncurses-dev”包

apt-getinstall libncurses-dev

之后回到安装目录

makeclean &&./configure&&make&&make install

如果make出现`flex' is missing on your system.则需要安装flex包,余同上

如果make出现yacc: 未找到命令 则需要安装byacc包,余同上

 

擦,居然上面3个问题都出现了!真麻烦。

 

在~/vimrc中我的配置如下:

"--Cscope setting --

setcscopequickfix=s-,c-,d-,i-,t-,e-" 使用QuickFix窗口来显示cscope查找结果

"将:cs find c等Cscope查找命令映射为<C-_>c等快捷键

(按法是先按Ctrl+Shift+-, 然后很快再按下c)

nmap <C-_>s :cs find s<C-R>=expand("<cword>")<CR><CR>

 nmap <C-_>g :cs find g<C-R>=expand("<cword>")<CR><CR>

 nmap <C-_>c :cs find c<C-R>=expand("<cword>")<CR><CR>

 nmap <C-_>t :cs find t<C-R>=expand("<cword>")<CR><CR>

 nmap <C-_>e :cs find e<C-R>=expand("<cword>")<CR><CR>

 nmap <C-_>f :cs find f<C-R>=expand("<cfile>")<CR><CR>

 nmap <C-_>i :cs find i<C-R>=expand("<cfile>")<CR><CR>

nmap <C-_>d :cs find d<C-R>=expand("<cword>")<CR><CR>

 map <F2> :cs add./cscope.out<CR>:copen<CR>

 

cscope的用法很简单,首先需要为你的代码生成一个cscope数据库。

即进入vim后第一件事是要把刚才生成的cscope文件导入到vim中来,

在你的项目根目录运行下面的命令:

cscope-Rbq

这个命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。其中cscope.out是基本的符号索引,后两个文件是使用”-q “选项生成的,可以加快cscope的索引速度。

在缺省情况下,cscope在生成数据库后就会进入它自己的查询界面,一般不用这个界面,所以使用了”-b “选项。如果你已经进入了这个界面,按CTRL+D 退出。

cscope各个选项的含义:

-R:在生成索引文件时,搜索子目录树中的代码

-b:只生成索引文件,不进入cscope的界面

-q:生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度

 

在VIM中使用cscope也很简单,首先调用“:cs add cscope.out ”命令添加一个cscope数据库,然后就可以调用“cscope find ”命令进行查找了。

"cscopefind"的用法:

csfind c|d|e|f|g|i|s|t name

下面列出find的一些选项:

s:查找C语言符号,即查找函数名、宏、枚举值等出现的地方

g:查找函数、宏、枚举等定义的位置,类似ctags所提供的功能

d:查找本函数调用的函数

c:查找调用本函数的函数

t:查找指定的字符串

e:查找egrep模式,相当于egrep功能,但查找速度快多了

f:查找并打开文件,类似vim的find功能

i:查找包含本文件的文件

注:在查找时可以简单的输入":cs f s name "

输完命令后,按下回车后vim会自动跳转到第一个符合要求的地方, 并且在命令栏显示有多少符合要求的结果。

如果自动跳转的位置你不满意, 想看其他的结果,

可以用下面的命令打开QuickFix窗口:

:cw

这时你就可以慢慢挑选了。

 

如果每次查找都要输入一长串命令的话还真是件讨人厌的事情, Cscope的帮助手册中推荐了一些快捷键的用法, 下面是其中一组, 也是我用的, 将下面的内容添加到~/.vimrc中, 并重启vim:

nmap<C-_>s :cs find s<C-R>=expand("<cword>")<CR><CR>

nmap<C-_>g :cs find g<C-R>=expand("<cword>")<CR><CR>

nmap<C-_>c :cs find c<C-R>=expand("<cword>")<CR><CR>

nmap<C-_>t :cs find t<C-R>=expand("<cword>")<CR><CR>

nmap<C-_>e :cs find e<C-R>=expand("<cword>")<CR><CR>

nmap<C-_>f :cs find f<C-R>=expand("<cfile>")<CR><CR>

nmap<C-_>i :cs find i<C-R>=expand("<cfile>")<CR><CR>

nmap<C-_>d :cs find d<C-R>=expand("<cword>")<CR><CR>

 

当光标停在某个你要查找的词上时, 按下<C-_>g, 就是查找该对象的定义, 其他的同理.

按这种组合键有一点技巧,按了<C-_>后要马上按下一个键,否则屏幕一闪就回到nomal状态了<C-_>g的按法是先按"Ctrl+Shift+-", 然后很快再按"g".

 

注:跳转后,经自己测试,ctrl+o可以返回远处。

 

reset: 重新初始化所有连接。

用法  : cs reset

 

6.    QuickFix—用于调试

       帮助文档

:helpusr_30

:helpquickfix

如果编译时
:make出现错误,

按 <Enter>,回到vim界面,看不到出错信息了!这时,可以运行以下命令

:cw或:copen

(:copen和:cclose不错,即使不在QuickFix窗口内,也可直接将其开启和关闭)

打开quickfix窗口来查看出错信息,它会自动跳到第一处出错的地方。

你还可以用下面的命令来跳转:

:cn      切换到下一个结果

:cp      切换到上一个结果

 

我在~/.vimrc中配置如下:

 

 "-- QuickFix setting --

      "按下F5,执行make clean

       map <F5> :makeclean<CR><CR><CR>:copen<CR>

 " 按下F6,执行make编译程序,并打开quickfix窗口,显示编译信息

       map <F6>:make<CR><CR>:copen<CR><CR>

      "按下F7,光标移到下一个错误所在的行

       map <F7> :cn<CR>

      "按下F8,光标移到上一个错误所在的行

       map <F8> :cp<CR>

 

最后,编译顺利通过后,输入:!./xxx 就可以运行生成的可执行程序xxx了,不用退出vim。

 

7.    MiniBufExplorer—快速浏览和操作Buffer

http://www.vim.org/scripts/script.php?script_id=159 下载minibufexpl.vim。

       (目前版本为6.3.2)

       将下载的 minibufexpl.vim文件丢到 ~/.vim/plugin 文件夹中即可。

       buffer管理器MiniBufferExplorer

MiniBufferExplorer用于浏览和管理buffer,如果只打开一个文件,是不会显示在屏幕上的,而打开多个文件之后,会自动出现在屏幕最上方。

vim也有自带的buffer管理工具,不过只有:ls, :bnext, :bdelete 等的命令, 既不好用, 又不直观.

关于vim缓冲区(buffer)和窗口的概念(详见:help windows)

"缓冲区" 是一块内存区域,里面存储着正在编辑的文件。如果没有把缓冲区里的文件存盘,那么原始文件不会被更改。

"窗口" 被用来查看缓冲区里的内容。你可以用多个窗口观察同一个缓冲区,也可以用多个窗口观察不同的缓冲区。

"屏幕" Vim 所用的整个工作区域,可以是一个终端模拟窗口,也被叫做"Vim 窗口"。一个屏幕包含一个或多个窗口,被状态行和屏幕底部的命令行分割。

        +-------------------------------+

屏幕    | 窗口 1        | 窗口 2        |

        |               |               |

        |               |               |

        |=== 状态行  ===|==== 状态行 ===|

        | 窗口 3                        |

        |                               |

        |                               |

        |========== 状态行 =============|

        |命令行                         |

        +-------------------------------+

 

屏幕最上方那个狭长的窗口就是MiniBufExplorer窗口, 其中列出了当前所有已经打开的buffer, 当你把光标置于这个窗口时, 有下面几个快捷键可以用:

 

常用命令

<Tab>                       移到上一个buffer

<Shift-Tab>          移到下一个buffer

<Enter>              打开光标所在的buffer

d                        删除光标所在的buffer

 

注:如果将文件改动后没保存时,buffer会变色,且在[xxx]后加个+,变为[xxx]+提醒用户。

 

配合 ctrl+^ 就可以轻松地在他们之间来回切换,比如现在同时打开了6个文件,则就有6个不同的缓冲区,比如现在在编辑文件1,想切换到文件5去,则需要先把本文件保存,然后再按5,就切换到文件5了。

 

注:如果就2个文件,可输入2, 再按ctrl+^,

然后就可以ctrl+^在2个文件间快速切换了。

:eXX 如果xx文件存在则打开,如果不存在则新建一个名为XX的文件。
e=edit。(很有用)

 

8.    fold—代码折叠(不用下载插件)

折叠用于把缓冲区内某一范围内的文本行显示为屏幕上的一行。就像一张纸,要它缩短

些,可以把它折叠起来。

      那些文本仍然在缓冲区内而没有改变。受到折叠影响的只是文本行显示的方式。

折叠的好处是,通过把多行的一节折叠成带有折叠提示的一行,

会使你更好地了解文本的宏观结构。

 

折叠方式foldmethod

vim提供以下6种方法来选定折叠方式:

manual手工定义折叠

indent更多的缩进表示更高级别的折叠

expr用表达式来定义折叠

syntax用语法高亮来定义折叠

diff  对没有更改的文本进行折叠

marker对文中的标志折叠

 

我们按照语法高亮来折叠代码, 其实就是按照代码中的一些括号来定义折叠位置, 比如: "{ }", "/* */". 现在练习一下,就在nomal模式下输入命令"za", 你会发现当前光标所在的最近的一层括号被折叠起来了, 再输入一遍"za"命令, 这个折叠又打开了, "za"命令就是打开/关闭当前折叠用。

 

常用命令(够用了):

za  打开/关闭在光标下的折叠

zM  关闭所有折叠

zR  打开所有的折叠

 

帮助文档

:helpusr_28.txt

:helpfold.txt

 

 

9.    在http://www.vim.org/scripts/script.php?script_id=1520 上下载omnicppcomplete

       解压 unzip omnicppcomplete-0.41.zip -d ~/.vim 

 

       使用下面的命令生成帮助标签(下面的操作在VIM中进行):

:helptags~/.vim/doc

生成帮助标签后,你就可以用下面的命令查看taglist的帮助了:

:h omnicppcomplete

 

omnicppcomplete主要依赖ctags生成的tags文件来判断补全的,所以首先应该生成一定的信息。也就是说应该先把类写好,然后再生成tags,以后出现对象的 ”.” 或 ”->”成员操作时它自动寻找成员函数。

 

onmicppcompete功能:

命名空间(namespace),类(class),结构(struct)和联合(union)补全

函数属性成员和返回值类型补全

"this"指针成员补全

C/C++类型转换(cast)对象补全

类型定义(typedef)和匿名类型(anonymous types)补全

 

OmniCppComplete是基于ctags数据库即tags文件实现的(基于ctags生成的索引信息来实现自动补全的).

对于C++代码, 在ctags -R生成tags时还需要一些额外的选项,这样生成的tags文件才能与OmniCppComplete配合运作。使用下列命令生成tags文件,就可以与OmniCppComplete配合运作:

ctags-R --c++-kinds=+p --fields=+iaS --extra=+q .

 

--c++-kinds=+p  : 为C++文件增加函数原型的标签

--fields=+iaS   : 在标签文件中加入继承信息(i)、类成员的访问控制信息(a)、以及函数的指纹(S)

extra=+q    : 为标签增加类修饰符。注意,如果没有此选项,将不能对类成员补全

 

10.  echofunc提示函数原形

http://www.vim.org/scripts/script.php?script_id=1735 上下载echofunc

(目前版本1.3)

把echofunc.vim 文件丢到 ~/.vim/plugin 文件夹就好了.

      

当编程调用一个函数时, 最可恶的是忘了这个函数参数列表的详细定义了, 然后要跳转到定义处看看, 再跳转回来继续写, 如果参数列表太长了, 还要来回跳转多次。

 

言归正传, 该插件的作用是当你在vim插入(insert)模式下紧接着函数名后输入一个"("的时候, 这个函数的声明就会自动显示在命令行中. 如果这个函数有多个声明, 则可以通过按键"Alt+-"和"Alt+="向前和向后翻页, 这个两个键可以通过设置EchoFuncKeyPrev和EchoFuncKeyNext参数来修改.

 

这个插件的功能需要tags文件的支持, 并且在创建tags文件的时候要加选项"--fields=+lS", 整个创建tags文件的命令如下:

 

$ctags -R --fields=+lS

 

还有一个小技巧告诉你, 当你把鼠标放在函数名上的时候会有一个tip窗口弹出, 该窗口中也会有函数的声明, 这个功能需要你在编译vim时编译"+balloon_eval"特性了.

 

11.  Omni Completeion-全能补全

       帮助文件 :help new-omni-completion

       在~/.vimrc文件中增加下面两句:

filetypeplugin indent on    打开文件类型检测, 加了这句才可以用智能补全

setcompleteopt=longest,menu 关掉智能补全时的预览窗口

 

请确定你的Ctags已经安装好, 并且生成的tags文件已经可以用了。

打开源文件,随便找一个有成员变量的对象, 比如"parmp", 进入Insert模式, 将光标放在"->"或"."后面,

然后按下"Ctrl+X Ctrl+O", 在vin的状态行会显示“”,表明现在进行的是全能补全,同时会弹出一个下拉菜单,显示所有匹配的标签。

你可以使用Ctrl+N/Ctrl+P来上下选择(果断推荐),在选择的同时,所选中的项就被放在光标位置,不需要再按回车来把它放在光标位置。

当然你也可以使用上、下光标键来选择项目(不推荐),然后按回车把选中的项目放到光标位置。不过这样一来,你的手指就会离开主编辑区,并且需要多输入一个回车键。

 

常用的快捷方式:

Ctrl+N    向后切换成员

Ctrl+P    向前切换成员

Ctrl+E    表示退出下拉窗口, 并退回到原来录入的文字

Ctrl+Y    表示退出下拉窗口, 并接受当前选项

 

如果你增加了一些成员变量, 全能补全还不能马上将新成员补全, 需要你重新生成一下tags文件, 但是你不用重启vim, 只是重新生成一下tags文件就行了, 这时全能补全已经可以自动补全了, 还真够"全能"吧.

 

vim中的其他补全方式还有:

Ctrl+XCtrl+L

整行补全

Ctrl+XCtrl+N       根据当前文件里关键字补全

Ctrl+XCtrl+K 根据字典补全

Ctrl+XCtrl+T 根据同义词字典补全

Ctrl+XCtrl+I  根据头文件内关键字补全

Ctrl+XCtrl+]  根据标签补全

Ctrl+XCtrl+F 补全文件名

Ctrl+XCtrl+D       补全宏定义

Ctrl+XCtrl+V 补全vim命令

Ctrl+XCtrl+U       用户自定义补全方式

Ctrl+XCtrl+S 拼写建议

 

12.  supertab-加速你的补全

http://www.vim.org/scripts/script.php?script_id=1643 上下载supertab.vba

       (目前版本1.6)

       install details

Downloadsupertab.vba to any directory.

Openthe file in vim ($ vim supertab.vba).

Sourcethe file (:so %).

帮助文档: :help supertab

 

在你的~/.vimrc文件中加上这两句:

letg:SuperTabRetainCompletionType=2

letg:SuperTabDefaultCompletionType="<C-X><C-O>"

 

以后当你准备按"Ctrl+X Ctrl+O"的时候直接按<Tab>就好了。

(前提当然时得在插入模式下)

出现下拉表时,按tab向下选择,shift+tab向上选择。

其中

letg:SuperTabRetainCompletionType=2

"0 - 不记录上次的补全方式

"1 - 记住上次的补全方式,直到用其他的补全命令改变它

"2 - 记住上次的补全方式,直到按ESC退出插入模式为止

 

问题:

<Tab>键不好用了, 如果前面有字符按下<Tab>键后就会进行补全, 而不是缩进功能。

 

13.  c.vim

利用c.vim插件,你可以实现

添加文件头

添加注释

插入一些代码片段

语法检查

读函数文档

注释代码块

 

安装很简单,将cvim.zip拷贝到~/.vim目录下,然后unzip就可以了。

还要在~/.vimrc中添加filetype plugin on。

 

常用快捷键(在n,i模式均可以):

\im    main( );

\if      function( );

\ip    printf( );

\isc   scanf( );

\ifp   fprintf( );

\ifs   fscanf( );

\ica   p=calloc( );

\ima   p=malloc( );

\ire   p=realloc( );

\is    struct + typedef

\iu    union + typedef

\ie    enum + typedef

 

\cfu   插入函数头,即函数说明

\cfr   插入一个注释框架,可以用来写变量说明

 

注:以下几个命令组合配合强大,好记,推荐。

\si    if( )

\se    else{ }

\sif   if(){ }

\sife  if( ){ } else { }

\sw    while( )

\sd    do{ } while( )

\sf    for( )

\ss    switch   (默认case3个)

\sc    case: break;(增加case个数)

{<CR>  {             (此命令得在i模式下)

                      |

}

 

\p<    #include<...>

\p"    #include"..."

\pd    #define;

\pind  #ifndef #define ... #endif

 

\rc    save and compile

\rl    link

\rr    run

\rm    run make

\rmc   run make clean

 

\nr   可以在~/.vim/c-support/codesnippets中编写一些预编译代码或者代码块

通过此命令使用。

 

       以下命令只能在i模式下运行:

       /*          /*  */

       /*<CR>      /*

                             *

                             */

       {<CR>       {

                                   |

}

      

 

c-support还有很多快捷键,可以参见文件~/.vim/c-support/doc/c-hotkeys.pdf。

如果记不住就打印一份,编写程序的时候看着用就好啦.

如果用gvim的话,有菜单可以用,也可以不用记那么多的快捷键。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值