vim折腾记

一、原因
公司机器自从安装了Mac Yosemite后,就略卡了,虽然配置挺OK。平时都用强大的phpstorm,这玩意确实非常棒。但是无奈卡,尝试着先换MacVim来写代码。

二、插件管理
使用Vim必不可少的是从海量的Vim插件中寻找适合自己的,那么这个时候对vim插件进行管理的插件就非常有必要了。

关于这3个插件管理器的区别可以参考这里:what are the differences between Vundle and NeoBundle?

按照发展的时间排序:pathogen -> vundle -> neobundle
当然了vundle和neobundle都在迅速的发展中,目前使用vundle来管理插件,相当的方便,具体的安装方法参数 上面的github地址,说的都非常清楚了。

三、插件搞起来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
set nocompatible              " be iMproved, required
filetype off                  " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'gmarik/Vundle.vim' " 插件管理
Plugin 'tpope/vim-fugitive' " git 插件
Plugin 'mileszs/ack.vim' " 全局代码搜索
Plugin 'kien/ctrlp.vim' " 全局文件搜索
Plugin 'Raimondi/delimitMate' " 括号、单双引号自动补全
Plugin 'scrooloose/nerdtree' " 目录树
Plugin 'bling/vim-airline' " 状态样美化
Plugin 'SirVer/ultisnips' " 代码片段
Plugin 'honza/vim-snippets' " 提供各种语言默认的代码片段,提供给ultisnips调用
Plugin 'rizzatti/dash.vim' " 文档查阅工具(Mac独占)
Plugin 'tomtom/tcomment_vim' " 注释
Plugin 'Yggdroot/indentLine' " 显示纵向对齐线
Plugin 'jisaacks/GitGutter' " git 修改状态
Plugin 'scrooloose/syntastic' " 语法检查
Plugin 'Valloric/YouCompleteMe' " 自动补全
Plugin 'majutsushi/tagbar' " 函数列表,需要安装ctags
Plugin 'git://repo.or.cz/vcscommand' " SVN 工具

call vundle#end()            " required
filetype plugin indent on    " required

四、其他配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
【VIM通用设置】
"主题设置
colorscheme molokai
let g:molokai_original = 1 " 设置molokai配色方案
set guifont=DejaVu\ Sans\ Mono\ for\ Powerline:h12 " 默认字体及大小

cd /Users/GaoGao/Dropbox/gaogao " 切换到特定的工作目录

"去除行号的显示,过去一直都有开启,发现显示意义不大,有状态样足矣
set nonu

"自动缩进
set autoindent

"设置历史命令条数
set history=50

"总在 Vim 窗口的右下角显示当前光标位置
set ruler

"tab长度
set ts=4
set sw=4
set expandtab "开启Tab转空格的操作
set tabstop=4 "Tab表示成4个空格

""高亮行
set cursorline

"去掉左右的滚动条
set guioptions-=L
set guioptions-=r

"实时搜索
set incsearch

"以下解决UltiSnips 与 YouCompleteMe 的冲突问题,网上找来的,其实也不大好用就是了
function! g:UltiSnips_Complete()
    call UltiSnips#ExpandSnippet()
    if g:ulti_expand_res == 0
        if pumvisible()
            return "\<C-n>"
        else
            call UltiSnips#JumpForwards()
            if g:ulti_jump_forwards_res == 0
               return "\<TAB>"
            endif
        endif
    endif
    return ""
endfunction

au BufEnter * exec "inoremap <silent> " . g:UltiSnipsExpandTrigger . " <C-R>=g:UltiSnips_Complete()<cr>"
let g:UltiSnipsJumpForwardTrigger="<tab>"
let g:UltiSnipsListSnippets="<c-e>"
" this mapping Enter key to <C-y> to chose the current highlight item 
" and close the selection list, same as other IDEs.
" CONFLICT with some plugins like tpope/Endwise
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"

" 取消自动换行
set nowrap

