AngularJs 父子级Controller传递数据

html代码

<div ng-controller="MyAccountCtrl">

   <div ng-controller="TransferCtrl">
           .............

   </div>

</div>

js代码

// 子级传递数据给父级
// 子级传递
$scope.checkLoggedIn = function(type) {
          $scope.transferType = type;
          $scope.$emit('transfer.type', type);
}

// 父级接收
$scope.$on('transfer.type', function(event, data) {
          $scope.transferType = data;
        });
        $scope.checkLoggedIn = function() {
          var type = $scope.transferType;
}
// 父级传递数据给子级
// 父级传递
$scope.transferType = '';
$scope.checkLoggedIn = function(type) {
          $scope.transferType = type;
          $scope.$broadcast('transfer.type', type);
}

// 子级接收
$scope.transferType = '';
$scope.$on('transfer.type', function(event, data) {
          $scope.transferType = data;
        });
        $scope.checkLoggedIn = function() {
          var type = $scope.transferType;
}

mac自动启动服务

homebrew.mxcl.authenmng.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>homebrew.mxcl.authenmng</string>
	<key>ProgramArguments</key>
    <array>
      <string>/Library/StartupItems/iNodeAuthService/iNodeAuthService</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
  </dict>
</plist>
sudo chown root:wheel /Library/LaunchDaemons/homebrew.mxcl.authenmng.plist

php生成随机字符串

//生成随机数,用于生成salt
function random_str($length){
//生成一个包含 大写英文字母, 小写英文字母, 数字 的数组
$arr = array_merge(range(0, 9), range(‘a’, ‘z’), range(‘A’, ‘Z’));
$str = ”;
$arr_len = count($arr);
for ($i = 0; $i < $length; $i++){
$rand = mt_rand(0, $arr_len-1);
$str.=$arr[$rand];
}
return $str;
}

thinkphp3.2.1验证码2次验证

$verify = new \Think\Verify();
global $seKey;
$seKey = $verify->seKey;
function authcode($str){
$key = substr(md5($GLOBALS['seKey']), 5, 8);
$str = substr(md5($str), 8, 10);
return md5($key . $str);
}
function check($code, $id = '') {
$key = authcode($GLOBALS['seKey']).$id;
// 验证码不能为空
$secode = session($key);
if(empty($code) || empty($secode)) {
return false;
}
if(authcode(strtoupper($code)) == $secode['verify_code']) {
return true;
}
return false;
}
if (check(I('verify'))) {
$this->success('验证码正确', $_SERVER['HTTP_REFERER']);
} else {
$this->error('验证码错误', $_SERVER['HTTP_REFERER']);
}

php字符串加密解密

