提示 CTRL Q: 在参数列表位置,显示可以输入的所有参数。 CTRL Q: 查看选中方法的文档字符串

阅读 CTRL -: 折叠当前代码 CTRL +: 展开当前代码 CTRL SHIFT -: 折叠所有代码 CTRL SHIFT +: 展开所有代码 CTRL SHIFT F7: 将当前单词在整个文件中高亮,F3移动到下一个,ESC取消高亮。 CTRL F11 | F11: 设置书签. SHIFT F11: 显示所有书签。 CTRL F12: 当一个文件中方法太多,要快速跳到某个方法时,可以用此快捷键打开LIST, 除了用上下箭选择外,还可以输入字母。

移动 ALT UP: 移到上一个方法 ALT DOWN: 移到下一个方法 CTRL B | CTRL 单击: 转到方法定义处 CTRL SHIFT UP: 将当前行上移一行 CTRL SHIFT UP: 将当前行下移一行

SHIFT ENTER: 在行中间执行时,智能跳到下一行。

注释 CTRL /: 注释、取消注释行

选择 ALT 左键: 列模式选择 CTRL W: 选中当前单词,继续按,选中它所属的行/IF/方法.

编辑 CTRL D: 未选中时,复制当前行到下一行,选中时复制粘贴选中部分。 CTRL J: 输入模板

SHIFT F6: 更改变量/方法名字

删除 CTRY Y: 删除当前行

调试 CTRL F8: 设置/取消断点

其它 CTRL E: 最近访问的文件列表 ESC: 焦点从其它窗口到编辑窗口 SHIFT ESC: 隐藏当前窗口,焦点到编辑窗口 F12: 焦点从编辑窗口到上一个使用窗口

编辑器右键,local history, show history: 显示本地修改记录

点击菜单:File>Settings>(IDE Settings) Keymap 修改工具栏的字体File->Setting->Appearance 如何设置代码自动换行 File->Setting->editor->use soft wrap in editor选项 显示行号 File->Setting->editor->Appearance-> show line numbers选项 phpStorm设置大括号和方法名在同一行显示 ; 大括号和方法名在同一行警告 File -> Settings -> code style -> PHP -> Wrapping and Braces -> Braces placement ->End of line. 在settings->Plugins里,Browse repositories按钮,搜索vim就会找到 IdeaVim插件该插件是控制phpstorm的keymap(也就是快捷键)的 phpstorm Settings->Editor->Highlight全部勾选 Editor tabs -> tab limit 16 Settings->Editor->colors&fonts ->font 设置字体大小 navigate/bookmark F11, 设置书签直接切换next bookmark

