打造自己的 Python 编码环境

开发 后端
一个好的程序员必须善用各种工具提升自己的开发效率,和提升自己的幸福指数。另外,个人觉得vim还是值得自己重新一配的,我的配置过程基本都是在 读spf13的配置,读懂,然后选取,可是中间还是出了很多问题,比如因为我没有用pymode插件,所以在用括syntastic的 local_list在退出或者分屏时的位置,都令我很蛋疼。

前言

 

趁着放假,重新配置了一下自己的Mac的编程环境,毕竟新年新气象嘛,主要是iTerm2、Zsh、vim 优化、Consolas字体、NoisyTyper,这些的相关配置。工欲利其事必先利其器,好的编码环境可以提升我们的打码的幸福感。好的编码环境包括 美观(视觉),声音(听觉),流畅度(触觉),工作环境(嗅觉,味觉)等多个方面。后面有几张配置后的图片感受一下,主要看字体和配色(有些人可能觉得比 较丑,个人喜欢黑紫,配色和字体有很多选择,各有所好,求别喷 XD)。

 

 

 

准备阶段:器

iTerm2:是os系统中的一个替代终端。主要优点:屏幕分割(可以水平分割和垂直分割),选中即复制,快速查找(command+f),配色字体自定义化,自定义快捷键等。

Consolas:微软下最好看的字体之一,个人认为很适合程序员,除开字体好看外,主要原因是它的数字“0”字加入了一斜撇,以方便与字母“o”分辨。这也是我和它结缘的主要缘由,当年在某次acm比赛中,就是因为肉眼无法分辨是0还是o,遗憾至今。

Zsh:zsh和bash一样是Shell的一种。相比bash:更高效、更好的自动补全、更好的文件名展开(通配符展开)、更好的数组处理、可定制性高。mac下自带了zsh,无需再安装。

Vim:是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性。和Emacs并列成为类Unix系统用户最喜欢的编辑器。估计大家都很熟悉,不做累述。

NoisyTyper:一款提升你打字逼格的软件,可以让你打字的时候发出打字机的声音,咔咔咔这样。

上面几个安装都比较简单,教程也比较多。这里主要讲一下mac下consolas字体的安装。

  1. $ brew install cabextract 
  2. $ cd ~/Downloads 
  3. $ mkdir consolas 
  4. $ cd consolas 
  5. $ curl -O http://download.microsoft.com/download/f/5/a/f5a3df76-d856-4a61-a6bd-722f52a5be26/PowerPointViewer.exe 
  6. $ cabextract PowerPointViewer.exe 
  7. $ cabextract ppviewer.cab 
  8. $ open CONSOLA*.TTF 

最后按下弹出窗口的安装键就ok了。

打磨阶段:利器

上面的工具准备好了后,就可以开始配置这些工具了。

Zsh配置

oh-my-zsh:一套强大的开源zsh配置文件。安装如下:

  1. // 使用curl安装 
  2. $ sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" 
  3. // 或者使用wget安装 
  4. $ sh -c "$(wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)" 
  5. // 安装后重新载入配置 
  6. $ source .zshrc 

oh-my-zsh主题: oh-my-zsh有多款配套主题,点击前面的主题链接可以看到所有主题。这里主要介绍下agnoster主题。修改zsh配置文件(~/.zshrc)中的主题属性为agnoster即可。官方图如下:

 

安装这个主题需要额外安装powerline字体,不然会显示乱码。如果你想隐藏自己的用户名信息,需要在zsh配置文件中设置默认用户。具体安装配置如下:

 

  1. // 修改zsh配置文件 
  2. $ vim ~/.zshrc 
  3.   ZSH_THEME="agnoster"  //在.zshrc中修改ZSH_THEME 
  4.   DEFAULT_USER=username // 在.zshrc中添加或者修改默认用户为自己,开启终端后就不会显示自己的用户名信息 
  5. $ source ~/.zshrc       // 重新载入配置文件 
  6.  
  7. // poweline font 安装 
  8. $ git clone https://github.com/powerline/fonts.git 
  9. $ cd powerline 
  10. $ ./install.sh 

iTerm2配置

字体:接着要在iterm2的Perferences中Text中选择常规字体 为consolas字体或者其他你喜欢的字体,非ASCII码字体为powerline字体(一定要是名字中带powerline的字体,不然还是乱码)。如下:

 