//加密解密
// $string: 明文 或 密文
// $operation:DECODE表示解密,其它表示加密
// $key: 密匙
// $expiry:密文有效期
function encrypt($string, $operation = 'DECODE', $key = '', $expiry = 0) {
// 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
$ckey_length = 4;

// 密匙
$key = md5($key ? $key : '5Gja4ESmXFzCN4HSExjpc9x4FVXljBSd');

// 密匙a会参与加解密
$keya = md5(substr($key, 0, 16));
// 密匙b会用来做数据完整性验证
$keyb = md5(substr($key, 16, 16));
// 密匙c用于变化生成的密文
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
// 参与运算的密匙
$cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
// 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性
// 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
$string_length = strlen($string);
$result = '';
$box = range(0, 255);
$rndkey = array();
// 产生密匙簿
for($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
// 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
for($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
// 核心加解密部分
for($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
// 从密匙簿得出密匙进行异或,再转成字符
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
if($operation == 'DECODE') {
// substr($result, 0, 10) == 0 验证数据有效性
// substr($result, 0, 10) - time() > 0 验证数据有效性
// substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 验证数据完整性
// 验证数据有效性,请看未加密明文的格式
if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
return substr($result, 26);
} else {
return false;
}
} else {
// 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
// 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
return $keyc.str_replace('=', '', base64_encode($result));
}

jQuery Validate验证框架详解

jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 

默认校验规则

(1)、required:true 必输字段
(2)、remote:"remote-valid.jsp" 使用ajax方法调用remote-valid.jsp验证输入值
(3)、email:true 必须输入正确格式的电子邮件
(4)、url:true 必须输入正确格式的网址
(5)、date:true 必须输入正确格式的日期,日期校验ie6出错,慎用
(6)、dateISO:true 必须输入正确格式的日期(ISO),例如:2009-06-23,1998/01/22 只验证格式,不验证有效性
(7)、number:true 必须输入合法的数字(负数,小数)
(8)、digits:true 必须输入整数
(9)、creditcard:true 必须输入合法的信用卡号
(10)、equalTo:"#password" 输入值必须和#password相同
(11)、accept: 输入拥有合法后缀名的字符串(上传文件的后缀)
(12)、maxlength:5 输入长度最多是5的字符串(汉字算一个字符)
(13)、minlength:10 输入长度最小是10的字符串(汉字算一个字符)
(14)、rangelength:[5,10] 输入长度必须介于 5 和 10 之间的字符串")(汉字算一个字符)
(15)、range:[5,10] 输入值必须介于 5 和 10 之间
(16)、max:5 输入值不能大于5
(17)、min:10 输入值不能小于10

默认的提示

messages: {
required: "This field is required.",
remote: "Please fix this field.",
email: "Please enter a valid email address.",
url: "Please enter a valid URL.",
date: "Please enter a valid date.",
dateISO: "Please enter a valid date (ISO).",
dateDE: "Bitte geben Sie ein g眉ltiges Datum ein.",
number: "Please enter a valid number.",
numberDE: "Bitte geben Sie eine Nummer ein.",
digits: "Please enter only digits",
creditcard: "Please enter a valid credit card number.",
equalTo: "Please enter the same value again.",
accept: "Please enter a value with a valid extension.",
maxlength: $.validator.format("Please enter no more than {0} characters."),
minlength: $.validator.format("Please enter at least {0} characters."),
rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."),
range: $.validator.format("Please enter a value between {0} and {1}."),
max: $.validator.format("Please enter a value less than or equal to {0}."),
min: $.validator.format("Please enter a value greater than or equal to {0}.")
},
//如需修改
$.extend($.validator.messages, {
required: "必选字段",
remote: "请修正该字段",
email: "请输入正确格式的电子邮件",
url: "请输入合法的网址",
date: "请输入合法的日期",
dateISO: "请输入合法的日期 (ISO).",
number: "请输入合法的数字",
digits: "只能输入整数",
creditcard: "请输入合法的信用卡号",
equalTo: "请再次输入相同的值",
accept: "请输入拥有合法后缀名的字符串",
maxlength: $.validator.format("请输入一个长度最多是 {0} 的字符串"),
minlength: $.validator.format("请输入一个长度最少是 {0} 的字符串"),
rangelength: $.validator.format("请输入一个长度介于 {0} 和 {1} 之间的字符串"),
range: $.validator.format("请输入一个介于 {0} 和 {1} 之间的值"),
max: $.validator.format("请输入一个最大为 {0} 的值"),
min: $.validator.format("请输入一个最小为 {0} 的值")
});
//推荐做法,将此文件放入messages_cn.js中,在页面中引入

使用方式 

1、metadata用法,将校验规则写到控件中

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>jQuery Validate验证框架详解-metadata用法</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<script type="text/javascript" src="/validate/jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="/validate/jquery.validate.min.js"></script>
<script type="text/javascript" src="/validate/jquery.metadata.min.js"></script>
<script type="text/javascript" src="/validate/messages_zh.js"></script>
<script type="text/javascript">
$(function(){
$("#myform").validate();
});
</script>
</head>

<body>
<form id="myform" method="post" action="">
<p>
<label for="myname">用户名:</label>
<!-- id和name最好同时写上 -->
<input id="myname" name="myname" class="required" />
</p>
<p>
<label for="email">E-Mail:</label>
<input id="email" name="email" class="required email" />
</p>
<p>
<label for="password">登陆密码:</label>
<input id="password" name="password" type="password"
class="{required:true,minlength:5}" />
</p>
<p>
<label for="confirm_password">确认密码:</label>
<input id="confirm_password" name="confirm_password" type="password"
class="{required:true,minlength:5,equalTo:'#password'}" />
</p>
<p>
<label for="confirm_password">性别:</label>
<!-- 表示必须选中一个 -->
<input type="radio" id="gender_male" value="m" name="gender" class="{required:true}" />
<input type="radio" id="gender_female" value="f" name="gender"/>
</p>
<p>
<label for="confirm_password">爱好:</label>
<!-- checkbox的minlength表示必须选中的最小个数,maxlength表示最大的选中个数,rangelength:[2,3]表示选中个数区间 -->
<input type="checkbox" id="spam_email" value="email" name="spam[]" class="{required:true, minlength:2}" />
<input type="checkbox" id="spam_phone" value="phone" name="spam[]" />
<input type="checkbox" id="spam_mail" value="mail" name="spam[]" />
</p>
<p>
<label for="confirm_password">城市:</label>
<select id="jungle" name="jungle" title="Please select something!" class="{required:true}">
<option value=""></option>
<option value="1">厦门</option>
<option value="2">泉州</option>
<option value="3">Oi</option>
</select>
</p>
<p>
<input class="submit" type="submit" value="立即注册" />
</p>
</form>
</body>
</html>
//使用class="{}"的方式,必须引入包:jquery.metadata.js;
//可以使用如下的方法,修改提示内容:class="{required:true,minlength:5,messages:{required:'请输入内容'}}";
//在使用equalTo关键字时,后面的内容必须加上引号,如下代码:class="{required:true,minlength:5,equalTo:'#password'}"。

2、将校验规则写到js代码中

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>jQuery Validate验证框架详解</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<script type="text/javascript" src="/validate/jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="/validate/jquery.validate.min.js"></script>
<script type="text/javascript">
$(function(){
var validate = $("#myform").validate({
debug: true, //调试模式取消submit的默认提交功能
//errorClass: "label.error", //默认为错误的样式类为:error
focusInvalid: false, //当为false时,验证无效时,没有焦点响应
onkeyup: false,
submitHandler: function(form){ //表单提交句柄,为一回调函数,带一个参数:form
alert("提交表单");
form.submit(); //提交表单
},

rules:{
myname:{
required:true
},
email:{
required:true,
email:true
},
password:{
required:true,
rangelength:[3,10]
},
confirm_password:{
equalTo:"#password"
}
},
messages:{
myname:{
required:"必填"
},
email:{
required:"必填",
email:"E-Mail格式不正确"
},
password:{
required: "不能为空",
rangelength: $.format("密码最小长度:{0}, 最大长度:{1}。")
},
confirm_password:{
equalTo:"两次密码输入不一致"
}
}

});

});
</script>
</head>

<body>
<form id="myform" method="post" action="">
<p>
<label for="myname">用户名:</label>
<!-- id和name最好同时写上 -->
<input id="myname" name="myname" />
</p>
<p>
<label for="email">E-Mail:</label>
<input id="email" name="email" />
</p>
<p>
<label for="password">登陆密码:</label>
<input id="password" name="password" type="password" />
</p>
<p>
<label for="confirm_password">确认密码:</label>
<input id="confirm_password" name="confirm_password" type="password" />
</p>
<p>
<input class="submit" type="submit" value="立即注册" />
</p>
</form>
</body>
</html>

常用方法及注意问题

1、用其他方式替代默认的submit

$(function(){
$("#signupForm").validate({
submitHandler:function(form){
alert("submit!");
form.submit();
}
});
});
//可以设置validate的默认值,写法如下:
$.validator.setDefaults({
submitHandler: function(form) { alert("submit!"); form.submit(); }
});
//如果想提交表单,需要使用form.submit(),而不要使用$(form).submit()

2、debug,只验证不提交表单 

如果这个参数为true,那么表单不会提交,只进行检查,调试时十分方便

$(function(){
$("#signupForm").validate({
debug:true
});
});
//如果一个页面中有多个表单都想设置成为debug,用
$.validator.setDefaults({
debug: true
})

3、ignore:忽略某些元素不验证
ignore: “.ignore”
4、更改错误信息显示的位置
errorPlacement:Callback
Default: 把错误信息放在验证的元素后面
指明错误放置的位置,默认情况是:error.appendTo(element.parent());即把错误信息放在验证的元素后面
errorPlacement: function(error, element) {
error.appendTo(element.parent());
}
//示例

<tr>
<td class="label"><label id="lfirstname" for="firstname">First Name</label></td>
<td class="field"><input id="firstname" name="firstname" type="text" value="" maxlength="100" /></td>
<td class="status"></td>
</tr>
<tr>
<td style="padding-right: 5px;">
<input id="dateformat_eu" name="dateformat" type="radio" value="0" />
<label id="ldateformat_eu" for="dateformat_eu">14/02/07</label>
</td>
<td style="padding-left: 5px;">
<input id="dateformat_am" name="dateformat" type="radio" value="1" />
<label id="ldateformat_am" for="dateformat_am">02/14/07</label>
</td>
<td></td>
</tr>
<tr>
<td class="label">&nbsp;</td>
<td class="field" colspan="2">
<div id="termswrap">
<input id="terms" type="checkbox" name="terms" />
<label id="lterms" for="terms">I have read and accept the Terms of Use.</label>
</div>
</td>
</tr>

errorPlacement: function(error, element) {
if (element.is(":radio"))
error.appendTo(element.parent().next().next());
else if (element.is(":checkbox"))
error.appendTo(element.next());
else
error.appendTo(element.parent().next());
}

代码的作用是:一般情况下把错误信息显示在中,如果是radio显示在中,如果是checkbox显示在内容的后面
errorClass:String Default: “error”
指定错误提示的css类名,可以自定义错误提示的样式
errorElement:String Default: “label”
用什么标签标记错误,默认的是label你可以改成em
errorContainer:Selector
显示或者隐藏验证信息,可以自动实现有错误信息出现时把容器属性变为显示,无错误时隐藏,用处不大
errorContainer: “#messageBox1, #messageBox2”
errorLabelContainer:Selector
把错误信息统一放在一个容器里面。
wrapper:String
用什么标签再把上边的errorELement包起来
一般这三个属性同时使用,实现在一个容器内显示所有错误提示的功能,并且没有信息时自动隐藏
errorContainer: “div.error”,
errorLabelContainer: $(“#signupForm div.error”),
wrapper: “li”

5、更改错误信息显示的样式 

设置错误提示的样式,可以增加图标显示,在该系统中已经建立了一个validation.css专门用于维护校验文件的样式

input.error { border: 1px solid red; }
label.error {
background:url("./demo/images/unchecked.gif") no-repeat 0px 0px;
padding-left: 16px;
padding-bottom: 2px;
font-weight: bold;
color: #EA5200;
}
label.checked {
background:url("./demo/images/checked.gif") no-repeat 0px 0px;
}

6、每个字段验证通过执行函数
success:String,Callback
要验证的元素通过验证后的动作,如果跟一个字符串,会当做一个css类,也可跟一个函数

success: function(label) {
// set &nbsp; as text for IE
label.html("&nbsp;").addClass("checked");
//label.addClass("valid").text("Ok!")
}
//添加"valid"到验证元素, 在CSS中定义的样式<style>label.valid {}</style>
//success: "valid"

7、验证的触发方式修改
下面的虽然是boolean型的,但建议除非要改为false,否则别乱添加。
a.onsubmit:Boolean Default: true
提交时验证. 设置唯false就用其他方法去验证
b.onfocusout:Boolean Default: true
失去焦点是验证(不包括checkboxes/radio buttons)
c.onkeyup:Boolean Default: true
在keyup时验证.
d.onclick:Boolean Default: true
在checkboxes 和 radio 点击时验证
e.focusInvalid:Boolean Default: true
提交表单后,未通过验证的表单(第一个或提交之前获得焦点的未通过验证的表单)会获得焦点
f.focusCleanup:Boolean Default: false
如果是true那么当未通过验证的元素获得焦点时,移除错误提示。避免和focusInvalid一起用

8、异步验证 

remote:URL 

使用ajax方式进行验证,默认会提交当前验证的值到远程地址,如果需要提交其他的值,可以使用data选项

示例一:
remote: "check-email.php"
示例二:
remote: {
url: "check-email.php", //后台处理程序
type: "post", //数据发送方式
dataType: "json", //接受数据格式
data: { //要传递的数据
username: function() {
return $("#username").val();
}
}
}
//远程地址只能输出"true"或"false",不能有其它输出。

9、添加自定义校验
addMethod:name, method, message
自定义验证方法
1.要在additional-methods.js文件中添加或者在jquery.validate.js添加
建议一般写在additional-methods.js文件中
2.在messages_cn.js文件添加:isZipCode: “只能包括中文字、英文字母、数字和下划线”,
调用前要添加对additional-methods.js文件的引用。

// 中文字两个字节
jQuery.validator.addMethod(
"byteRangeLength",
function(value, element, param) {
var length = value.length;
for(var i = 0; i < value.length; i++){
if(value.charCodeAt(i) > 127){
length++;
}
}
return this.optional(element) || (length >= param[0] && length <= param[1]);
},
$.validator.format("请确保输入的值在{0}-{1}个字节之间(一个中文字算2个字节)")
);

// 邮政编码验证
jQuery.validator.addMethod("isZipCode", function(value, element) {
var tel = /^[0-9]{6}$/;
return this.optional(element) || (tel.test(value));
}, "请正确填写您的邮政编码");

10、radio和checkbox、select的验证

1.radio的required表示必须选中一个
<input type="radio" id="gender_male" value="m" name="gender" class="{required:true}" />
<input type="radio" id="gender_female" value="f" name="gender"/>

2.checkbox的required表示必须选中
<input type="checkbox" class="checkbox" id="agree" name="agree" class="{required:true}" />

checkbox的minlength表示必须选中的最小个数,maxlength表示最大的选中个数,rangelength:[2,3]表示选中个数区间
<input type="checkbox" id="spam_email" value="email" name="spam[]" class="{required:true, minlength:2}" />
<input type="checkbox" id="spam_phone" value="phone" name="spam[]" />
<input type="checkbox" id="spam_mail" value="mail" name="spam[]" />

3.select的required表示选中的value不能为空
<select id="jungle" name="jungle" title="Please select something!" class="{required:true}">
<option value=""></option>
<option value="1">Buga</option>
<option value="2">Baga</option>
<option value="3">Oi</option>
</select>

select的minlength表示选中的最小个数(可多选的select),maxlength表示最大的选中个 数,rangelength:[2,3]表示选中个数区间
<select id="fruit" name="fruit" title="Please select at least two fruits" class="{required:true, minlength:2}" multiple="multiple">
<option value="b">Banana</option>
<option value="a">Apple</option>
<option value="p">Peach</option>
<option value="t">Turtle</option>
</select>

转自: jQuery Validate验证框架详解

vimrc

git

“”==========================================
” Author: fidding
” Version: 1.2
” Email: 395455856@qq.com
” BlogPost: http://www.fidding.me
” ReadMe: README.md
” Last_modify: 2017-04-02
“”==========================================

” Turn off the vi compatibility mode
set nocompatible
” set runtime path
set runtimepath^=~/.vim/plugged
“==========================================
” Plugin Settings
“==========================================
call plug#begin(‘~/.vim/plugged’)
” File fuzzy query
Plug ‘kien/ctrlp.vim’
Plug ‘scrooloose/syntastic’
Plug ‘majutsushi/tagbar’
” Automatic completion of the html/xml label
Plug ‘docunext/closetag.vim’, { ‘for’: [‘html’, ‘xml’] }
” status bar
“Plug ‘powerline/powerline’
” molokai-theme
Plug ‘tomasr/molokai’
” dracula-theme
Plug ‘dracula/vim’
” Directory tree
Plug ‘scrooloose/nerdtree’
” Automatic completion
Plug ‘Shougo/neocomplete.vim’
” quickly comment
Plug ‘scrooloose/nerdcommenter’
” airline
Plug ‘vim-airline/vim-airline’
Plug ‘vim-airline/vim-airline-themes’
call plug#end()

“==========================================
” General Settings
“==========================================
” set backspace work style
set backspace=indent,eol,start
” set leader key
let mapleader = “\”
” Grammar highlighting
syntax on
” Detect file types
filetype on
” Change the indentation mode according to the file type
filetype indent on
” Allow plugins
filetype plugin on
filetype plugin indent on
” save file
set fileformats=dos,unix,mac
” Highlight the current column
set cursorcolumn
” Highlight the current line
set cursorline
” Disable the mouse
set mouse-=a
” Enable the mouse
“set mouse=a
” reomove toolbar
set guioptions-=T
” remove menubar
set guioptions-=m
” Cancel the backup
set nobackup
” display status bar
set laststatus=2
” set font style
if has(‘gui_win32′)
set guifont=Consolas:h12
else
set guifont=Source_Code_Pro:h12
endif
autocmd InsertEnter * se cul

“==========================================
” Display Settings
“==========================================
” The status bar shows the line number column number
set ruler
” The status bar displays the input command
set showcmd
” shows vim mode
set showmode
” Highlight match search
set hlsearch
set incsearch
” Ignore case when searching
set ignorecase
” One or more capital letters are capitalized sensitive
set smartcase
” Show brackets match
set showmatch
” code folding
set foldenable
” floding style
” manual
” indent
” expr
” syntax
” diff
” marker
set foldmethod=indent
set foldlevel=99
” Customize shortcuts zz
let g:FoldMethod = 0
map zz :call ToggleFold()
fun! ToggleFold()
if g:FoldMethod == 0
exe “normal! zM”
let g:FoldMethod = 1
else
exe “normal! zR”
let g:FoldMethod = 0
endif
endfun
” indent config
” Smart indent
set smartindent
” Turn on auto indent
set autoindent
set cindent
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
” Use spaces instead of tab indentation
set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
” Show line number
set number

“==========================================
” FileEncode Settings
“==========================================
” Set the encoding to utf-8
set encoding=utf-8
” utomatically determine the coding sequence
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
set helplang=cn
“set langmenu=zh_CN.UTF-8
“set enc=2byte-gb18030
set termencoding=utf-8

“Use Unix as the standard file type
set ffs=unix,dos,mac
set formatoptions+=m
set formatoptions+=B
” Sync clipboard
” set clipboard+=unnamed
“==========================================
” HotKey Settings
“==========================================
” Close the arrow keys
map
map
map
map
” Smart way to move between windows
nnoremap wj j
nnoremap wk k
nnoremap wh h
nnoremap wl l
” close window
nnoremap wc :close
” save file
nnoremap fs :w
” instead of esc
inoremap jj
” closetag ({[
imap () ()
imap {} {}
imap [] []
imap “” “”
imap ” ”
imap <> <>
” Vim allows the use of the window copy and paste shortcut keys
map “+y
map “+p
” Disable F1 to bring up system help
” I can type :help on my own, thanks. Protect your fat fingers from the evils of
noremap ”

“==========================================
” commenter Settings
“==========================================
” Instructions for use
” cc Comment the current row or select the line
” cu Uncomment the current row or select the line
let g:NERDSpaceDelims=1
let g:NERDAltDelims_python = 1

“==========================================
” Closetag Settings Html tag completion
“==========================================
let g:closetag_html_style=1

“==========================================
” Powerline Settings
“==========================================
“set runtimepath^=~/.vim/plugged/powerline/powerline/bindings/vim
“let g:Powerline_symbols=’fancy’

“==========================================
” Airline Settings
“==========================================
let g:airline_powerline_fonts = 1
if !exists(‘g:airline_symbols’)
let g:airline_symbols = {}
endif

if has(‘gui_win32’)
let g:airline_left_sep = ”
let g:airline_left_alt_sep = ”
let g:airline_right_sep = ”
let g:airline_right_alt_sep = ”
let g:airline_symbols.branch = ”
let g:airline_symbols.readonly = ”
let g:airline_symbols.linenr = ”
else
let g:airline_left_sep = ‘’
let g:airline_left_alt_sep = ‘’
let g:airline_right_sep = ‘’
let g:airline_right_alt_sep = ‘’
let g:airline_symbols.branch = ‘’
let g:airline_symbols.readonly = ‘’
let g:airline_symbols.linenr = ‘’
endif
” ignore whitespace
let g:airline#extensions#whitespace#enabled=0
” tabline
“let g:airline#extensions#tabline#enabled = 1
“nnoremap bn :bn
“nnoremap bp :bp
” Theme Settings
“==========================================
color dracula
“set t_Co=256
“set background=dark
“color molokai

“==========================================
” Ctrlp Settings
“==========================================
let g:ctrlp_map=’fl’
let g:ctrlp_cmd=’CtrlP’
let g:ctrlp_working_path_mode=0
let g:ctrlp_match_window_bottom=1
let g:ctrlp_max_height=15
let g:ctrlp_match_window_reversed=0
let g:ctrlp_mruf_max=500
let g:ctrlp_follow_symlinks=1
set wildignore+=*/tmp/*,*.so,*.swp,*.zip ” Linux/MacOSX
set wildignore+=*\\tmp\\*,*.swp,*.zip,*.exe ” Windows

“==========================================
” NerdTree Settings
“==========================================
let NERDChristmasTree=0
let NERDTreeWinSize=25
let NERDTreeChDirMode=2
let NERDTreeShowHidden=1
let NERDTreeShowLineNumbers=0
let NERDTreeIgnore=[‘\~$’, ‘\.pyc$’, ‘\.swp$’]
let NERDTreeShowBookmarks=1
let NERDTreeWinPos=”left”
“open a NERDTree automatically when vim starts up if no files were specified
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 0 && !exists(“s:std_in”) | NERDTree | endif
” open NERDTree automatically when vim starts up on opening a directory
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists(“s:std_in”) | exe ‘NERDTree’ argv()[0] | wincmd p | ene | endif
” Close vim if the only window left open is a NERDTree
autocmd bufenter * if (winnr(“$”) == 1 && exists(“b:NERDTree”) && b:NERDTree.isTabTree()) | q | endif
nnoremap n :NERDTreeToggle

“==========================================
” Neocomplete Settings
“==========================================
“Note: This option must be set in .vimrc(_vimrc). NOT IN .gvimrc(_gvimrc)!
” Disable AutoComplPop.
let g:acp_enableAtStartup = 0
” Use neocomplete.
let g:neocomplete#enable_at_startup = 1
” Use smartcase.
let g:neocomplete#enable_smart_case = 1
” Set minimum syntax keyword length.
let g:neocomplete#sources#syntax#min_keyword_length = 3

” Define dictionary.
let g:neocomplete#sources#dictionary#dictionaries = {
\ ‘default’ : ”,
\ ‘vimshell’ : $HOME.’/.vimshell_hist’,
\ ‘scheme’ : $HOME.’/.gosh_completions’
\ }

” Define keyword.
if !exists(‘g:neocomplete#keyword_patterns’)
let g:neocomplete#keyword_patterns = {}
endif
let g:neocomplete#keyword_patterns[‘default’] = ‘\h\w*’

” Plugin key-mappings.
inoremap neocomplete#undo_completion()
inoremap neocomplete#complete_common_string()

” Recommended key-mappings.
” : close popup and save indent.
inoremap =my_cr_function()
function! s:my_cr_function()
return (pumvisible() ? “\” : “” ) . “\”
” For no inserting key.
“return pumvisible() ? “\” : “\”
endfunction
” : completion.
inoremap pumvisible() ? “\” : “\”
” , : close popup and delete backword char.
inoremap neocomplete#smart_close_popup().”\”
inoremap neocomplete#smart_close_popup().”\”
” Close popup by .
“inoremap pumvisible() ? “\” : “\”

” AutoComplPop like behavior.
“let g:neocomplete#enable_auto_select = 1

” Shell like behavior(not recommended).
“set completeopt+=longest
“let g:neocomplete#enable_auto_select = 1
“let g:neocomplete#disable_auto_complete = 1
“inoremap > pumvisible() ? “\” : “\\”

” Enable omni completion.
autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS
autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
autocmd FileType python setlocal omnifunc=pythoncomplete#Complete
autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags

” Enable heavy omni completion.
if !exists(‘g:neocomplete#sources#omni#input_patterns’)
let g:neocomplete#sources#omni#input_patterns = {}
endif
“let g:neocomplete#sources#omni#input_patterns.php = ‘[^. \t]->\h\w*\|\h\w*::’
“let g:neocomplete#sources#omni#input_patterns.c = ‘[^.[:digit:] *\t]\%(\.\|->\)’
“let g:neocomplete#sources#omni#input_patterns.cpp = ‘[^.[:digit:] *\t]\%(\.\|->\)\|\h\w*::’

” For perlomni.vim setting.
” https://github.com/c9s/perlomni.vim
let g:neocomplete#sources#omni#input_patterns.perl = ‘\h\w*->\h\w*\|\h\w*::’

“==========================================
” Other Settings
“==========================================
” The vimrc file is automatically loaded after modification, windows
“autocmd! bufwritepost _vimrc source %
” The vimrc file is automatically loaded after modification, linux
“autocmd! bufwritepost .vimrc source %

vim进阶

输入终端命令:!+命令

sudo保存:w !sudo tee %

显示当前路径::pwd

查看缓冲区::ls

打开缓冲区文件:buffer 2

命令补全:Tab键

:r!date读shell日期到vim

全文缩进:gg=G或G=gg

批量注释:CTRL+V,块选择模式,选择多行,I插入注释,esc。

删除注释:同上,d删除。

完全匹配查找:/\<word\>

所有目录下文件查找: vimgrep /\<encrypt\>/ **/*.*  

替换: %s/\<encrypt\>/alipayEncrypt/g 

设置文件类型:set filetype=html

文件状态

– (非活动的缓冲区)
a (当前被激活缓冲区)
+ (已经更改的缓冲区)
h (隐藏的缓冲区)
% (当前的缓冲区)
# (交换缓冲区)
= (只读缓冲区)

标签

:Hexplore  [dir] 执行 :Explore,用 |:belowright| 水平分割。缩写He
:Hexplore! [dir] 执行 :Explore,用 |:aboveleft|  水平分割。
:Vexplore  [dir] 执行 :Explore,用 |:leftabove|  垂直分割。缩写Ve
:Vexplore! [dir] 执行 :Explore,用 |:rightbelow| 垂直分割。
:Texplore  [dir] 执行 :Explore,在标签页中打开。              缩写Te
gt 下一标签页
gT 上一标签页
数字gt 到第几页
tabs 查看所有页
退出所有::qa

可视

可视选整行:V
可视跳转:数字+G /数字+gg
可视换头尾:o
上一次可视:gv
可视另存::write new.txt
可视排序::sort

替换

vi/vim 中可以使用 :s 命令来替换字符串
:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
n 为数字,若 n 为 .,表示从当前行开始到最后一行
:%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
:%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/

NerdTree

插件安装:把所有文件复制到对应目录下。例如NerdTree

autoload doc lib plugin syntax 都复制到~/.vim下,不是只复制plugin

ctrl + w + h    光标 focus 左侧树形目录
ctrl + w + l    光标 focus 右侧文件显示窗口
ctrl + w + w    光标自动在左右侧窗口切换
ctrl + w + r    移动当前窗口的布局位置
o       在已有窗口中打开文件、目录或书签,并跳到该窗口
go      在已有窗口 中打开文件、目录或书签,但不跳到该窗口
t       在新 Tab 中打开选中文件/书签,并跳到新 Tab
T       在新 Tab 中打开选中文件/书签,但不跳到新 Tab
i       split 一个新窗口打开选中文件,并跳到该窗口
gi      split 一个新窗口打开选中文件,但不跳到该窗口
s       vsplit 一个新窗口打开选中文件,并跳到该窗口
gs      vsplit 一个新 窗口打开选中文件,但不跳到该窗口
ctrl+w x 窗口位置对调
!       执行当前文件
O       递归打开选中 结点下的所有目录
x       合拢选中结点的父目录
X       递归 合拢选中结点下的所有目录
e       Edit the current dif
双击    相当于 NERDTree-o
中键    对文件相当于 NERDTree-i,对目录相当于 NERDTree-e
D       删除当前书签
P       跳到根结点
p       跳到父结点
K       跳到当前目录下同级的第一个结点
J       跳到当前目录下同级的最后一个结点
k       跳到当前目录下同级的前一个结点
j       跳到当前目录下同级的后一个结点
C       将选中目录或选中文件的父目录设为根结点
u       将当前根结点的父目录设为根目录,并变成合拢原根结点
U       将当前根结点的父目录设为根目录,但保持展开原根结点
r       递归刷新选中目录
R       递归刷新根结点
m       显示文件系统菜单
cd      将 CWD 设为选中目录
I       切换是否显示隐藏文件
f       切换是否使用文件过滤器
F       切换是否显示文件
B       切换是否显示书签
q       关闭 NerdTree 窗口
?       切换是否显示 Quick Help

设置书签:Bookmark web  

mac配置

初始不设置磁盘加密
显示隐藏文件

defaults write com.apple.finder AppleShowAllFiles -boolean true ; killall Finder

不显示隐藏文件

defaults write com.apple.finder AppleShowAllFiles -boolean false ; killall Finder

Mac基本快捷键

space:预览
command+w:关闭
command+q:退出
command+z:撤销
command+shift+z:重做
command+x:剪切
command+c:复制
command+v:粘贴
command+a:全选
command+r:刷新
command+s:保存
command+f:查找
command+space:切换输入法
command+tab:程序切换
command+~:同程序窗口切换
command++:放大
command+—:缩小
command+h:隐藏当前窗口
command+alt+f:隐藏除当前窗口外其他窗口
command+delete:删除
command+shift+delete:清空废纸篓
fn+command+delete:删除后面
command+方向键:光标跳到文本行的首位和文件的首位
command+F3:显示桌面
command+n:打开新窗口
command+m:最小化窗口
command+o:打开文件
command+ctrl+f:全屏
command+shift+3:截取全屏(+alt保存到剪切版)
command+shift+4:截取部分屏幕(按住space空格键选取窗口+alt保存到剪切版)
command+alt+esc:强制退出程序
按住command可以多选文件
开机alt选择启动驱动
control+shift+电源:关闭显示器
command+alt+电源:睡眠
command+control+电源:重启

触控板快捷方式-系统偏好设置-触控板有演示(滚动方向-自然不勾选)

环境变量设置:终端输入export PATH=/usr/local/php/bin:$PATH 或者在/etc/profile文件最后加入,立即执行环境变量文件source /etc/profile

安装brew

git config --global http.postBuffer 524288000
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

终端:终端iterm2下载 Finder-自定义工具栏-iterm2拖到工具栏上

Git:gitkarken下载

编辑器:macvim下载 macvim放到应用程序下 mvim放到/usr/bin/下

vim中文帮助:vimdoc下载 根目录sudo ./vimcdoc.sh -i

更多vim配置

ftp:filezilla客户端下载

数据库:mysql下载 安装后系统偏好设置有个Mysql图标,可以启动Mysql服务。

mysql配置:/usr/local/mysql/为maysql目录
设置mysql不需要密码,经常出错没有root密码,干脆不要密码,等创建完用户记得删掉,个人电脑就无所谓了,要密码还麻烦。

sudo cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
sudo vi /etc/my.cnf
#[mysqld]下添加
skip-grant-tables
#esc :wq!

apache:mac自带了apache,不需要安装,看了下版本是2.4.16,官方是2.4.20,还可以。apache服务的目录/etc/httpdctl或者/usr/sbin/httpd,模块目录/usr/libexec/apache2/,配置文件目录/etc/apache2/。启动服务:sudo apachectl start

安装php:php下载

#扩展openssl gd mbstring
./configure --prefix=/usr/local/php --with-apxs2=/usr/sbin/apxs --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd
make
make install
sudo cp php.ini-development /usr/local/php/lib/php.ini

配置apache

sudo vi /etc/apache2/httpd.conf
#查找字符串AddType,并增加
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
#查找字符串
DirectoryIndex
#并修改为
DirectoryIndex index.html index.php default.php
#将#LoadModule rewrite_module libexec/apache2/mod_rewrite.so的#删除
#AllowOverride None 改 AllowOverride All

php扩展安装

phpize

m4下载 autoconf下载
先编译安装m4然后编译安装autoconf

./configure
make
make install

或者使用brew

brew install homebrew/dupes/m4
brew install autoconf

扩展openssl

#进入到目录etc/openssl
export PATH=/usr/local/php/bin/:$PATH
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install

php.ini加extension =openssl.so
重启apache
mongodb安装

#mongodb安装
brew install mongodb --with-openssl
#mongodb设置开机启动
ln -sfv /usr/local/opt/mongodb/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
#mongod服务启动
mongod --config /usr/local/etc/mongod.conf

node安装:

brew install node

redis安装

#redis安装
brew install redis
#redis设置开机启动
ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
#redis服务启动
redis-server /usr/local/etc/redis.conf

supervisor安装

npm install supervisor -g

php不识别imagecreate()

没有gd,编译php扩展gd。
php.ini添加extension = gd.so

如果提示没有png.h则安装libpng:brew install libpng

php不识别imagettftext

安装freetype再重新编译gd:freetype下载

./configure --prefix=/usr/local/freetype
make
sudo make install
#编译freetype过程中以下harfbuss没有则安装
#  external zlib: yes (pkg-config)
#  bzip2:         yes (autoconf test)
#  libpng:        yes (pkg-config)
#  harfbuzz:      no  (pkg-config)
brew install harfbuzz

进入到php/ext/gd/

make clean
#重新编译GD之前一定要make clean就是因为忘记了这个找个半天错误。
phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-freetype-dir=/usr/local/freetype
make
sudo make install

php不识别imagecreatefromjpeg

安装jpegsrc再重新编译gd:jpegsrc下载

./configure --prefix=/usr/local/jpeg
make
sudo make install

进入到php/ext/gd/

make clean
phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-jpeg-dir=/usr/local/jpeg --with-freetype-dir=/usr/local/freetype
make
sudo make install

linux composer 安装

php -r "readfile('https://getcomposer.org/installer');" > composer-setup.php
php -r "if (hash('SHA384', file_get_contents('composer-setup.php')) === '7228c001f88bee97506740ef0888240bd8a760b046ee16db8f4095c0d8d525f2367663f22a46b48d072c816e7fe19959') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
#composer install
php composer.phar install