首页 » PHP教程 » gnuemacsphp技巧_轨范员小助手 Emacs最强编辑器没有之一

gnuemacsphp技巧_轨范员小助手 Emacs最强编辑器没有之一

访客 2024-12-10 0

扫一扫用手机浏览

文章目录 [+]

内容简介

1、Emacs简介

gnuemacsphp技巧_轨范员小助手 Emacs最强编辑器没有之一

2、Emacs三个平台的安装与配置

gnuemacsphp技巧_轨范员小助手 Emacs最强编辑器没有之一
(图片来自网络侵删)

3、自动补全插件

4、

5、常用快捷办法

6、和版本掌握系统的合营(以SVN为例)

【程序员小助手】系列

在这个系列文章中(不定期更新),

Emacs,最强编辑器,没有之一

比如,Vim编辑器的粉丝可能就会来“踢馆”,VS或Eclipse的粉丝也兴许会“群起而攻”,但是

对付很多人来说,利用Vim和Emacs,不仅是提升“逼格”的办法,更是上升到“崇奉”的层面,夸年夜吧。
当然这和宗教崇奉不一样,只是一种可爱的“偏执”而已。

Emacs实在能做很多事,不要认为它就只是一个文本编辑器,它可以说是一个整合环境,或可称它为“集成开拓环境”,它还可以做以下事情:

上网,浏览网页

看视频

收发邮件

调试程序,结合GDB,EDebug等。
支持C/C++,Perl,Python,Lisp等等

玩游戏

打算器

记日记

管理日程,Task,ToDo,约会等

个人信息管理

目录管理

文件比较

阅读info和man文档

等等

一开始我不知道为什么Emacs如此幽美又强大,直到后来阅读了《黑客与画家》这部经典著作(硅谷创业教父 Paul Graham 保罗•格雷厄姆所写,实在也便是他的一些日志汇编而成),里面讲述了Lisp措辞的强大和幽美,而Emacs便是用Lisp措辞编写的,怪不得。

闲扯一下为什么Lisp措辞如此强大,虽然这门措辞很老了,在2015年6月的TIOBE编程措辞排行榜也只有第31位,但是:

摘录自 阮一峰 翻译的《黑客与画家》一书,推举大家一读:

如果我们把盛行的编程措辞,以这样的顺序排列:Java、Perl、Python、Ruby。
你会创造,排在越后面的措辞,越像Lisp。
Python模拟Lisp,乃至把许多Lisp黑客认为属于设计缺点的功能,也一起模拟了。
至于Ruby,如果回到1975年,你声称它是一种Lisp方言,没有人会反对。

编程措辞现在的发展,不过刚刚遇上1958年Lisp措辞的水平。

1958年,John McCarthy设计了Lisp措辞。
我认为,当前最新潮的编程措辞,只是实现了他在1958年的设想而已。
这怎么可能呢?打算机技能的发展,不这天月牙异吗?

1958年的技能,怎么可能超过本日的水平呢? 让我见告你缘故原由。
这是由于John McCarthy本来没打算把Lisp设计成编程措辞,至少不是我们现在意义上的编程措辞。
他的原意只是想做一种理论演算,用更简洁的办法定义图灵机。
以是,为什么上个世纪50年代的编程措辞,到现在还没有过期?大略说,由于这种措辞实质上不是一种技能,而是数学。
数学是不会过期的。

你不应该把Lisp措辞与50年代的硬件联系在一起,而是该当把它与快速排序(Quicksort)算法进行类比。
这种算法是1960年提出的,至今仍旧是最快的通用排序方法。

直到本日,最高级的主流措辞,也只是刚刚靠近Lisp的水平。
虽然已经很靠近了,但还是没有Lisp那样强大。

Lisp措辞出身的时候,就包含了9种新思想。
个中一些我们本日已经习以为常,另一些则刚刚在其他高等措辞中涌现,至今还有2种是Lisp独占的。

怎么样,是不是很有兴趣理解一下如此强大的Lisp措辞开拓出来的Emacs是如何幽美呢?

当然此文不可能带大家领略所有Emacs的幽美之处。
说实话,Emacs肯定存在不敷之处:

更多Emacs的好处只有大家利用了才能逐步领略。

Emacs简介

Emacs是一种强大的文本编辑器,在程序员和其他以技能事情为主的打算机用户中广受欢迎。

