vim自带一个目录浏览器,使用命令
:E
就可以调出来,实际上就是浏览器的名字就是"网络读写"netrwvim也自带了 补全功能, 启动键是 "ctrl_N" 或者用 ctrl_p也可以, 不管是第一个还是后面第几个,反正你可以补全就好了 . 如果有多个补全(开头的字符相同的多个), 则会显示^N^P 还有更多的补全在 ctrl_x中(6种):
ctrl_x 和 ctrl_D 是宏定义补全
ctrl_x ctrl_f 是文件名补全(file)
ctrl_x ctrl_] 是标签补全
ctrl_x ctrl_v 表达式补全
ctrl_x ctrl_I 关键字补全
ctrl_x ctrl_L 是 整行补全- 在gvim中 , 分屏的几种方法:
- 直接用原生命令
:sp :vsp
- 用窗口操作:
^W s水平分割, ^W v是垂直分割
- 在NerdTree中, 使用
is
分割i-水平分割, s-垂直分割
- 要两个分屏同步滚动, 要在两个窗口中, 都使用命令
:set scb
即scroll bind 滚动绑定"铁锁连环" 要解除同步滚屏:set scb!
所以, 在vim中,! 感叹号表示的意思有两个, 一个是表示否定,比如 这里的scb! autocmd!
, 另一种情况是 表示 强制写: 比如: w! q! mksession!
vim的自动命令
autocmd: auto cmd 自动-命令 可以简写为 au
au有很多扩展, 比如显示/列表/ 否定 等等 比如: 删除自动命令: autocmd! ...
au的格式是:au[tocmd] [group] {events} {pat} {cmds}
group表示执行自动命令的 用户组, 一般采用当前默认的用户组就行, 通常不用设置
events, 表示的是事件, 多个事件用逗号隔开. 有很多指定的/合法的事件名称,包括: BufNewFile, BufReadFile, VimLeave, VimEnter.等等
pat表示 pattern模式, 是一个文件类型 模式,表示对哪些文件执行自动命令
cmds命令执行 字符串. 可以是execute, call等. execute后面的参数是一个 字符串, 可以用点号连接字符串其中, {events}, {pat} 和 {cmd} 三个是必须有的 内容,其他 可选.
在写autocmd命令的时候, 最重要的是, 字符串参数中, 不支持
~
这种家目录的写法, 家目录要用$HOME
这样的方式.还有一个 很重要的问题是: 自动命令保存 session的时候, 对 NERDTreee窗口支持得不是很好, 所以 在 关闭gvim的时候, 最好是事先关闭掉 Nerdtree窗口.
如果要单独地 用原生命令 在启动时载入一个session:
vim -S ~/.session.vim
所以, 要让vim自动保存和载入session:
autocmd VimLeave * execute "mksession! ".$HOME."/.session.vim" // 感觉在linux下比较有用 , 但是在win下感觉不是多好使呢?
autocmd VimEnter * execute "source".$HOME."/.session.vim"
vim的设置字体的命令?. 注意windows和linux的区别: linux设置字体的时候, 直接就是 字体和字号, 只是 因为字体和字号之间的 空格 是特殊字符, 所以要把空格 转义: set guifont = Consolas\ 10
而win 中 配置时, 是用 冒号来 分割的:set guifont=Consolas:h10:cANSI
其中的c表示字符集, charset等于ansi的意思
感觉很奇怪, 要对markdown 的标题内容, 使用颜色, 好像只能是 把 <font color="red">
放在 标题行的 上一行, 而</font>
的结束标签 只能放在 标题行的 末尾, 其他放置方式都不对????
vim中的c命令?
c命令是change 修改的意思. 他的操作实际上是3个 操作的合起来: 先选中指定的内容, 删除之, 然后再切换到插入状态. 即c = d + i 这个跟word中 "选中文字后直接打字" 是一样的
vim中的数字, 通常是包含当前内容的(当前单词或当前行的) c4j 即时改变 包括当前行在内的下面4行. cw... c2w.
能否支持 4jc?
不管gold和golden的含义区别如何 反正在css中, 要表示边框border的 "金色"的颜色时, 要用 gold, 而不能用golden 否则边框 就不能显示出来.
表示 border边框属性, 通常的属性书写顺序是: border-width style color: 比如: 1px solid gold: 宽度必须要用单位, 否则不会显式. 金色的,必须用gold单词不能用golden.
=====================
有些css效果直接写在div中无法实现, 就要借助于另外的容器比如在div中嵌套一个子容器 段落p来实现.
注意, 在同一行内, 可以有多个不同的 (行级)元素比如img,span等, 而且它们的高度(在行中的高度)可以是不同的.因此,就牵涉到一个元素在行内的垂直对齐方式: vertical-algin: 元素的基线 和 所在行的基线 之间的垂直对齐方式: 主要有baseline(默认的.两个基线对齐), top,bottom(元素的顶端与最高/最低元素的顶端对齐 (都是顶端对齐)), text-top, text-bottom(元素的顶端/地段与字体元素的顶端/底端对齐), middle.
只有行级/行内元素才有 vertical-align属性. 块级元素没有vertical-align属性的. 表示的是: 该属性所在的元素 相对于其父元素的垂直对齐方式.
块级元素和行级元素的一个区别是: 块级元素在该元素的前后有一个换行符br, 而行级元素则没有换行符.
表格/段落本身是块级元素. 但是 table-cell单元格是行内元素.
border属性: 通常写的顺序是: border-width border-style border-color, 最重要的是, 在linux中, 这个width一定要加上单位, 比如1px, 如果只是写1 是不会显示边框的.
在用tp的xml标签,包括/比如: include的时候, 要严格遵守xml标签的用法, 否则会出错或者无效, 比如include标签的 file属性后, 如果不带 斜杠结尾, 文件将不会被包含, 因此, 首先在写的时候, 就要先把 那些关闭标签, 结尾斜杠先写好, 谨防出错.
在表示模板路径 中的 控制器和操作 关系的时候, 3.2.3中使用的是 斜杠, 比如 Public/header, 而 使用 冒号的是 3.1版本中的用法, 使用冒号是为了兼容3.1, 所以, 如果已知使用的是 3.2版本, 则就用 斜杠不必用 冒号.
注意 $this->display('Public/header'); 和 在 include标签中的 Public/header 都表示的是 目录 或控制器. 也就是说, 如果即使没有控制器, 有相应的目录也是可以正确 找到定位的.
感觉, 在模板 如果要用 Public, 要使用 模板布局, base基础模板等 最好是 按照 View/控制器/操作 这样的 目录结构来 构建. 也就是 最好不要 去定义 TMPL_FILE_DEPR => '_' 这样的配置. 这样结构更清晰. 而且在使用包含, 布局的时候, 也不容易出错.
========================================
模板路径的两种表示方法:
表示模板路径, 一种是用模板表达式: [模块@主题/]控制器/操作, 也就是说, 如果要用 跨模块,则一定要在模块后加@符号。 否则,会将模块看作是 主题目录, 而不是模块名称
注意, 凡是 Home\View 目录下的子目录 , 包括控制器名称目录, 或者你自己创建的 Public目录, 或者 Layout目录等 , 都会被 看作是 控制器名称目录, 指定模板时, 都可以用 控制器/操作 的类似方法.
因此, 如果模板不是放在 View/确实存在的控制器名 目录下的, 而是放在 View/Public/ 下的,由于 View下的目录会被看作是 "控制器名称" , 所以, 你的 display(...)和 include file="..." 既可以直接写:
display("Public/header");
, 当然也可以 从 View下写起, 比如:$this-> display('./Public/content');
注意这里的 点号 表示的不是 网站的根目录, 也不是指的 View/当前控制器名称 目录, 而是指 View目录.如果不是 控制器/操作 的 模板表达式, 就要用 完整的模板文件,要从 网站的根目录写起 即 ./Application/Home/View/SomeDir/template.html
始终要牢记一个思想, 在写包含 文件 | 包含 模板时, 如果 用的是 模板表达式, 那么 后面 就不要加 .html 的扩展名, 只有用 完整文件路径的时候, 才需要加 完整的 扩展名.
总之,感觉 tp的目录路径是有些混乱的, 其中的 点号 目录,跟我们平常的 认识有些 偏差, 只有记住就行了。
关于display成员函数!
- 他就是一个普通的成员函数而已 没有任何特殊的
- 它不是return, 没有return的 功能. 即你调用 display后, 还可以 在操作方法中, 继续处理/执行语句, 继续输出其他内容.
- 他可以在一个操作中, 多次被调用. 甚至 可以多次调用, 比如,你先调用了 其他"控制器"中的 其他 模板文件, 然后再输出 当前控制器的对应 的 入口模板文件( 就是 当前action对应的模板文件)
===================================
关于模板布局?
- 模板使用 模块 + include 的方式, 可以 很方便地 进行 模块 组装式 的 来 生成 灵活多样的 模板文件, 既提高效率, 又减轻了 劳动强度
- 默认的 布局模板, 是放在 View/下的 layout.html文件 . 因此, 如果你的布局模板 是 放在 View/Public/layout.html中, 则要 配置:
'LAYOUT_ON' => true, 'LAYOUT_NAME' => 'Public/layout',
- 在写布局模板的时候, 即使 layout.html和 所有 的包含模块 比如 Public/header.html, Public/menu.html, footer.html 等 在同一个目录位置 Public/ 下, 在写include 包含文件的时候, 都必须写上 Public. 不能说, layout.html和模块在 同一个位置, 就不写Public, 那样是包含不到 模块的...
- 也就是说, 写模板路径, include包含文件, 写layout的时候, 必须 包含上 "控制器名称" ??? 必须包含上 Public/ 控制器目录是不能省略的???
========================================
include 包含文件, 如果有 多个 连续的 要包含的文件, 可以一次性写在一个 include标签中, 而不必分别 写多个包含标签了. <include file="Public/header,Public/menu" />
但是你要注意的是, 在多个包含文件之间, 逗号后面不能有空格, 否则会出错: 后面 的那个文件将不会被包含. 估计可能是tp在解析的时候, 没有将逗号后面的空格ltrim, trim过滤掉.
======================================
关于ajax的实例 补充
- 函数的写法, $.getJSON, 这里的JSON 全部是大写, 不是 Json. 如果写成 getJson会报错说没有这样的函数.
$.getScript这里的script则不是全部大写, 只有首字母大写.
ajax是要载入 你指定url文件的内容, 注意是载入, 不是函数的"return", 只要你文件最后的结果内容是什么, 就载入这些.所以 如果是php文件的话, 要用 echo,
而不是return. ajax载入的/关心的是你文件的内容/文本...如果是返回json格式的数据, 那么php里面写的 肯定是一个字符串, 因为不可能直接写 js对象格式的 . 而且这个这个字符串, 必须
是 严格的 json 格式的字符串! 即前面的key 必须是 用 双引号..., 如果哪怕一点点 不符合 json格式的话, 都不会有返回值的如果getJSON成功的话, 最后返回给callback函数的是一个 js对象: object(....还有一个默认的成员是: __proto__Object)
- 设计网站 网页应该是(小的/窄的, 矮的)图片和文字等想 混排的, 才好看. 而且排列 的位置要 交错镶嵌 才好看.
关于js中的变量的 声明,定义,赋值,初始化? 如同在 c/c++里一样, 定义和初始化是分开的两个概念. 参考: http://www.111cn.net/wy/js-ajax/64110.htm
- js中, 变量的声明(显式的用var, 隐式的不用var), 就是/就叫做 变量的定义; 对于隐式的声明是指, js可以直接给一个未声明果的变量赋值, 那么这时候就是隐式声明
- 变量的赋值(第一次), 就叫做变量的初始化;
但是,要注意, 变量的定义后, 不一定 必须就要赋值, 必须初始化, 虽然这个通常是声明时就给它初始化;
当给一个变量声明后, 不给它初始化赋值, 那么它的值就等于 undefined** ,注意这个undefined 是一个特殊的值, 不是字符串,字符串的话, 要写成 'undefined'**
对一个没有声明过的变量只能执行 typeof 操作, 其他操作都会报错!
判读一个变量是否赋值:
if(foo == undefined) , 或者: if( typeof foo == 'undefined') //这里的undefined必须加引号, 因为 typeof返回值是一个字符串
js代码的调试, 当设置了断点后, 要 单击一下 "开始/停止" 按钮, 才能进入调试状态 之前都会一直 转圈, 表示被堵塞.
js代码调试, 即使设置了 步进模式, 也不会进入 回调函数中 设置的断点. 这个要注意一下.
// 一个网页中, 的对象层次是: window(浏览器窗口) > document > html 标签 > body.. 标签. 也就是说, html中 的所有变量都是 window的属性
if(!window.oneObj)
{
var oneObj = {};
}
dom的元素的innerHTML(注意HTML要全部大写)属性, 在jquery中 变成了 html()方法. 同样的, dom元素的innerText属性, 变成了jquery中 的text()方法.
关于全局变量和局部变量的作用域scope?
- 要真正理解 全局变量: 是指 直接 包含 在
<script> </script>
之间的变量, 它不在 任何 函数内! 不能在任何方法内, 不能在任何 匿名(闭包) 函数内, 更不能在 回调函数内 - 如果某个方法中, 包含有回调函数的话, 即使步进进入step into 调试, 也不会进入到 回调函数内的!
全局变量是 window的 属性, 你可以在 任何地方 通过 window 来引用 全局变量, 比如你想 取回/取出 函数内 闭包内, 或 回调函数内的 临时值, 以供后面使用, 但是你要注意, 后面
在引用的时候, 也必须要用window... 否则会出错!- 全局变量也可以在 函数内访问到, 但是 如果 同名的话, 会被局部变量所屏蔽
在回调函数内, 想取回数据 供今后使用的方法 虽然是可以的, 行得通的, 但是, 那样会增加问题的难度, 而且非常容易出错! 所以, 如果有回调函数中, 需要处理业务的话, 就直接
在回调函数中直接处理就好 了, 这样是最直接, 最方便的!! 不要到外面来处理, 那样又麻烦又容易出错!
tp的验证码chptcha
- 验证码是一个图片! 你可以看到使用的是 : imagecreate(imageW, imageH); 和 输出 imagePng, 验证码真的是一个普通图片, 你可以像其他图片一样: 查看图片, 复制图片
- 验证码其实很简单, 先配置, 再生成, 最后验证.
php允许两种方式的对象实例化, 一是 实例化时传入配置参数, 另一种是 动态设置, (这是php特有的__set机制)
验证码的生成和显示: 是用 Verify对象的 entry()函数, entry是 进入, 入口 , 表示在登陆时的权限验证!
- 验证码的背景图片是放在: /Think/Verify/bgs/ 目录下的, 名字是 1.png, 2.png...
- 验证码的英文字体是放在 /Think/Verify/ttfs/目录下的, 1.ttf, 2.ttf, ...
- 同理, 中文字体是放在: /Think/Verify/zhttfs/ 目录下的, zh1.ttf, zh2.ttf, zh3.ttf...等
如果只想显示数字, 则设置 codeSet只包含数字, 如果要设置中文验证码, 就要自己设置 zhSet, 因为你可以看源代码, 里面是没有设置zhSet的.但是默认设置了codeSet的, 里面是数字和
字母的集合. 为了避免混淆, 没有包含数字0和1, 因为0和字母o, 1和字母l有些混淆- 验证码有时候也用 captcha来表示, 这个是多个单词的缩写: Completely Automated Public Turing test to tell Computers and Human Aparts. 表示全自动区分计算机和人类的图灵测试.
Verify类的 authcode 函数, 是用 加密秘钥的md5 取5位后的8个数字, 跟加密字符串的md5 取8位后的10个数字, 然后这两个字符串拼接后的md5函数.
vim 光标向前和向后回跳历史: ctrl_i从当前历史位置, 向前跳(下一个) , 这个不必经常用, 只是在某些情况下有用!
emmet的序号问题?
- 如果有多个$, 则前面的$都是0, 最后一个从1开始
可以用@ 来指示序号 从什么开始, 要放在 $ 和 乘号 之间: 其中: @- 表示 倒序, 注意不是负数! @2表示 从 2开始: 比如 li$3 表示li1 li2 li3 li$@-3 表示 : li3 li2 li1 ,
而 li$@2*3 则表示 li2 li3 li4经常需要在多个行/多个内容的 外面 用标签 来包围: wrap 这个是很重要, 很常见的! 要用 emmet来写, 切实掌握, 参考:
http://www.cnblogs.com/matchless/archive/2013/04/11/3015759.html
这个讲得非常好
首先, 包围标签可以有多个级, 跟平常的解析是一样的, 但是 被包含的 内容 总是包含在 最后一个标签中, 其次, 如果要 用标签来 逐行包围, 那么在 要分离的/ 逐行包围的 那个标签上加上 星号* , (不需要写对应的数字), 最后选择好
要包围的内容后, 要启动emmet , 还是使用 启动键, 即ctrl-e逗号apart: (一部分一部分的): adj: 分离的 分散的; adv. 相隔, 相距; 分散地; 分离地. torn me apart 让我四成碎片.
tp3.2.3验证码不显示?
- 验证码的默认值: 字符位数是5(就是长度), 字体大小fontSize是25, 图片高度是250*62...
- 用直接通过url访问 captcha方法能够 显示图片, 默认的图片大小是: WxH : 250*62, O
要注意是因为, 验证码图片的 src地址 要在 :U方法外面加上 大括号{}...
如何调整验证码图片和文字之间的相对高度? 使用 vertical-align 的样式, 使文字和图片都 垂直 middle 则居中对齐; 重要的是 可以在图片的css样式上 : 使用 负数的 百分比 来调整文字的相对高度
验证码的例子
在模板中 插入验证码? <p class="p01"><input type="text" value="验证码" style="color: #ddd;"> <img style="vertical-align: -40%;" src="{:U('captcha')}" /></p>
public function captcha(){
$v=new \Think\Verify();
$v->length = 4;
$v -> fontSize = 15;
$v -> imageW = 140;
$v -> imageH = 40;
$v -> useNoise = false;
$v -> bg =array(190, 230, 200);
$v->entry();
}