ctrl+j 插入活动代码提示 ctrl+alt+t 当前位置插入环绕代码 alt+insert 生成代码菜单 Shift + Enter 新一行 ctrl+q 查看代码注释 ctrl+d 复制当前行 ctrl+y 删除当前行 ctrl+alt+y 刷新项目缓存Synchronize 或文件夹右键Synchronize shift+F6 重命名 ctrl+shift+u 字母大小写转换 ctrl+f 查找 ctrl+r 替换 ctrl+shift+I 查看变量或方法定义源 ctrl+g 跳转行 ctrl+alt+F12 跳转至当前文件在磁盘上的位置 alt+down 查看下一个方法 alt+up 查看上一个方法 ctrl+alt+l 重新格式化代码 ctrl+shift+down statement向下移动 ctrl+shift+up statement向上移动 alt+shift+down line向下移动 alt+shift+up line向上移动 ctrl+/ 行注释 ctrl+shift+/ 块注释 Ctrl + Shift + Z redo Ctrl + Shift + F 区域查找 ctrl+shift+n 打开工程中的文件 ctrl+b 跳到变量申明处 ctrl+[] 匹配 {}[] ctrl+shift+]/[ 选中块代码 ctrl+x 剪切行 ctrl+shift+v 复制多个文本 alt+left/right 标签切换 ctrl+p 显示默认参数 ctrl + -/+ 可以折叠项目中的任何代码块

2014-11-5更:

单击右键,选择Column Selection Mode,或者按住ALT键选择块,有惊喜!

没错,这就是列选择功能,就好像把代码旋转了90度。

比如我同时选择每一行的最后,插入一个;,可以这样做:

  1. 想象目标区域是一个矩形,将鼠标放到其右上角
  2. 按住ALT键
  3. 垂直向下拖鼠标
  4. 松开ALT键

转自:http://hudeyong926.iteye.com/blog/1734768

今天使用win上的phpstrom发现不能检出svn服务器上的文件,折腾了一番才发现原来是svn设置问题。

解决办法:

进入settings

按照下图设置:

phpstorm svn 设置

这里我们指定了svn的命令行路径,CollabNet\Subversion Client是CollabNet出的svn客户端命令行工具,换成其他的也可以,只要路径指定正确就行。

附下载地址:

支持各种系统的svn

推荐visualsvn

昨天老高的博客受攻击了,本想着没啥流量就不用太在意,哎,防人之心不可无啊!

先装个DoS-Deflate试试看效果吧!

下载

wget http://www.inetbase.com/scripts/ddos/install.sh
sh install.sh

配置

vi /usr/local/ddos/ddos.conf
# show
##### Paths of the script and other files
PROGDIR="/usr/local/ddos"
PROG="/usr/local/ddos/ddos.sh"
IGNORE_IP_LIST="/usr/local/ddos/ignore.ip.list"
CRON="/etc/cron.d/ddos.cron"
APF="/etc/apf/apf"
IPT="/sbin/iptables"

##### frequency in minutes for running the script
##### Caution: Every time this setting is changed, run the script with --cron
#####          option so that the new frequency takes effect
FREQ=1

##### How many connections define a bad IP? Indicate that below.
NO_OF_CONNECTIONS=150

##### APF_BAN=1 (Make sure your APF version is atleast 0.96)
##### APF_BAN=0 (Uses iptables for banning ips instead of APF)
APF_BAN=0

##### KILL=0 (Bad IPs are'nt banned, good for interactive execution of script)
##### KILL=1 (Recommended setting)
KILL=1

##### An email is sent to the following address when an IP is banned.
##### Blank would suppress sending of mails
EMAIL_TO="root"

##### Number of seconds the banned ip should remain in blacklist.
BAN_PERIOD=600

使用

白名单路径:/usr/local/ddos/ignore.ip.list 配置文件路径:/usr/local/ddos/ddos.conf

卸载

wget http://www.inetbase.com/scripts/ddos/uninstall.ddos
sh ./uninstall.ddos

上一节

这篇我们就讲讲首页的业务逻辑,首先我们看看路由。

[index] => Array
        (
            [url] => /
            [widget] => Widget_Archive
            [action] => render
            [regx] => |^[/]?$|
            [format] => /
            [params] => Array
                (
                )

        )

由路由表中的正则表达式我们能看出首页的URL为https://blog.phpgao.com/http://www.phpgao.com,并且不接受任何参数。

下面我们找到了Widget_Archive类,让我们先看看这个类的继承关系(其中Typecho_WidgetWidget_Abstract为抽象类):

inherit.png

由上一节我们可以得到结论,当路由表匹配到/,会实例化Widget_Archive类,他位于var/Widget/Archive.php,其方法为render。

下面我们一步步跟进,看看到底发生了些什么?

再深入之前,我们需要有一些基本的概念,在此需要讲清楚,便于理解typecho的设计模式:

  • 基类Typecho_Widget

该类位于var/Typecho/Widget.php,是var/Widget文件夹下所有类的基类,也就是说,几乎所有与业务有关的功能,就是继承此类。

纵观此类,方法不是很多,老高在此挑几个重要的讲解:


    /**
     * 获取对象插件句柄
     * 此方法为插件的实现提供了快捷的语法
     */
    public function pluginHandle($handle = NULL)
    {
        return Typecho_Plugin::factory(empty($handle) ? get_class($this) : $handle);
    }
    
    /**
     * 将类本身赋值
     * 模板中很常见,将自己复制给某一个变量,在调用next()方法循环输出
     */
    public function to(&$variable)
    {
        return $variable = $this;
    }
    
    /**
     * 将每一行的值压入堆栈
     * 把数据放到自己的'肚子'里
     */
    public function push(array $value)
    {
        //将行数据按顺序置位
        $this->row = $value;
        $this->length ++;

        $this->stack[] = $value;
        return $value;
    }
    
    
    /**
     * 返回堆栈每一行的值
     * 有点像从数据库中循环读取结果集
     * 与push相对应,值得大家参考
     */
    public function next()
    {
        if ($this->stack) {
            $this->row = @$this->stack[key($this->stack)];
            next($this->stack);
            $this->sequence ++;
        }

        if (!$this->row) {
            reset($this->stack);
            if ($this->stack) {
                $this->row = $this->stack[key($this->stack)];
            }
            
            $this->sequence = 0;
            return false;
        }

        return $this->row;
    }
    
    # 魔术方法,当调用一个不存在的方法时触发,输出当前$this->name的属性值。
    public function __call($name, $args)
    
    # 魔术方法,当获取不存在的属性时,首先会在$this->row中寻找,如果未找到,则调用___name()方法,并将结果返回,如果还是不存在,就以name为挂载点,触发插件事件,并返回结果。
    
    public function __get($name)
    public function __set($name, $value)

码字不易,转载请注明出处。

上一节

上次我们讲到了系统完成了初始化,这一篇我们会更加深入typecho,同时会介绍typecho的插件机制。

插件点

热心的读者肯定会问,什么是插件点?当然你会不知道,因为这个名词是老高想出来的ಠ౪ಠ,本次要讲的插件机制的基础知识可以参考我的另一片博文thinkphp钩子的实现钩子这个词比较粗俗,其实高大上的叫法就是插件,而老高自创的插件点就是事件的意思。

index.php中Typecho_Plugin::factory('index.php')->begin(),其实就是通知挂载到'index.php'这个事件的插件可以执行了。

具体流程如下:

Typecho_Plugin::factory('index.php')返回了Typecho_Plugin的实例,构造函数中确定了唯一的句柄,即'index.php',紧接着执行了该实例的begin()方法,由于该方法不存在,所以调用了魔术方法__call,最后由__call方法执行所有在这个插件点挂载的插件。

__call方法源代码:

    public function __call($component, $args)
    {
        $component = $this->_handle . ':' . $component;
        $last = count($args);
        $args[$last] = $last > 0 ? $args[0] : false;
    
        if (isset(self::$_plugins['handles'][$component])) {
            $args[$last] = NULL;
            $this->_signal = true;
            foreach (self::$_plugins['handles'][$component] as $callback) {
                $args[$last] = call_user_func_array($callback, $args);
            }
        }
    
        return $args[$last];
    }

关键点:

  • __call是可以带参数的
  • $callback是二位数组,一个类名,一个方法名
  • 在该类init方法中,activated和handles是分开保存的,因为activated以插件名做键名,而handles以插件点为键,目的不同
  • 插件的关联信息保存在数据库中typecho_options表中的plugins
  • 需要禁用再启用才能使修改后的插件生效

当完成了第一个插件点的挂载后,程序开始路由分发。

下一节

码字不易,转载请注明出处。