" 自动保存设置
au FocusLost * silent! up " vim 窗口失去焦点时保存
au BufLeave * silent! up " vim buffer 切换时自动保存


"【插件】NERDTree 配置
nmap <silent> <C-B> :NERDTreeToggle<CR>


"【插件】ctags 配置
let Tlist_Ctags_Cmd="/usr/local/bin/ctags"
 
"【插件】airline 配置
let g:airline#extensions#branch#enabled = 0
let g:airline#extensions#branch#use_vcscommand = 1
let g:airline#extensions#whitespace#enabled = 0
let g:airline_powerline_fonts = 1
let g:airline_theme = "molokai"
set laststatus=2
set encoding=utf-8
 
"【插件】tagbar 配置
nmap <silent> <C-N> :TagbarToggle<CR> " 打开关闭tagbar的快捷键
let g:tagbar_autofocus = 1 " 打开tagbar的时候,光标自动聚焦到tagbar上面
let g:tagbar_autoclose = 1 " 打按回车,跳到某个方法后,自动关闭tagbar

五、几个插件的简单使用及注意点

  1. YouCompleteMe,在用vundle安装完成的时候,需要进入

    1
    
    ~/.vim/bundle/YouCompleteMe/
    

    目录,执行一下 install.sh,编译另外的一些依赖

  2. Ack, 需要另外安装ack这个代码搜索工具,请使用

    1
    
    brew install ack
    

    安装,完成后,重启一下Vim,使用
    1
    
    :Ack 关键词
    

    来搜索代码,注意要切换到特定的工作目录再进行搜索,不然文件太多,会很慢的

  3. UltiSnips,这个在安装完成后,可以使用

    1
    
    :UltiSnipsEdit!
    

    来查看所有的snipet文件的位置,然后打开编辑即可

  4. vcscommand, 这个插件整合了SVN的各种操作,需要注意的一点是,VCSLog查看日志的时候,显示出来的日志无法正确显示中文,
    解决方案如下:

    1
    
    vim ~/.bash_profile
    

    添加
    1
    
    export LANG=zh_CN.UTF-8
    

    重新载入
    1
    
    source ~/.bash_profile
    
  5. marks,这个插件因为代码不在github上面,而是vimball的插件格式,所以需要另外安装

  6. tagbar,此插件需要安装ctags库,使用

    1
    
    brew install ctags
    

    安装,记得在vimrc里面绑定其下面的执行路径,具体路径请使用which ctags查看一下即可
    1
    
    let Tlist_Ctags_Cmd="/usr/local/bin/ctags"
    

安装完成后,记得到代码路径下执行

1
ctags -R