iTerm2配色:从这里可 以获取很多别人的配色主题,把整个项目git clone下来,然后在iterm2的Perferences中的Colors最下面的Load Presets中import git下来的terminal文件,自己可以根据自己喜欢调整自己喜欢的颜色,我选的是Fish Tank,我自己微调了一些配色。如下:

 

Vim配置

之前一直用spf13,但是打开大文件太卡了,所以自己重新配置了一份。实测打开8000+行代码的文件,因为语法检测,所以大概延时1s左右,之 后操作很顺畅。在配置过程中会遇到很多蛋疼的地方。需要比较系统的学习一下vim脚本的语法和相关配置方法,vim网上很多配置好文,如《像 IDE 一样使用 vim》,还有《vim 脚本学习文档》,我就不累述了,配置文件的注释写的比较详细。我的配置主要针对python开发,另外需要额外安装python包flake8。具体如下:

vimrc文件,主要是vim基础配置。(highlight.js不支持vim script,有点蛋疼)

 

  1. " .vimrc 
  2. " 相关vim脚本文档 http://vimdoc.sourceforge.net 
  3. " 相关好文 https://github.com/yangyangwithgnu/use_vim_as_ide 
  4.  
  5. " 基本配置 
  6. set nocompatible "不要vim模仿vi模式,建议设置,否则会有很多不兼容的问题 
  7. set mouse=a      " 启动鼠标所有模式,但是右键功能不可用, 可以保证鼠标滚屏在当前屏幕内 
  8. set mousehide    " 输入文件时隐藏鼠标 
  9. set backspace=indent,eol,start   " 退格键分别可删除缩进,上一行结束,insert之前的字 
  10. set showmatch     " 设置匹配模式 
  11. set nobackup      " 不备份 
  12. set nowritebackup " 不写入备份文件 
  13. set noswapfile    " 关闭交换文件 
  14. set history=500   " history存储长 
  15. set ruler         " 显示标尺 
  16. set showcmd       " 显示输入命令 
  17. set incsearch     " 搜索时自动匹配 
  18. set hlsearch      " 高亮搜索项 
  19. set ignorecase    " 无视大小写 
  20. set smartcase     " 如果有大写就区别大小写匹配 
  21. set laststatus=2  " 总是显示状态栏 
  22. " set autowrite     " 切换文件自动保存 
  23. set shortmess=atI"  " 关闭欢迎页面 
  24. set viewoptions=folds,options,cursor,unix,slash " Better Unix / Windows compatibility 
  25. set virtualedit=onemore             " 光标可以移到当行最后一个字符之后 
  26. set hidden                          " 切换文件不保存,隐藏 
  27. "set confirm       " 退出前验证 
  28. " set spell         " 拼写检查 
  29. set linespace=0   " 行之间没有多余的空格 
  30. set wildmenu      " 自动补全时的文件菜单 
  31. set wildmode=list:longest,full " 自动补全时,匹配最长子串,列出文件 
  32. set whichwrap=b,s,h,l,<,>,[,]  " 行尾可右移到下行,行首左移到上行,b:退格,s:空格,hl:左右,<>:n/v模式下的左右,[]:i/r模式下的左右 
  33. set scrolljump=5  " 光标离开屏幕范围 
  34. set scrolloff=3   " 光标移动至少保留行数 
  35.  
  36. " 格式 
  37. set nowrap        " 取消自动折行 
  38. set autoindent    " 自动缩进 
  39. set shiftwidth=4  " 缩进位宽=4个空格位 
  40. set expandtab     " tab由空格表示 
  41. set tabstop=4     " tab=4空格 
  42. set softtabstop=4 " 回退可以删除缩进 
  43. set nojoinspaces  " 用J合并两行用一个空格隔开 
  44. set splitright    " 用vsplit新建窗口,让新的放右边 
  45. set splitbelow    " 用split新建窗口,让新的放下面 
  46. set pastetoggle=<F12> " 指定F12进入黏贴模式,可以正常复制缩进 
  47. set iskeyword-=.  " 让'.' 作为单词分割符 
  48. set iskeyword-=#  " 让'#' 作为单词分割符 
  49. set iskeyword-=-  " 让'-' 作为单词分割符 
  50. set listchars=tab:›/ ,trail:•,extends:#,nbsp:. " 空格等无效字符显示 
  51. set textwidth=80  " 内容宽度 
  52. set fileencodings=utf-8,gb18030,gbk,big5 " 文件编码 
  53. " 文件保存时处理首尾空格,^M字符 
  54. let g:keep_trailing_whitespace = 1 
  55. function! StripTrailingWhitespace() 
  56.     let _s=@/ 
  57.     let l = line("."
  58.     let c = col("."
  59.     %s//s/+$//e 
  60.     let @/=_s 
  61.     call cursor(l, c) 
  62. endfunction 
  63. autocmd FileType c,cpp,java,go,php,javascript,python,twig,xml,yml autocmd BufWritePre <buffer> if exists('g:keep_trailing_whitespace') | call StripTrailingWhitespace() | endif 
  64.  
  65. " 开启新的buffer时,自动转到对应文件目录 
  66. let g:autochdir = 1 
  67. if exists('g:autochdir'
  68.     autocmd BufEnter * if bufname("") !~ "^/[A-Za-z0-9/]*://" | lcd %:p:h | endif 
  69. endif 
  70.  
  71. " 恢复光标最后编辑位置 
  72. au BufWinLeave *.py,*.c,*.cpp,*.css,*.html,*.js,*php mkview 
  73. au BufWinEnter *.py,*.c,*.cpp,*.css,*.html,*.js,*php silent loadview 
  74.  
  75. " 设置u的返回步数限制 
  76. if has('persistent_undo'
  77.     set undofile               " 开启u回滚文件记录 
  78.     set undolevels=1000         " 最大数量的改变回滚 
  79.     set undoreload=10000        " 最大数量重载可回滚行数 
  80. endif 
  81.  
  82. " 特殊文件打开 
  83. autocmd BufNewFile,BufRead *.py,*.pyw set filetype=python 
  84. autocmd BufNewFile,BufRead *.html.twig set filetype=html.twig 
  85. autocmd FileType haskell setlocal expandtab shiftwidth=2 softtabstop=2 
  86. autocmd BufNewFile,BufRead *.coffee set filetype=coffee 
  87. autocmd FileType haskell setlocal commentstring=--/ %s 
  88. autocmd FileType haskell setlocal nospell 
  89.  
  90. " key 映射 
  91. let mapleader = ','         " 全局leader设置 
  92. let maplocalleader = '_'    " 本地leader设置 
  93.  
  94. " 设置tag和window间快速跳转 
  95. let g:easyWindows = 1 
  96. if exists('g:easyWindows'
  97.     " 向上 
  98.     map <C-J> <C-W>j<C-W>_  
  99.     " 向下 
  100.     map <C-K> <C-W>k<C-W>_ 
  101.     " 向右 
  102.     map <C-L> <C-W>l<C-W>_ 
  103.     " 向左 
  104.     map <C-H> <C-W>h<C-W>_ 
  105. endif 
  106.  
  107. " 处理折叠行的左右移动 
  108. noremap j gj 
  109. noremap k gk 
  110.  
  111. " 没sudo却想保存 
  112. cmap w!! w !sudo tee % >/dev/null 
  113.  
  114. " ,fc查找冲突的地方 
  115. map <leader>fc //v^[</|=>]{7}( .*/|$)<CR> 
  116.  
  117. " ,ff 查找光标后的单词位置,列出选择项 
  118. nmap <Leader>ff [I:let nr = input("Which one: ")<Bar>exe "normal " . nr ."[/t"<CR> 
  119.  
  120. " 屏幕左移和右移 
  121. map zl zL 
  122. map zh zH 
  123.  
  124. " 映射vsp这些开启新的buffer,默认目录为当前目录 
  125. cnoremap %% <C-R>=fnameescape(expand('%:h')).'/'<cr> 
  126. map <leader>ew :e %% 
  127. map <leader>es :sp %% 
  128. map <leader>ev :vsp %% 
  129. map <leader>et :tabe %% 
  130.  
  131. " 黏贴板 
  132. if has('clipboard'
  133.     if has('unnamedplus'
  134.         set clipboard=unnamedplus 
  135.     else 
  136.         set clipboard=unnamed 
  137.     endif 
  138. endif 
  139.  
  140. "字体的设置 
  141. set guifont=Consolas,Bitstream_Vera_Sans_Mono:h9:cANSI " 设置gui字体 
  142. set gfw=幼圆:h10:cGB2312 
  143.  
  144. " 语法高亮 
  145. syntax on 
  146.  
  147. " 导入vim插件管理文件 
  148. if filereadable(expand("~/.vimrc.bundles")) 
  149. source ~/.vimrc.bundles 
  150. endif 
  151.  
  152. " 缩进和md文件 
  153. filetype plugin indent on " 自动根据类型启动对应插件,缩进开启 
  154.  
  155. " 设置主题,UI 
  156. " solarized 主题 
  157. set background=dark 
  158. if filereadable(expand("~/.vim/bundle/vim-colors-solarized/colors/solarized.vim")) 
  159. let g:solarized_termcolors=256 
  160. let g:solarized_termtrans=1 
  161. let g:solarized_contrast="normal" 
  162. let g:solarized_visibility="normal" 
  163. color solarized             " Load a colorscheme 
  164. endif 
  165.  
  166. set cursorline " 选中行高亮 
  167. autocmd BufEnter *.py set cc=81 " 打开py文件81行高亮  
  168. " 之前的高亮线太难看,重新制定颜色,这里的black和iterm2颜色配置中的black一样 
  169. hi CursorLine   cterm=NONE ctermbg=black guibg=black  
  170. hi CursorColumn   cterm=NONE ctermbg=black guibg=black " 
  171. highlight ColorColumn ctermbg=black guibg=black 
  172. set number " 设置行号 
  173. hi LineNr ctermbg=black 
  174.  
  175. " Indent Guides 缩进列对齐线 
  176. let g:indent_guides_start_level = 2 
  177. let g:indent_guides_guide_size = 1 
  178. let g:indent_guides_enable_on_vim_startup = 1 
  179.  
  180. " airline 就是状态栏的箭头 
  181. let g:airline_theme="dark" 
  182. let g:airline_powerline_fonts = 1 
  183. let g:airline#extensions#tabline#enabled = 1 
  184. let g:airline#extensions#tabline#buffer_nr_show = 1 
  185.  
  186. " NerdTree配置 control+e打开当前文件目录树 
  187. map <C-e> :NERDTreeToggle<CR> 
  188. map <leader>ee :NERDTreeToggle<CR> 
  189. nmap <leader>nt :NERDTreeFind<CR> 
  190.  
  191. let NERDTreeShowBookmarks=1 
  192. let NERDTreeIgnore=['/.pyc''/~$''/.swo$''/.swp$''/.git''/.hg''/.svn''/.bzr'
  193. let NERDTreeChDirMode=0 
  194. let NERDTreeQuitOnOpen=1 
  195. let NERDTreeMouseMode=2 
  196. let NERDTreeShowHidden=1 
  197. let NERDTreeKeepTreeInNewTab=1 
  198. let g:nerdtree_tabs_open_on_gui_startup=0 
  199.  
  200. " syntastic 配置 
  201. " 设置每次w保存后语法检查 
  202. function! ToggleErrors() 
  203.     Errors 
  204. endfunction 
  205. let g:syntastic_check_on_open=1 
  206. let g:syntastic_always_populate_loc_list = 1 
  207. let g:syntastic_auto_loc_list = 1 
  208. let g:syntastic_check_on_wq = 0 
  209. let syntastic_loc_list_height = 5 
  210. let g:syntastic_html_tidy_ignore_errors=[" proprietary attribute /"ng-"] 
  211. autocmd WinEnter * if &buftype ==#'quickfix' && winnr('$') == 1 | quit |endif 
  212. autocmd WinLeave * lclose 
  213.  
  214. " 自动补全tab触发 
  215. function! InsertTabWrapper() 
  216. let col = col('.') - 1 
  217. if !col || getline('.')[col - 1] !~ '/k' 
  218.         return "/<tab>" 
  219. else 
  220.         return "/<c-p>" 
  221. endif 
  222. endfunction 
  223. inoremap <Tab> <c-r>=InsertTabWrapper()<cr> 
  224. inoremap <S-Tab> <c-n> 
  225.  
  226. " Ctrlp 和 Ctrlp-funky(,fu) 
  227. if isdirectory(expand("~/.vim/bundle/ctrlp.vim/")) 
  228.     let g:ctrlp_working_path_mode = 'ra' 
  229.     nnoremap <silent> <D-t> :CtrlP<CR> 
  230.     nnoremap <silent> <D-r> :CtrlPMRU<CR> 
  231.     let g:ctrlp_custom_ignore = { 
  232.                 / 'dir':  '/.git$/|/.hg$/|/.svn$'
  233.                 / 'file''/.exe$/|/.so$/|/.dll$/|/.pyc$' } 
  234.  
  235.     if executable('ag'
  236.         let s:ctrlp_fallback = 'ag %s --nocolor -l -g ""' 
  237.     elseif executable('ack-grep'
  238.         let s:ctrlp_fallback = 'ack-grep %s --nocolor -f' 
  239.     elseif executable('ack'
  240.         let s:ctrlp_fallback = 'ack %s --nocolor -f' 
  241.         " On Windows use "dir" as fallback command. 
  242.     else 
  243.         let s:ctrlp_fallback = 'find %s -type f' 
  244.     endif 
  245.     if exists("g:ctrlp_user_command"
  246.         unlet g:ctrlp_user_command 
  247.     endif 
  248.     let g:ctrlp_user_command = { 
  249.                 / 'types': { 
  250.                 / 1: ['.git''cd %s && git ls-files . --cached --exclude-standard --others'], 
  251.                 / 2: ['.hg''hg --cwd %s locate -I .'], 
  252.                 / }, 
  253.                 / 'fallback': s:ctrlp_fallback 
  254.                 / } 
  255.  
  256.     if isdirectory(expand("~/.vim/bundle/ctrlp-funky/")) 
  257.         " CtrlP extensions 
  258.         let g:ctrlp_extensions = ['funky'
  259.         "funky 
  260.         nnoremap <Leader>fu :CtrlPFunky<Cr> 
  261.     endif 
  262. endif 
  263.  
  264. " complete 
  265. autocmd Filetype * if &omnifunc == "" | setlocal omnifunc=syntaxcomplete#Complete | endif 
  266. autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS 
  267. autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags 
  268. autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS 
  269. autocmd FileType python setlocal omnifunc=pythoncomplete#Complete 
  270.  
  271. "进行版权声明的设置 
  272. "添加或更新头 
  273. map <F4> :call TitleDet()<cr>'s 
  274. autocmd BufNewFile *.py :call TitleDet() 
  275. function AddTitle() 
  276.     call append(0,"#! /usr/bin/env python"
  277.     call append(1,"# -*- coding: utf-8 -*-"
  278.     call append(2,"# vim:fenc=utf-8 "
  279.     call append(3,"#  Copyright © XYM"
  280.     call append(4,"# Last modified: ".strftime("%Y-%m-%d %H:%M:%S")) 
  281.     call append(5,""
  282. endf 
  283. "更新最近修改时间和文件名 
  284. function UpdateTitle() 
  285.     normal m' 
  286.     execute '/# *Last modified:/s@:.*$@/=strftime(":/t%Y-%m-%d %H:%M")@' 
  287.     normal '' 
  288.     normal mk 
  289.     execute '/# *Filename:/s@:.*$@/=":/t/t".expand("%:t")@' 
  290.     execute "noh" 
  291.     normal 'k 
  292. endfunction 
  293. "判断前10行代码里面,是否有Last modified这个单词, 
  294. "如果没有的话,代表没有添加过作者信息,需要新添加; 
  295. "如果有的话,那么只需要更新即可 
  296. function TitleDet() 
  297.     let n=1 
  298.     "默认为添加 
  299.     while n < 10 
  300.         let line = getline(n) 
  301.         if line =~ '^/#/s*/S*Last/smodified:/S*.*$' 
  302.             call UpdateTitle() 
  303.             return 
  304.         endif 
  305.         let n = n + 1 
  306.     endwhile 
  307.     call AddTitle() 
  308. endfunction 

vimrc.bundles文件,主要是vim相关插件

 

  1. " .vimrc.bundles 
  2.  
  3. if &compatible 
  4. set nocompatible 
  5. end 
  6.  
  7. filetype off 
  8. set rtp+=~/.vim/bundle/vundle 
  9. call vundle#rc() 
  10. Bundle "gmarik/vundle" 
  11. " 星级越多越推荐, 5星为必选,4星强烈推荐,3星比较推荐 
  12. " 文件模糊匹配查找 推荐:**** 
  13. Bundle "kien/ctrlp.vim" 
  14. " 函数模糊匹配查找(,fu) 推荐:**** 
  15. Bundle 'tacahiroy/ctrlp-funky' 
  16. " 文件索引树 推荐:***** 
  17. Bundle "scrooloose/nerdtree" 
  18. " 自动注释 推荐:***** 
  19. Bundle 'scrooloose/nerdcommenter' 
  20. " 语法检查 推荐:**** 
  21. Bundle "scrooloose/syntastic" 
  22. " 括号自动匹配 推荐:**** 
  23. Bundle 'jiangmiao/auto-pairs' 
  24. " 光标多行编辑 <C-n> <C-x> <C-p> 推荐:**** 
  25. Bundle 'terryma/vim-multiple-cursors' 
  26. " 配色主题 推荐:**** 
  27. Bundle "altercation/vim-colors-solarized" 
  28. " 缩进引导线 推荐:**** 
  29. Bundle "nathanaelkane/vim-indent-guides" 
  30. " 状态栏效果 推荐:*** 
  31. Bundle "bling/vim-airline" 
  32.  
  33. " python 推荐:**** 
  34. Bundle 'yssource/python.vim' 
  35. Bundle 'python_match.vim' 
  36. Bundle 'pythoncomplete' 
  37.  
  38. " js 推荐:**** 
  39. Bundle 'elzr/vim-json' 
  40. Bundle 'groenewege/vim-less' 
  41. Bundle 'pangloss/vim-javascript' 
  42. Bundle 'briancollins/vim-jst' 
  43. Bundle 'kchmck/vim-coffee-script' 
  44.  
  45. " html 推荐:**** 
  46. Bundle 'amirh/HTML-AutoCloseTag' 
  47. Bundle 'hail2u/vim-css3-syntax' 
  48. Bundle 'gorodinskiy/vim-coloresque' 
  49. Bundle 'tpope/vim-haml' 
  50. Bundle 'mattn/emmet-vim' 
  51.  
  52. if filereadable(expand("~/.vimrc.bundles.local")) 
  53. source ~/.vimrc.bundles.local 
  54. endif 
  55. filetype on 

总结

一个好的程序员必须善用各种工具提升自己的开发效率,和提升自己的幸福指数。另外,个人觉得vim还是值得自己重新一配的,我的配置过程基本都是在 读spf13的配置,读懂,然后选取,可是中间还是出了很多问题,比如因为我没有用pymode插件,所以在用括syntastic的 local_list在退出或者分屏时的位置,都令我很蛋疼。而且在读spf13配置时,会发现有很多很好的功能都没有用上,比如paste模式,查找冲 突快捷键,屏幕移动,还有ctrlp-funky,vim-multiple-cursors这些很爽的插件。大家有好的配置可以推荐给我。

责任编辑:王雪燕 来源: XYM
相关推荐

2015-10-15 09:37:50

桌面环境发行版Linux

2011-05-07 12:56:39

数据访问

2020-12-14 08:09:03

弱口令工具扫描

2013-09-17 12:26:43

BYOD环境安全BYOD移动设备

2011-05-05 14:33:34

数据访问层

2012-06-26 13:17:49

PowerSmart视频编码

2015-09-01 09:49:28

2011-05-10 16:44:43

数据访问层

2016-03-02 10:27:16

Python定制化Eclipse IDE

2011-09-16 16:22:45

Android应用DXHome

2021-01-18 05:30:22

串口通信Qt

2009-03-16 16:30:18

2010-03-17 16:06:15

Linux 常用应用软

2009-06-22 13:44:38

Porlet运维管理摩卡软件

2010-03-17 16:19:28

Linux 常用应用软

2011-05-25 18:23:52

2016-12-05 09:50:17

2011-08-31 13:45:38

Demon CamipadiPhone

2020-05-20 13:53:41

HTTP环境安装

2019-11-18 14:00:40

开发工具环境搭建vagrant
点赞
收藏

51CTO技术栈公众号