自定义sublime text 3插件 --- php文件格式化

上次写了关于sublime text 3自定义插件的步骤, 只能说起到一个抛砖引玉的作用, 并不具备多少实际功能, 这次我将结合最近工作的需要, 介绍如何将php代码格式工具
php cs fixer 集成sublime
text 3中, 作为你的插件格式化php代码

首先我们需要安装 php cs fixer,
下载 php-cs-fixer.phar

wget http://get.sensiolabs.org/php-cs-fixer.phar -O php-cs-fixer
sudo mv php-cs-fixer.phar /usr/local/bin/phpcs
sudo chmod +x /usr/local/bin/phpcs

接下来验证一下是否安装成功:

phpcs

显示:

Usage:
  help [options] [--] [<command_name>]

则表明anything OK

说一下这个插件的目标:

  1. 保存文件时自动格式化php文件
  2. 组合键格式化php文件

首先需要一个sublime command,

class MikeCommand(sublime_plugin.TextCommand):
    def run(self, edit):

run 方法中, 调用 phpcs命令格式化php文件

class MikeCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        view = self.view;
        fileName = view.file_name();
        suffix =  os.path.splitext(fileName)[1][1:]
        if suffix == 'php':
            fix(fileName)

def fix(phpFile):
    if not os.path.exists(phpFile):
        return;
    command = 'phpcs fix ' + phpFile;
    os.system(command);

因为在keymap文件中配置过组合键:

[
    {
        "keys": [
            "ctrl+alt+k"
        ],
        "command": "mike"
    }
]

所以当我 使用 ctrl+alt+k 时代码便自动格式化

那么如何在自动保存是去执行响应的命令呢? sublime text 3 api 提供了EventListener, 因此我们定义class 继承自sublime_plugin.EventListener, 然后监听响应的事件即可:

class AutoAlign(sublime_plugin.EventListener):
    def on_post_save(self, view):
        fileName = view.file_name();
        suffix =  os.path.splitext(fileName)[1][1:]
        if suffix == 'php':
            fix(fileName)

关于更多事件类型, 请参考EventListener

到现在, 一开始的两个目标都已经实现了, 我们可以看一下效果:

没有代码风格的php文件:

<?php

function getSpecsFullPermutation($spces) {
$fullPermutation = fullPerm($spces);
foreach ($fullPermutation as $key => $value) {
        $ids = explode(',', $value);
    asort($ids);
        $fullPermutation[$key] = md5(implode(',', $ids));
    }
    return $fullPermutation;
}

ctrl+alt+kctrl+s后的文件:

<?php

function getSpecsFullPermutation($spces)
{
    $fullPermutation = fullPerm($spces);
    foreach ($fullPermutation as $key => $value) {
        $ids = explode(',', $value);
        asort($ids);
        $fullPermutation[$key] = md5(implode(',', $ids));
    }

    return $fullPermutation;
}

php-cs 默认是遵循 PSR-2 的编码规范的, 但是也可以通过指定参数设置代码风格

但是这里存在另外一个问题, 所有的执行都是在主线程里面, 那么整体就会很卡, 我们需要在这种计算提取到额外的线程里面.

class HandlerThread(threading.Thread):
    def __init__(self, view):
        self.view = view
        threading.Thread.__init__(self)

    def run(self):
        fileName = self.view.file_name();
        suffix =  os.path.splitext(fileName)[1][1:]
        if suffix == 'php':
            fix(fileName)

那么更改监听 ctrl+s 的实现方式:

class AutoAlign(sublime_plugin.EventListener):
    def on_post_save(self, view):
        thread = HandlerThread(view)
        thread.start()

因为sublime text 3的api是用pyhton 3写的, 所以我们的实现都是使用的python 3.
在使用 threading.Thread, os.path.splitext, os.system时要记得引入相应的package.

import os
import os.path
import threading

至此所有的工作皆已完成, 又可以愉快的写php了!

很多时候语言只是一种工具, 重要的还是想法,思路.
我们知道我们可以创造很多新奇的东西, 但是我们却不知道idea从何而来.
只有不断的积累学习, 眼界开阔之后, 你才会看到和想到更多.才能创造属于我们的价值~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容