来生成ctags的文件,然后就可以在代码里面随心的使用:ctrl+[ 和 ctrl+o 方便的跳转到代码的定义了

我的Mac正版软件

使用盗版、使用正版是种态度
用了这么多年盗版,工作后也是时候支持一下正版了,当然还要感谢下琪老大的洗脑。动不动大几百上千的软件,还略略地有点肉疼,先从便宜的软件开始培养使用正版的习惯。赚更多的钱,买更多的正版软件,支持正版。

已购软件

  • Vitamin-R ($0.99 入手)
  • Timing ($9.99 入手)
  • Manico(¥1 入手)
  • One(限免入手)

已购游戏

  • Minecraft($26.95入手)
  • Valve Complete Pack - 2013($24.99)
  • FEZ($2.49入手)
  • Braid($3.99入手)

预购软件

  • Dash
  • 1Password

php扩展分页类

Laravel 4.2官方默认提供的分页类,虽然对bootstrap添加了支持,但是很大的情况下不够用,这时候就需要对Laravel的Pagination进行简单的扩展了。
下面步骤中一、二、五、为关键的步骤,三、四可以参考官方文档
在新建的CodingInk目录下,其实就可以用来放扩展vender目录下的一些第三方库的方法,因为采用一、四、五的步骤后,它就被larave自动加载了。

一、app目录添加新目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
app/
├── CodingInk
│   └── Presenters
│       └── GeneralPresenter.php
├── commands
├── config
├── controllers
├── database
│   ├── migrations
│   └── seeds
├── filters.php
├── lang
├── models
├── routes.php
├── start
│   ├── artisan.php
│   ├── global.php
│   └── local.php
├── storage
│   ├── cache
│   ├── logs
│   ├── meta
│   ├── sessions
│   └── views
├── tests
└── views

这里的CodingInk目录可以自由定义

php 常用扩展安装

环境搭建多了,各种扩展的安装,每次都上网查一遍,想想以后有安装扩展的步骤都整理到这篇文章好了。
imagick 扩展

这玩意需要两个东西,一个命令行工具,一个PHP扩展,PHP扩展调用前者提供的API,原理就这么简单

  1. ImageImgick 源码包下载及解压

    1
    2
    
    wget http://www.imagemagick.org/download/ImageMagick.tar.gz 
    tar -zxvf ImageMagick.tar.gz
    
  2. 编译安装

    1
    2
    3
    4
    
    cd ImageMagick-6.8.9-10/
    sudo ./configure --prefix=/usr/local/imagemagick
    sudo make
    sudo make install
    
  3. imagick 扩展源码包下载,下载及解压
    PHP 扩展源码包均在此网站上下载

    1
    2
    
    wget wget http://pecl.php.net/get/imagick-3.2.0RC1.tgz
    tar -zxvf imagick-3.2.0RC1.tgz
    
  4. 编译安装

    1
    2
    3
    4
    5
    
    cd imagick-3.2.0RC1
    sudo phpize
    sudo ./configure --with-php-config=/usr/local/php/bin/php-config --with-imagick=/usr/local/imagemagick/
    sudo make
    sudo make install
    
  5. 在php.ini 中添加

    1
    
    extension=imagick.so
    
  6. 为了更好的使用Imagick扩展提供的API,分享两个东西
    其一、可以在 http://www.phpimagick.com/ 这个网站上测试所有函数的效果,真的真的非常方便
    其二、使用intervention/image,看过源码,真心觉得作者封装的真好,配合Laraval相当舒服

  7. 稍微推荐扩展一下,PHP上可以使用的图片扩展还有graphicsmagick + Gmagick 这一组合的,目前 intervention/image 没有封装它。

mongodb 扩展

  1. mongo源码包下载及解压
    windows 版本下载地址:https://s3.amazonaws.com/drivers.mongodb.org/php/index.html
    稳定源码编译包:http://pecl.php.net/package/mongo 一般选用这个来做编译
    最新Github 源码:https://github.com/mongodb/mongo-php-driver

    1
    
    tar zxvf mongodb-mongodb-php-driver-<commit_id>.tar.gz
    
  2. 编译安装

    1
    2
    3
    4
    5
    
    cd mongodb-mongodb-php-driver-<commit_id>
    phpize
    ./configure
    make all
    sudo make install
    
  3. 在php.ini 中添加

    1
    
    extension=mongo.so
    

Mac key repeat 失效问题

key repeat 对应中文为 按键重复,此问题在最新的 10.10 Yosemite上会出现。主要是因为苹果修改了机制,关闭了按住一个按键自动重复此按键的特性。
可以使用下面的命令开启原先的效果:

1
2
3
4
5
开启按键重复
defaults write -g ApplePressAndHoldEnabled -bool false

关闭按键重复
defaults write -g ApplePressAndHoldEnabled -bool true

国内使用composer的正确姿势

前段时间写的一篇文章Laravel安装遇到的几个小坑, 提到了在国内composer极其的难用。

总结了下有下面几种解决方式
一、先在VPS用composer把Laravel给拖回来,本地你就别想用Composer正常下载Laravel回来了
二、使用全局代理,暂时木有折腾过在终端下怎么折腾,GUI可以使用proxifier将socks5代理转成全局代理
三、直接使用Laravel Homestead来开发,开发完,代码直接copy到线上运行
四、从Laravel-cn下载最新的完整包

今天说另外两种方式
一、使用http_proxy
参考Composer Proxy,Doc里面说的http_proxy很明显了,就是需要一个Http 代理,可以在网上找一些免费的HTTP Proxy,但是这种一般极其不稳定,所以我自己使用Squid搭建了简单的代理,这里的代理指的是正向代理而非反向代理

  1. 安装代理工具Squid

    1
    
    yum install squid
    
  2. 修改配置文件

    1
    
    sudo vi /etc/squid/squid.conf
    
  3. 删除所有默认配置添加下面几行

    1
    2
    3
    
    http_port 8888
    acl all src all
    http_access allow all
    
  4. 开启Squid服务

    1
    
    sudo /etc/init.d/squid start
    
  5. 配置你本地linux的http_proxy
    编辑 ~/.bash_profile 文件,将正面文件加在文章结尾

1
2
3
4
http_proxy=http://ip_address:port
https_proxy=http://ip_address:port
export no_proxy=localhost,127.0.0.1
export http_proxy

接着使用source命令重新加载 .bash_profile 文件,使上面http_proxy的配置生效
1
source ~/.bash_profile

接着就可以快乐的使用composer了,没错很快乐

  1. 【注意】上文的squid配置极其不安全,请使用完composer后,立即使用以下命令停掉你VPS上面的squid服务,防止端口被扫
    1
    
    sudo /etc/init.d/squid stop
    

二、国内composer镜像

具体文档请参考这里Composer 中国镜像
不知道是不是因为我是长城宽带的原因,试用了这个中国镜像,还是经常出现各种包下载不回来、timeout、JSON无法下载的问题。所以相对比较靠谱的还是自己搭建个代理来的方便快捷。

phpstorm远程调试

记录下phpstorm远程调试下使用方法

一、Xdebug 安装

使用命令可看服务端php的安装信息,其实就是phpinfo了

1
php -i

复制上面命令输出的东西到Tailored Installation Instructions页面中的输入框中,然后下载推荐的Xdebug版本
搞定上面一步后,提示我安装2.2.5版本的。

接着安装命令搞起来
1
2
3
4
5
wget http://xdebug.org/files/xdebug-2.2.5.tgz
tar -xvzf xdebug-2.2.5.tgz
cd xdebug-2.2.5
sudo ./configure --with-php-config=/usr/local/php-5.2.17/bin/php-config
sudo cp xdebug.so /usr/local/php-5.2.17/lib/php/extensions/no-debug-non-zts-20060613/

接着在php.ini中加入相关配置

1
2
[Xdebug]
zend_extension = /usr/local/php-5.2.17/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so

nginx缓存时间设置

来看一段nginx的配置

1
2
3
4
location ~ .*\.(js|css|png|jpg)?$
{
    expires      12h; # 设置缓存时间
}

主要作用就是起到告诉浏览器缓存图片的意思
接着来看Chrome请求的数据
浏览器请求头
Date与Expires刚好相差12个小时

再看Chrome显示的请求
请求数据

注意到Chrome显示的304 Not Modified 这个是nginx发回给Chrome的消息[只传了个header过来,不传body也就是图片数据],告诉此文件没有修改过,可以使用浏览器本地缓存过的图片。

Laravel安装遇到的几个小坑

一、代理问题
国内的网络环境对IT工作者来说,已经达到变态成度了,各种包无法下载,线路干扰,有几种方式来解决
一、先在VPS用composer把Laravel给拖回来,本地你就别想用Composer正常下载Laravel回来了
二、使用全局代理,暂时木有折腾过在终端下怎么折腾,GUI可以使用proxifier将socks5代理转成全局代理
三、直接使用Laravel Homestead来开发,开发完,代码直接copy到线上运行
四、从Laravel-cn下载最新的完整包

二、nginx配置
开发部署均是使用NG,外加Lnmp.org上面的集成环境,参考了Laravel Homestead上面的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
server
    {
        #监听端口
        listen 80;

        #域名
        server_name meitubar.com;

        #默认访问的文件
        index index.html index.htm index.php;

        #代码根目录
        root  /home/wwwroot/meitubar/public;

        charset utf-8;

        #匹配站点内的所有链接
        # 将http://meitubar.com/users 这样的请求全部转发到index.php/users 上面去,其实就是rewrite了
        location / {
            try_files \$uri \$uri/ /index.php?$query_string;
        }

        # try_files 及$uri 的具体含义参考: [HttpCoreModule](http://nginx.org/en/docs/http/ngx_http_core_module.html)

        location = /favicon.ico { access_log off; log_not_found off; } # 匹配favicon.ico时,关闭日志
        location = /robots.txt  { access_log off; log_not_found off; } # 同上

        # 不知道为什么我的Laravel如果木有设置下面的缓存时间的话,会直接404返回回来
        location ~ .*\.(js|css|png|jpg)?$
        {
            expires      12h; # 设置缓存时间
        }

        access_log off; # 关闭访问日志
        error_log  /var/log/nginx/meitubar-error.log error; #设置错误日志的位置

        error_page 404 /index.php; # 定义出错页面,出错时,直接跳转到首页

        sendfile off; # 关闭sendfile选项

        # 配置解析php文件的方式
        location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass  unix:/tmp/php-cgi.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
        }

        location ~ /\.ht {
            deny all;
        }
    }