EMACS,即Editor MACroS(编辑器宏)的缩写,最初由Richard Stallman(理查德·马修·斯托曼)于1975年在MIT协同Guy Steele共同完成。

(Richard Stallman可是开源运动之父啊,这位可爱的长胡子大叔抵制Apple,抵制Facebook,抵制Amazon,抵制不少公司和机构。
他也是自由软件基金会(Free Software Foundation,简称FSF)的主席,而自由软件基金会主导了包括GNU在内的很多开源工程。
GNU工程使得天下各地的程序员可以为Linux操作系统开拓周边软件等,才有了Linux的本日。
不然Linus Tovarlds(Linux之父)基本上光是写了一个Linux内核,哪够啊。
以是本日的Linux最精确的称谓该当是GNU/Linux )

自出身以来,Emacs蜕变出了浩瀚分支,个中利用最广泛的两种分别是:1984年由Richard Stallman发起并由他掩护至今的GNU Emacs,以及1991年发起的XEmacs。
XEmacs是GNU Emacs的分支,至今仍保持着相称的兼容性。
它们都利用了Emacs Lisp这种有着极强扩展性的编程措辞,从而实现了包括编程、编译乃至网络浏览等等功能的扩展。

你可以利用Lisp措辞改写Emacs的功能组件,而且可以变动配置,完备自定义Emacs,所有Emacs是充满无限可能的编辑器。

国际化

Emacs支持对多种笔墨的文本编辑,包括UTF-8在内的诸多编码系统,加上对多种字符集、文稿、书写系统,以及不同文化的书写习气都供应了支持,使得天下上大多数措辞的利用者都能通过Emacs进行文本处理。
Emacs还能通过调用诸如ispell这样的外部程序,实现多种措辞的拼写检讨。

跨平台性

Emacs是目前天下上最具可移植性的主要软件之一,能够在当前大多数操作系统上运行,包括类Unix系统(GNU/Linux、各种BSD、Solaris、AIX、IRIX、Mac OS X等等)、MS-DOS、Microsoft Windows以及OpenVMS等,还有移动Android平台以及iOS。

缓冲区的观点

初学Emacs须要理解什么是缓冲区:

Emacs里的统统操作都发生在编辑缓冲区(buffer)里,它常日是某个文件的事情副本。
如果你正在编辑的编辑缓冲区里包含着某个文件的一个副本,那么当你保存自己所做的改动时,Emacs把编辑缓冲区的内容复制到文件中。
除了事情在文件副本上的缓冲区外,还有一些做临时事情的缓冲区,它就像一张草稿纸,当然也可以随时利用write-file命令(\"大众C-x C-w\公众)或save-buffer命令(“C-x C-s”)保存这类临时事情缓冲区的内容。

可以参考一些高手的Emacs教程和“练级”系列:

http://www.cnblogs.com/robertzml/archive/2009/09/10/1564108.html

http://blog.csdn.net/redguardtoo/article/details/7222501/

http://blog.sina.com.cn/s/blog_6df127760101ll7a.html

http://arch.pconline.com.cn//pcedu/soft/gj/photo/0609/865628_1.html

Emacs的官网:

http://www.gnu.org/software/emacs/

Emacs的中文WiKi:

http://www.emacswiki.org/emacs?interface=zh-cn

轻松一下,关于Emacs的一则玩笑

《Emacs 的日子是这个样子的》

1. 听说有 Emacs 这个东西。
试了一下,觉得就像记事本一样。
没什么学习曲线。
便是……咋也找不到退出的办法……

2. 开始会一些 Emacs 了,开始学习各种 mode,按键绑定,配置方法,开始熟习 Emacs……

3. 比较熟习 Emacs了,基本利用 Emacs干活,每天“活在” Emacs 里面……

4. 非常熟习自己“常用”的 Emacs,可以教别人 Emacs,大量泡 Emacs社区,大量下载、利用和跟踪别人的扩展,已经离不了 Emacs……

5. 逐渐不满 Emacs,逐渐熟习 Lisp 措辞,开始改写“自己”的Emacs,在这期间,又开始四处碰钉子,事情效率总是被一个失落败的修正所影响……

6. 常常修正 Emacs,自己手中的 Emacs基本上每周都和上一周有那么一点不太一样…… 便是,改的太多了,常常在某天整理代码的时候溘然创造……原来还有这么个易用的功能…… 忘却好久了……

7. …… ……

Emacs三个平台的安装与配置

1. Windows下安装Emacs

请到以下链接下载Windows版的Emacs:

https://ftp.gnu.org/gnu/emacs/windows/

请大家下载列表中最新版本的zip文件,比如目前最新版的是2015年5月1日发布的24.5版:

emacs-24.5-bin-i686-mingw32.zip

下载后,用Winrar或7-zip解压,会出来一个文件夹 emacs-24.5-bin-i686-mingw32

内含四个子文件夹:

bin

libexec

share

var

打开bin文件夹,运行个中的 emacs.exe 文件即可开启Emacs,不须要安装:

你可以把emacs.exe这个文件锁定到任务栏,就很方便了,按一下图标就启动了。

2. Linux下安装Emacs

Debian一族(包括Ubuntu)下安装Emacs:

sudo apt-get install emacs

Redhat一族(包括Fedora)下安装Emacs:

sudo yum install emacs

其他的可以搜索如何安装,或者下载Emacs的源代码来编译安装。

下面演示Linux如何下载Emacs的代码来编译安装(逼格最高的办法):

首先去

ftp://ftp.gnu.org/pub/gnu/emacs

上面有Emacs的险些所有版本的源代码包,下载最新版的(用老版的也可以),如: emacs-24.5.tar.gz

解压 emacs-24.5.tar.gz 并编译,安装,在终端(Terminal)中依次运行以下命令(如果是其他版本,则将如下命令中的24.5更换为相应版本即可):

tar -zxvf emacs-24.5.tar.gz (解压文件)

cd emacs-24.5 (进入目录)

./configure (配置)

make (编译)

sudo make install (安装,会提示你输入管理员密码)

安装完之后要启动Emacs很大略,开一个终端(Terminal),输入emacs,回车,就可以了。
不过

打开Fedora的“设置” (肯定知道设置在哪里吧)

选择“键盘”

选择列表中的“自定义快捷办法”,然后点击加号“+”,用于添加新的快捷办法

选择快捷办法的按键,

按F2键试试,是不是就启动Emacs啦?这酸爽不言而喻!

3. Mac OS下安装Emacs

Mac下安装Emacs,网上有不少文章,有用Git弄下来Emacs的源码然后编译安装的; 也有用一些包管理软件来安装的,但是

http://emacsformacosx.com/

上这个网,然后下载那个dmg包,Mac用户肯定懂的,便是Mac下安装软件的最常用办法。
然后就没有然后了... 如果这样你都不会装Emacs,那至心没必要用Emacs了...

自动补全插件

安装完Emacs之后,还须要安装一个自动补全(可以自动补全关键字,文本等)的扩展,非常强大,名叫company-mode,官网:

http://company-mode.github.io/

幸好,这个扩展并不须要我们按照传统的办法从官网下载、安装到Emacs里面,由于Emacs里有个安装扩展的列表,有点类似 Debian系列的 apt-get 和 Redhat系列的yum 这样的包管理工具,以是我们只须要按步骤安装:

按下 M-x 来调出命令输入

输入 list-packages,回车

在涌现的列表里,点击 company

在右边涌现的新缓冲区里点击 Install(英文: 安装)

点击 Yes

用此方法(list-packages命令)也可以安装很多其他的Emacs的插件(扩展),大家也看到列表里有很多插件了吧,以是说Emacs都有点像一个小型的操作系统。

请点击“阅读原文”来下载

当然大家可以从网高下载一些大牛的Emacs配置文件,看一下他们的Emacs快捷键(除了基本的一些通用快捷键以外,用户可以自定义很多快捷键,可以定义在 .emacs 文件中)。

如果你“不幸”选择利用

请用

把压缩文件里的其他三个模块文件放置到 .emacs.d 这个文件夹下的modules文件夹 (.emacs.d 文件夹是安装完Emacs就会有的,也在家目录里,不过modules文件夹须要你自己创建):

cd ~/.emacs.d/

mkdir modules

cp php-mode.el psvn.el saved-places modules/ (或者手动直接把三个模块文件复制到modules文件夹里)

常用快捷办法

Emacs的快捷键都是绑定于Ctrl和Alt(或称Meta, 在Mac下便是Cmd键)上的,例如C-x便是Ctrl+x,M-x便是Alt+x (在Mac下便是Cmd键)。
当然所有的按键都可以自定义。

以是下面我在讲述快捷键的组合表示办法时:

C 代表Ctrl键

M 代表Alt键或者在苹果的Mac系统下是Cmd键

C-x C-c 代表着,先按C-x,再按C-c

C-x k 代表着,先按C-x,松开手,再按k

M-s : 新建一个buffer(缓冲区)

C-x O : 把稳是大写的O,不是零,以是须要按住shift键再按o键。
用于在缓冲区之间切换

C-g : 取消当前操作

C-x u : 回到上一步,相称于Undo

C-x C-3 : 把缓冲区(buffer)分为旁边两个,新的一个缓冲区是复制当前的缓冲区 (可以实行多次,来分割出很多小窗口)

C-x C-2 : 把缓冲区(buffer)分为高下两个,新的一个缓冲区是复制当前的缓冲区 (可以实行多次,来分割出很多小窗口)

M-w : 选中笔墨的情形是复制笔墨,而如果没有选中笔墨则是复制当前的一行

C-w : 选中笔墨的情形是剪切笔墨,而如果没有选中笔墨则是剪切当前的一行

M-x : 调出命令输入,可以在后面接命令,比如man,svn-status,等

C-y : 黏贴

C-x C-s : 保存文本

C-x C-f : 打开文件,如果文件不存在,则新建文件

C-x C-v : 打开一个文件,取代当前缓冲区

C-x k : 关闭当前缓冲区(buffer)

C-s : 向前搜索

C-r : 向后搜索

C-x h : 全选

C-v : 向下翻页

M-v : 向上翻页

C-f : 提高一个字符

C-b : 退却撤退一个字符

M-f : 提高一个单词

M-b : 退却撤退一个单词

C-@ : 标记开始区域

C-a : 移到行首

C-e : 移到行尾

M-a : 移到句首

M-e : 移到句尾

M-< : 缓冲区头部

M-> : 缓冲区尾部

M-g M-g,再输入数字 : 跳转到文本的第几行

C-x 0 : 关闭当前缓冲区

C-x C-c : 退出Emacs

暂时只能记起来这么多啦,还有很多快捷键就要你自己去发掘啦!

把稳: 千万不要去世记这些快捷键组合,随着你利用Emacs,很快就能记住的,相信我!

还有一个平时常用的功能便是查询函数,可以方便查询已定义的函数:

按下 M-x 来调出命令输入

输入 man ,也便是Linux或Unix系统的man命令,是manuall的缩写,也便是\"大众手册\"大众的意思

然后输入你要查询的函数名,回车

就出来啦,比如

给出

;;

;; ADDITIONAL REPOSITORY FOR MODULES TO LOAD

;;

(add-to-list 'load-path \"大众~/.emacs.d/modules\公众)

;;

;; ADDITIONNALS MODULES

;;

;;(require 'dsvn)

(require 'psvn)

(require 'php-mode)

(require 'saveplace)

;;(require 'unxls)

;; display the path to the file in the sidebar.

;;(require 'uniquify)

;;

;; KEYBOARD SHORTCUT

;;

(global-set-key [f9] 'compile)

(global-set-key [(control z)] 'undo)

;; We could use 'dabbrev-completion or 'dabbrev-expand

(global-set-key [(control return)] 'dabbrev-completion)

;;(global-set-key \"大众\C-)\公众 'dabbrev-completion)

;;(global-set-key \公众\C-=\"大众 'dabbrev-expand)

(global-set-key \"大众\C-n\"大众 'imenu)

(defun try-to-add-imenu ()

(condition-case nil (imenu-add-to-menubar \公众imenu\"大众) (error nil)))

(add-hook 'font-lock-mode-hook 'try-to-add-imenu)

;; Company mode in all buffers

(add-hook 'after-init-hook 'global-company-mode)

(global-set-key \"大众\M-s\"大众 'new-shell)

(global-set-key (kbd \公众C-x t\公众) 'todo-show)

;;

;; Copy or Cut one line if no content selected

;;

;; copy region or whole line

(global-set-key \公众\M-w\"大众

(lambda ()

(interactive)

(if mark-active

(kill-ring-save (region-beginning)

(region-end))

(progn

(kill-ring-save (line-beginning-position)

(line-end-position))

(message \公众copied line\"大众)))))

;; kill region or whole line

(global-set-key \公众\C-w\公众

(lambda ()

(interactive)

(if mark-active

(kill-region (region-beginning)

(region-end))

(progn

(kill-region (line-beginning-position)

(line-end-position))

(message \公众killed line\"大众)))))

;;

;; FUNCTION DEFINITION

;;

(defun new-shell ()

(interactive)

(let (

(currentbuf (get-buffer-window (current-buffer)))

(newbuf (generate-new-buffer-name \"大众shell\"大众))

)

(generate-new-buffer newbuf)

(set-window-dedicated-p currentbuf nil)

(set-window-buffer currentbuf newbuf)

(shell newbuf)

)

)

;;

;; resolving compilation problems. This force the environment variables

;; to be set before compiling.

;;

(let ((path (shell-command-to-string \公众. ~/.bashrc; echo -n $PATH\"大众)))

(setenv \"大众PATH\"大众 path)

(setq exec-path

(append

(split-string-and-unquote path \公众:\"大众)

exec-path)))

;;

;; Ugly code for READING XLS (but works)

;; Requires: xlhtml & w3m

;;

(add-to-list 'auto-mode-alist '(\公众\\.xls\\'\"大众 . no-xls))

(defun no-xls (&optional filename)

\"大众Run xlhtml and w3m -dump on the entire buffer.

Optional FILENAME says what filename to use.

This is only necessary for buffers without

proper `buffer-file-name'. FILENAME should

be a real filename, not a path.\"大众

(interactive \"大众fExcel File: \"大众)

(when (and filename

(not (buffer-file-name)))

(write-file (make-temp-file filename)))

(erase-buffer)

(shell-command

(format \"大众xlhtml -nc -te %s | w3m -dump -T text/html\"大众 (buffer-file-name))

(current-buffer))

(setq buffer-file-name nil)

(set-buffer-modified-p nil))

;;

;; START

;;

(custom-set-variables

;; custom-set-variables was added by Custom.

;; If you edit it by hand, you could mess it up, so be careful.

;; Your init file should contain only one such instance.

;; If there is more than one, they won't work right.

'(c-block-comment-prefix \"大众//\公众)

'(case-fold-search nil)

'(column-number-mode t)

'(comint-completion-autolist t)

'(comint-completion-recexact t)

'(compilation-always-kill t)

'(compilation-auto-jump-to-first-error nil)

'(compilation-environment PATH=/home/griffon/trunk/indus/bin:/home/fox/components/gnutools/ecos-3\.0/arm-eabi/bin:/home/fox/components/ecos-3\.0/tools/bin:/home/avrdev/bin:/home/thomas/mes_fonctions:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin)

'(compilation-scroll-output (quote first-error))

'(compile-command \"大众./makemake 5010 clean && ./makemake 5010 all -j 8 && ./makemake 5010 program\"大众)

'(completion-show-help t)

'(dabbrev-case-distinction t)

'(dabbrev-case-replace t)

'(doc-view-continuous t)

'(doc-view-image-width 850)

'(doc-view-resolution 200)

'(dynamic-completion-mode t)

'(grep-command \"大众grep --exclude-dir=.svn --exclude=\\TAGS --exclude=\\.{lst,lss,sym,list,o,elf,xml,json,sta,map,deps,d,sx,hex,doc,txt,pdf,tex} -inHr \\"大众\公众)

'(gud-gdb-command-name \"大众arm-eabi-gdb -i=mi main.elf\公众)

'(initial-scratch-message \公众;; This buffer is for notes you don't want to save, and for Lisp evaluation.

;; If you want to create a file, visit that file with C-x C-f,

;; then enter the text in that file's own buffer.

;; M-s: Open a new shell

\公众)

'(safe-local-variable-values (quote ((todo-categories \"大众Todo\"大众) (todo-categories \"大众barracuda\"大众 \"大众alligator\"大众 \"大众Todo\公众) (todo-categories \"大众alligator\公众 \公众Todo\"大众))))

'(send-mail-function (quote mailclient-send-it))

'(svn-status-hide-unknown t)

'(svn-status-hide-unmodified t))

;;

;; EDITING/IDE

;;

(global-font-lock-mode 1)

(setq auto-mode-alist

(append '((\"大众\.php$\"大众 . php-mode)

(\公众\.module$\"大众 . php-mode))

auto-mode-alist))

;; saving position in files opened with emacsclient

;;(setq server-visit-hook (quote (save-place-find-file-hook)))

(setq-default save-place t)

(setq save-place-file \"大众~/.emacs.d/saved-places\公众)

;; Code completion case-insensitive, seems not working

;;(setq pcomplete-ignore-case t)

;;(setq case-fold-search t)

;;(setq read-buffer-completion-ignore-case t)

;;(setq read-file-name-completion-ignore-case t)

;; display the path to the buffer file using uniquify (required).

;;(setq uniquify-buffer-name-style 'reverse)

;; SHOW FILE PATH IN FRAME TITLE

;;(setq-default frame-title-format \"大众%b (%f)\"大众)

;; Affiche le numéro de ligne et de colonne

(column-number-mode t)

(line-number-mode t)

;;

;; FORMATAGE

;;

;; Suppression des espaces en fin de ligne a l'enregistrement

(add-hook 'c++-mode-hook '(lambda ()

(add-hook 'write-contents-hooks 'delete-trailing-whitespace nil t)))

(add-hook 'c-mode-hook '(lambda ()

(add-hook 'write-contents-hooks 'delete-trailing-whitespace nil t)))

;;(defun set-newline-and-indent ()

;; (local-set-key (kbd \"大众RET\"大众) 'newline-and-indent))

;;(add-hook 'lisp-mode-hook 'set-newline-and-indent)

;;

;; COLORS

;;

(custom-set-faces

;; custom-set-faces was added by Custom.

;; If you edit it by hand, you could mess it up, so be careful.

;; Your init file should contain only one such instance.

;; If there is more than one, they won't work right.

'(default ((t (:inherit nil :stipple nil :background \"大众white\"大众 :foreground \公众black\公众 :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight normal :height 135 :width normal :foundry \"大众unknown\公众 :family \公众DejaVu Sans Mono\"大众))))

'(compilation-warning ((t (:inherit warning))))

'(font-lock-comment-face ((t (:foreground \"大众darkorange4\"大众))))

'(font-lock-function-name-face ((t (:foreground \公众navy\"大众))))

'(font-lock-keyword-face ((t (:foreground \"大众red4\"大众))))

'(font-lock-type-face ((t (:foreground \公众black\公众))))

'(linum ((t (:inherit shadow :background \"大众gray95\"大众))))

'(mode-line ((t (nil nil nil nil :background \"大众grey90\"大众 (:line-width -1 :color nil :style released-button) \"大众black\公众 :box nil :width condensed :foundry \"大众unknown\公众 :family \公众DejaVu Sans Mono\"大众))))

'(svn-status-directory-face ((t (:foreground \"大众tomato\"大众)))))

;; sort of fullscreen

(add-to-list 'default-frame-alist '(left . 0))

(add-to-list 'default-frame-alist '(top . 0))

(add-to-list 'default-frame-alist '(height . 100))

(add-to-list 'default-frame-alist '(width . 200))

和版本掌握系统的合营(以SVN为例)

由于有导入Emacs的SVN模块(psvn.el),以是如果你利用了

然后,选中你要提交的文件,按 m 键,你可以一次选中好几个,取消选中按 u 键。

按 c 键开始编辑提交注释(Comment),如下图(绿色的是已经选中(按 m 键)要提交的文件):

我这里输入了“修正了帮助文档”这一句注释,完成之后,按两次 “C-c”,就提交(commit)好了,非常快捷。

不知道SVN是什么的读者,可以百度一下,SVN是一个常用的版本掌握软件。
其他的更前辈的版本掌握系统有Git, Mercurial等。
目前所在公司不大,以是用SVN(集中式版本掌握系统)也方便,之前在其他公司用过Git和Mercurial(这两个是分布式版本掌握系统)。

考试测验一下Emacs吧,真的是“神器”!

谁用谁知道,用过都说好~

点击下方链接查看 “Emacs配置文件和三个模块的压缩文件 (

http://pan.baidu.com/s/1bn74FhH

您若以为本文不错,请点击“分享”

新朋友请关注「程序员同盟」微信搜"大众年夜众号 ProgrammerLeague

小编邮箱: enmingx@gmail.com

标签:

相关文章