三、app/Storage目录权限问题
参考这条issuesFix blank-screen error on unwritable storage dir
在Mac需要在Mac端设置权限,然后在通过SSH连接上服务器进行权限的设置

四、proc_open函数的开启
注释php.ini中正面的这行

1
disable_functions = passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket

当然有些函数在生产环境还是需要关的,开发环境就算了,一次性全部打开省不少事。

五、总结
以上4点都会导致Laravel空白页的问题,需要注意下, 如果发现空白页,还可以通过

1
php artisan tail

这条命令来查看哪里有出错

vagrant与parallels搞基

背景
因为一台电脑两个屏幕两套键鼠的实现方案,里面的实现在Mac下只有Parallels可以完美的实现一分二,
但是平时开发使用的都是vagrant+virtual box 这对好基友,但是有个很严重的问题是Parallels与Virtual Box不能同时开启,这个无解。所以想着干脆把开发
环境直接切换到Parallels下的虚拟机好了,IO神马的都上去了,一举多得。

parallels provider 安装

1
vagrant plugin install vagrant-parallels

添加新Box
此Box是针对Parallels的,不能在VB下使用,这点应该都能理解。

1
vagrant add parallels/centos-6.5

初始化与开机

1
2
vagrant init parallels/centos-6.5
vagrant up --provider=parallels

就此搞定,接着开搞Laravel + Composer…
细节的配置与Virtual Box对应的Vagrantfile不大一样,需要特殊指定。
具体参考文档参考: vagrant parallels provider

Vagrantfile配置样例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
  VAGRANTFILE_API_VERSION = "2"
 
  Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
     config.vm.box = "parallels/centos-6.5"
     config.vm.provider "parallels" do |v|
       v.name = "H1ac0k_Dev_Machine"
       v.memory = 1024
       v.cpus = 2
     end
 
     config.vm.provider "parallels" do |v, override|
       override.vm.synced_folder "/Users/machaismile/Documents/Dev", "/home/wwwroot", mount_options: ["share"]
     end
  end
 
  Vagrant.configure("2") do |config|
     config.vm.network "forwarded_port", guest: 80, host: 8080
  end

注意点
使用Parallels Desktop 10 可以支持端口转发,10以下的版本无法使用端口转发