关于如何挑选云存储的一点想法

在13年的时候, 写过一篇博文–关于数据备份. 里面讲到了我悲惨的数据丢失和找回的经历, 也说了一些对数据备份的方案. 关于云备份, 只是大致的说了点.

就在今天, 先是群里面有人发了张照片, 说金山快盘要关闭了

kuaipan-down

一开始是有点不相信的, 因为我从快盘刚出现的时候, 基本就开始使用了, 看着它一个平台一个平台的支持, 性能也是一天天的好, 给的空间也是一天天的大. 中间自己还提过不少的反馈. 而且是金山公司的. 怎么可能突然就要关闭了.

kuaipan-storage

然后就访问官网, 还真是要关闭了, 而且所属公司, 也不知道什么时候变成迅雷了…

对数据的分级

所以我现在就得重新考虑我这几十个G的数据的何去何从了. 也算是来一次”重构”吧.

首先, 就得对数据做一个划分, 不能再跟以前一样, 所有的数据都是大杂烩的放一起了, 存储是要钱的(后面会说到选择收费的云存储)

按隐私,重要性,可维护性,体积来划分:

  • 很隐私的文件: 不能被他人看到, 也不能被政府等第三方随意抽查
  • 比较隐私的文件: 可以接受被第三方做安全和和合法性的检查, 但是不能被抓取和利用文件中的内容. 比如一些工作文件,系统备份
  • 不是隐私文件: 虽然不是隐私文件, 但是也想能够收集起来, 方便查阅
  • 很重要的文件: 绝对不能丢失
  • 比较重要的文件: 平时收集的一些网上的文档和程序. 丢失很可惜, 但是也是可以再次收集的
  • 方便维护的文件: 数量相对比较少, 而且划分的维度不多. 比如手机照片, 基本一个文件夹, 可劲的塞进去都行
  • 不方便维护的文件: 比如媳妇做设计收集的图片和psd, 各种分类各种划分, 人工维护不方便. 还有系统的备份, 手机的备份
  • 大文件: 体积在200M以及往上的文件 软件和视频
  • 中等文件: 1M到20M 多是音乐和图片
  • 小文件: 个人文档, 代码等等

按范围分: 个人文件和公司文件.

按类型分: 图片, 文档, 软件, 字体, 音乐, 视频, 备份, 代码

这些划分不是独立的, 四个维度可以综合的来描述某一类文件.

云存储的分级

云存储的公司很多, 需要一个好的筛选维度去进行划分, 这样才好按照自己的需要进行选择.

按隐私, 持久, 价格和便捷性来划分:

  • 隐私程度: 存储的内容不会被云存储公司自身或者政府翻阅的可能性 国外的大于国内的 要翻墙的大于不要翻墙的
  • 持久: 这个云存储能保证有效的时间, 像这次金山快盘的突然关闭, 来几次会让人崩溃, 所以要挑选能长久有效的云存储. 一般来说, 收费的大于免费的, 价格高的大于价格低的
  • 价格: 今天看了下. Dropbox(€9.99/月 1TB) > GoogleDrive ($1.99/月 100GB) > OneDrive(¥15/月 50GB) ~ 坚果云(30GB起 增量1GB/月 不封顶 ¥16.66/月) > 百度云盘(免费, 存储按T算, 基本算不封顶) = 微云(免费, 存储按T算, 基本算不封顶) = 360云盘(免费, 存储按T算, 基本算不封顶)
  • 便捷性: 速度,是否需要翻墙,对各个系统的支持,对文件的格式的支持. 这个基本上对系统的支持, 对文件格式的支持都差不多. 所以主要看速度和是不是需要翻墙. 个人感觉 OneDrive > 国内云 > Dropbox > GoogleDrive

最终的筛选

从以上的划分, 最后决定如下

  • 针对很隐私很重要的文件(手机的日常照片,视频; 个人的一些重要的有纪念意义的文档), 不论体积和数量, 放Dropbox, 尽量使用它的免费空间. 针对邮件, 邮件附件, 基于Google系列产品构建的文件, 使用GoogleDrive.
  • 针对比较隐私的文件. 对不方便维护的Mac系统备份, 采用自购的移动硬盘, 用Mac的TimeMachine. 对手机, 则使用iPhone的备份到Mac功能. 对工作文件, 比较重要, 往往不方便维护, 是小文件或者中文件, 比如设计用的字体, psd, 图片; 以前早起的没有版本系统的一些没有太大实际意义, 纪念意义更重的代码. 用OneDrive, 如果空间不够, 可以增加容量.
  • 针对比较随意的内容, 比如一些软件备份, 一些电影资源, 一些音乐(ape等高清资源或者一般的mp3) 就用百度云盘, 速度不错, 短期不会倒闭, 而且有算法能对重复内容做识别, 可以免上传.

希望通过这样的划分方式能比较方便又安全的进行个人数据的管理. 如果大家有更好的方案, 也期待分享交流.

一点小广告:

如果大家想用OneDrive而且没有注册过, 可以用这个链接https://onedrive.live.com?invref=031414c742a7d364&invscr=90 进行访问, 这样我也能得到0.5G的奖励^_^

在阿里云CentOS6.7上安装docker

安装的时候,最好能参照此官方教程进行https://docs.docker.com/installation/centos/

升级内核

CentOS6.7的默认内核版本是2.6.32-431.23.3.el6.x86_64 可以通过uname -r命令查看

而docker要求的内核是至少3.10往上

可以参考此篇文章来进行内核升级使用yum快速升级CentOS 6.5内核到 3.10.28

虽然说的是CentOS6.5 但是也同样适用于CentOS6.7

升级完毕之后,重启电脑,执行uname -r命令,确定内核已经正确切换为3.10的

安装docker

安装比较简单

先使用 sudo yum update 来确保所有包是最新的

然后使用官方的curl -sSL https://get.docker.com/ | sh 进行docker的安装

启用和配置docker

如果你的运气不错的话,执行sudo service docker start就可以顺利启动docker。

尝试着跑一个hello-world的image,sudo docker run hello-world。如果一切正常。那后面就不需要看。

很不幸,看到这块的都是有问题了。

问题和解决方法

内网IP被占

如果执行docker -d看到的错误类似如下

INFO[0000] Listening for HTTP on unix (/var/run/docker.sock)
INFO[0000] [graphdriver] using prior storage driver "devicemapper"
WARN[0000] Running modprobe bridge nf_nat failed with message: , error: exit status 1
FATA[0000] Error starting daemon: Error initializing network controller: Error creating default "bridge" network: can't find an address range for interface "docker0"

那可以尝试一下我的一些操作

参考了http://www.baijinping.com/pages/2015/07/19/zai-a-li-yun-shang-yun-xing-dockerfu-wu.htmlhttp://www.cnblogs.com/MicroTeam/p/see-docker-run-in-debian-with-aliyun-ecs.html

编辑网络配置文件 vim /etc/sysconfig/network-scripts/route-eth0

注释掉有172.16.0.0的一行

# 172.16.0.0/12 via 10.116.111.247 dev eth0

执行命令route del -net 172.16.0.0 netmask 255.240.0.0 删除掉已经加载的路由信息

然后执行 /etc/init.d/network restart 重启network服务

最后再次启动docker service start docker 成功!

无法限制docker内存

当然,如果还是很不幸的,又有问题,在启动的时候提示

WARNING: WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.

这是提示无法对docker进行内存限制。

可以修改/etc/grub.conf 在当前使用的内核的kernel项的最后加上cgroup_enable=memory swapaccount=1

reboot

然后 cat /proc/cmdline 就会发现,配置生效了

这下就真的没问题了。久违的hello, world

参考资料

关于javascript里面数组的sort方法

介绍

Array.sort([compareFunction])

对Array里面的元素进行升序排序

关于排序的规则

默认的排序

如果compareFunction没有提供的时候,默认把所有Array里面的元素转换为字符串,然后取第一个字符,比较它们的Unicode值,进行正序排序。

这个转为字符串再比较第一个字符的Unicode值,很关键,很多数字的比较,经常就是这样出错的。


[1,2,3].sort();  // ==> [1,2,3]  正确

[9, 80].sort();  // ==> [9, 80]  错误

[9, 80].sort();  // ==> [80, 9]  正确

上面例子中,数组[9, 80]进行sort的时候,先转为为字符串 “9”, “80”, 再比较第一个字符, “9”和”8″

根据这个比较结果进行排序,所以最后80会在9前面,而不是按照它们的数值大小进行排序的。

想自行测试的,可以看看这个demo(http://www.icondownloader.com/demo/sort-stable.html]

compareFunction的排序

进行sort的时候,如果compareFunction提供了,会往compareFunction传两个数组的元素(类似compareFunction(a, b))

取compareFunction的返回值,如果小于0,则表明a小于b;大于0,则a大于b

最后对结果进行升序排序,如果a小于b,则[a, b]; 如果a大于b 则[b, a]

这里有个技巧,在排序的时候,如果想实现降序排序,可以在compareFuction里面实现类似:return !(a-b);

sort stable

关于排序,有个stable的说法,也就是,排序完成之后,对于值相同的元素,在排序结束之后,能否保留其在排序之前的顺序。

sort stable

具体的概念可以参考维基百科https://en.wikipedia.org/wiki/Sorting_algorithm#Stability

目前的主流浏览器对stable的sort的支持情况如下:

Browser Sort is stable Sort is unstable
Firefox 8 all lengths
Safari 5.1.1 all lengths
Opera 11.52 all lengths
Internet Explorer 6, 7, 8 all lengths
Internet Explorer 9 all lengths
Android 2.3 Browser all lengths
Chrome 15 .. 17.0.942.0 length <= 10 length > 10

可以参考此网站,检测浏览器的sort情况http://ofb.net/~sethml/is-sort-stable.html

sort的效率

可以尝试着对compare function在执行的时候,进行一个计数。这样可以知道每次sort,总共执行了多少次compare function。

我这边写了个demo,有兴趣的可以在自己本机的各个浏览器上测试看看。http://www.icondownloader.com/demo/sort-compare-function-call-times.html

这边我贴出我自己Mac OSX Yosemite 10.10.4下的浏览器的运行结果

## chrome 版本 42.0.2311.135 (64-bit)
Array length is: 5 and sort call compare 7 times;
Array length is: 10 and sort call compare 23 times;
Array length is: 11 and sort call compare 22 times;
Array length is: 12 and sort call compare 19 times;
Array length is: 13 and sort call compare 27 times;
Array length is: 14 and sort call compare 25 times;
Array length is: 15 and sort call compare 24 times;
Array length is: 20 and sort call compare 29 times;
Array length is: 50 and sort call compare 80 times;
Array length is: 100 and sort call compare 206 times;
Array length is: 1000 and sort call compare 1996 times;
Array length is: 10000 and sort call compare 20206 times;

## Safari 版本 8.0.7 (10600.7.7)
Array length is: 5 and sort call compare 8 times;
Array length is: 10 and sort call compare 23 times;
Array length is: 11 and sort call compare 28 times;
Array length is: 12 and sort call compare 31 times;
Array length is: 13 and sort call compare 35 times;
Array length is: 14 and sort call compare 40 times;
Array length is: 15 and sort call compare 44 times;
Array length is: 20 and sort call compare 65 times;
Array length is: 50 and sort call compare 232 times;
Array length is: 100 and sort call compare 568 times;
Array length is: 1000 and sort call compare 8996 times;
Array length is: 10000 and sort call compare 123583 times;

## Firefox (Developer Edition) 40.0a2 (2015-05-29)
Array length is: 5 and sort call compare 6 times;
Array length is: 10 and sort call compare 26 times;
Array length is: 11 and sort call compare 24 times;
Array length is: 12 and sort call compare 33 times;
Array length is: 13 and sort call compare 48 times;
Array length is: 14 and sort call compare 48 times;
Array length is: 15 and sort call compare 37 times;
Array length is: 20 and sort call compare 70 times;
Array length is: 50 and sort call compare 245 times;
Array length is: 100 and sort call compare 574 times;
Array length is: 1000 and sort call compare 8600 times;
Array length is: 10000 and sort call compare 114046 times;

从上面的数据可以看出两个结论:

  1. chrome的执行效率明显高于Safari和Firefox。但是chrome的sort是unstable的,而Safari和Firefox是stable的。是不是可以认为,因为chrome不需要考虑stable,所以提高了执行效率。

  2. 可以看出随着数组长度的增加,比较的次数是指数增加的

用map来提高提高sort的性能

从上面的结论2可以知道,在数组长度很长的时候,compareFunction的调用次数是很多的,这个时候,提高compareFunction的效率就很有必要性了。

现在咱们构建一个数组

var arr = [],
    arrLen = 1000,
    i = 0;

function makeWord(){
    var word = [],
        words = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'],
        wordsLength = words.length,
        arrMinLen = 3,
        arrLen = arrMinLen + Math.floor( Math.random()*9 ),

        i = 0;

    for (i = 0; i < arrLen; i++){
        word.push( words[Math.floor( Math.random()*wordsLength )] );
    }

    return word.join('');
}

for (i = 0; i < arrLen; i++) {
    arr.push( makeWord() );
}

然后比较一下它们小写字母状态下的排序

// 未优化
arr.sort(function(a, b){
    return +(a.toLowerCase() > b.toLowerCase()) || +(a.toLowerCase() === b.toLowerCase())-1;
});

// 优化后

// 用一个临时数组来保存位置和计算后的数值
var mapped = list.map(function(el, i) {
  return { index: i, value: el.toLowerCase() };
})

// 排序这个已经计算后的临时数组
mapped.sort(function(a, b) {
  return +(a.value > b.value) || +(a.value === b.value) - 1;
});

// 根据位置信息 对应映射生成一个排序后的数组
var result = mapped.map(function(el){
  return list[el.index];
});
// 不支持map的时候的兼容方法

var tmpArr = [],
    result = [],
    i = 0,
    len = arr.length;

for (i = 0; i < len; i++) {
    tmpArr[i] = {index: i, value: arr[i].toLowerCase()};
}

tmpArr.sort(function(a, b) {
  return +(a.value > b.value) || +(a.value === b.value) - 1;
});

for (i = 0; i < len; i++) {
    result[i] = arr[tmpArr[i].index];
}

具体的执行效果可以看看jsperf里面的这个地址http://jsperf.com/arraysortperform

参考文章:
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Unicode
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#String_literals
+ http://ofb.net/~sethml/is-sort-stable.html
+ http://stackoverflow.com/questions/3026281/array-sort-sorting-stability-in-different-browsers

svn迁移到git

本文参考自:Git-与其他系统-迁移到-Git

也建议阅读之前,先看看此文章,本文主要是对里面方法的一个补充和完善,保证可用性

第一步:把之前svn的提交者的信息映射为git需要的

在本地的svn目录,执行以下命令:

svn log ^/ --xml | grep "^<author" | sort -u | perl -pe 's/<author>(.*?)</author>/$1 = /' > users.txt

显而易见,本方法要求主机上安装了grep,sort 和 perl.

最后得到的user.txt 是所有svn提交者的name。

在对应等号后面加上Email地址。

最终变成如下格式:

schacon = Scott Chacon 
selse = Someo Nelse 

第二步:使用svn2git来导入

在一个新的打算放置导入成功之后的git项目的目录(最后也把上一步的users.txt拷贝到此处)

前往github上面的svn2git项目,安装这个工具,能比较方便的进行svn到git的导入

执行以下命令:

svn2git svn://yourdomain.com/your/path/to/svn --username xingwang --verbose --authors users.txt

解释一下几个参数:
--username: 设定你在svn里面的用户名,方便执行svn co
--verbose: debug模式,能够了解svn2git执行了哪些命令,方便出问题的时候调试
--authors: 用来设定提交者信息,也就是上一步生成的users.txt

React入门实例教程读书笔记

这份读书笔记是看了阮一峰的《React 入门实例教程》之后撰写的,留作记录。需要看原文的可以点击前面的书名访问对应链接。

这篇文章的目的

  • 介绍react
  • 如何下载react
  • 如何安装react
  • 如何使用react

文章的组织架构

从易到难的开始介绍。

react在页面的部署

  1. 依赖的两个js
  2. jsx 模板的标签规范
  3. 模板的编译应该放到服务器完成

模板语法

  1. React.render() 转换模板为HTML并插入节点
  2. 允许HTML和javascript混写。
    1. 规则是:遇到HTML标签(以<开头)则视为HTML,遇到代码块(以{)开头,视为javascript
    2. HTML内容可以直接写在javascript变量里
    3. javascript变量可以直接插入到模板。如果变量是数组,则自动展开这个数组的所有成员

组件

组件介绍

  1. 用React.createClass来生成组件类
  2. createClass的传参对象,需要一个render方法,用来描述组件的渲染
  3. 组件类以大驼峰方式书写
  4. 组件类以模板的方式调用,写法可以有单标签和双标签两种
  5. 组件类以模板的方式调用,实际是实例化了产生了一个对象,以下简称为组件
  6. 组件的调用和HTML标签完全一致,能加入属性。属性的调用,可以通过组件类的实例在javascript中,以this.props.xxx的方式调用
  7. 组件的style属性设定的时候,期望的值是一个对象{opacity: 0.5, marginLeft: ‘1px’} 而不是一个字符串,最终的写法是{{opacity: 0.5, marginLeft: ‘1px’}} 外面一对大括号表明是javascript代码块,里面的一对大括号,表明是对象
  8. 冲突的属性名class和for 要对应改为className和htmlFor,因为class和for是javascript的保留字
  9. this.props的属性和组件HTML属性一一对应,但是this.props.children例外,它表示组件的子节点
  10. 在用双标签的方式调用组件的时候,标签之间的HTML即为组件的子节点,完全和原生HTML一致

组件的特性

  1. findDOMNode
    1. virtual DOM
    2. virtual DOM 通过 DOM diff算法映射到真实DOM上
    3. findDOMNode用于获取跟组件关联的真实DOM的节点
    4. 只有在virtual DOM插入文档之后才能起作用
  2. this.state
    1. 类似状态机的概念
    2. getInitialState方法来设定初始状态
    3. 通过用户互动修改状态,一般是对应的event function来setState
    4. render里面,根据不同的状态渲染出不同的UI
    5. setState自动调用render重绘UI
    6. 区分this.props和this.state: this.props类似常量,设定之后不改变;this.state是随着用户互动而变化的特性
    7. 表单内容的变化也是通过state来进行更新的

组件生命周期

  1. 三个状态
    1. Mounting 已插入真实DOM
    2. Updating 正在被重新渲染
    3. Unmounting 已移出真实DOM
  2. 每个状态提供两个回调函数,will在进入状态之前调用,did在进入状态之后调用
  3. 三个状态共计五种回调函数,书写方式component是前缀,will/did是行为,Mount/Update/Unmount是状态
    1. componentWillMount()
    2. componentDidMount()
    3. componentWillUpdate(object nextProps, object nextState)
    4. componentDidUpdate(object prevProps, object prevState)
    5. componentWillUnmount()   为什么没有componentDidUnmount() ?
  4. 特殊状态的回调
    1. componentWillReceiveProps(object nextProps) 已加载组件收到新参数
    2. shouldComponentUpdate(object nextProps, object nextState) 组件判断是否重新渲染时调用 不明白

结合其他库或者框架使用

  1. react没有任何依赖
  2. react只关注表现层
  3. 如果希望对组件的DOM进行操作,尽量在componentDidMount中进行,保证真实DOM已经存在

主旨

React是一个关注表现层,以组件来构建内容,以状态机来完成交互的UI改变的,可以在浏览器端和服务器端同时运行的前端框架。

Sublime Text的使用-推荐的包/插件

回到目录:Sublime Text的使用

DocBlockr

一个便捷的文档构建工具,能方便的给js文档本身,js函数/方法 进行详细的文档描述

触发的方式很简单,输入 /** 然后Enter,就会自动出一个格式化的模板,修改完一个,打Tab键,就可以自动去修改下一个

Emmet

这个是zen coding的后续升级维护版,进行HTML开发是必不可少的一大利器,通过简单的css选择器语法,能快速的构建出需要的HTML代码。当然还有很多别的很方便的使用方法,具体可以查看官方文档

HTML-CSS-JS Prettify

这是前端团队风格统一化比较方面的一个插件,能快速的针对html, css和js文件进行格式化

LESS

这个是less文件语法高亮的一个插件,对前端同学来说也是很有必要性的一个工具

Markdown Preview

这个是对写完的markdown文件,进行预览的一种工具,提供两个主题的预览或者保存。

Control+Shift+P的命令界面中输入markdown(前提是已经安装了该插件),就能看到相关的命令

markdown命令

其中preview in browser就是在浏览器中预览,save to html就是在当前md所在文件夹,以同样的文件名,保存一个生成的和预览效果一致的html文件

JSONLint

这个是一个JSON的语法检测工具,能在当前打开的json文件中标示出语法错误的地方

JSONLint

这个对平时我们用json写一些接口假数据的时候,比较方便

// and more …

Sublime Text的使用-Package Control

回到目录:Sublime Text的使用

Package Control

Package Control,是一个方便的管理Sublime Text插件的包管理器,几乎是必备的Sublime 工具

安装

从菜单 View – Show Console 或者 ctrl + ~ 快捷键,调出 console。将以下 Python 代码粘贴进去并 enter 执行,不出意外即完成安装。

Sublime Text 3

import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = 
sublime.installed_packages_path(); urllib.request.install_opener( 
urllib.request.build_opener( urllib.request.ProxyHandler()) ); 
open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 
'http://sublime.wbond.net/' + pf.replace(' ','%20')).read())

Sublime Text 2

import urllib2,os; pf='Package Control.sublime-package'; ipp = 
sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) 
else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler( 
))); open( os.path.join( ipp, pf), 'wb' ).write( urllib2.urlopen( 
'http://sublime.wbond.net/' +pf.replace( ' ','%20' )).read()); print( 'Please 
restart Sublime Text to finish installation')

使用

使用的时候使用快捷键 Ctrl + Shift + P (Windows) 或者 Command + Shift + P(Mac) 调用命令输入界面(注意,此界面非Package Control专有)

Package Control

在输入框里面,输入Package Control就能看到所有Package Control相关的命令

相关命令

Package Control: Install Package

一般输入install就能通过模糊匹配查找到

会列出Sublime Text官网上的所有包供浏览

能根据输入的内容进行模糊查找相关的包

点击需要的包,就能自动安装。

PS: 已经安装的包不会在此展示

搜索Less相关的包

Package Control: List Package

列出当前已经安装的包,在命令行里面输入list,也能模糊匹配到,不需要整个命令全部输入

也能支持模糊匹配相应安装的包

点击对应的包,会打开文件夹指向对应包的目录。

这个时候,可以看这个包里面的文件和相关说明(一般包的文件里面都会包含一个readme.md用来进行使用方面的相关说明)

Mac下JSHint包的文件内容

Package Control: Remove Package

删除安装的包

通过remove 也能快速模糊匹配到

会列出当前已经安装的包,点击选中的包,就能删除(慎重)

Sublime Text的使用-配置

回到目录:Sublime Text的使用

说明

通过修改Sublime Text的配置,能让Sublime Text使用起来更加便捷

配置分为两种:一个是Default,这个是默认配置,建议不要动,而是作为一个参考。另一个是User,这个才是建议用户去修改和搭配的配置。

配置的写法都是json,所以书写的时候一定要注意规范,比如字段名都是用双引号包裹。如果语法书写有错误,是没法起作用的,不过会有提示

配置说明

下面将列举一些常见的配置命令和对应说明:

  • font_size {Number} 设置字体大小的,在编辑界面通过Ctrl+鼠标滚轮 或者 Ctrl++/- 调整的字体大小也会对应的修改到User下的这个命令下,一般13、14、15都是比较合适的值,可以自行调配
  • highlight_line {Boolean} 是否高亮当前光标所在行
  • ignored_packages {Array} 要忽略的包 有些包,可能暂时不需要用但是又不想卸载,这个时候,可以选择忽略,使其不起作用,最常见的忽略就是vim包
  • translate_tabs_to_spaces {Boolean} 是否把制表符转换为空格 建议开启,因为制表符,每个编辑器设定的长度都不一样,而空格的长度都是一样的。这样能保证在不同平台,不同编辑器,不同开发人员的情况下,代码的格式和缩进都一样
  • trim_trailing_white_space_on_save {Boolean} 是否在保存的时候去掉多余的空格。最常见的情况就是有一个空行没有任何代码,但是这个空行里面有很多制表符或者空格。如果开启了,那么保存的时候,空行还是保留,但是行内的空白字符(制表符,空格等)会被清除掉
  • word_separators {String} 定义哪些字符可以分隔单词 这个在想双击选中某些单词的时候很有用。比如在前端开发中,class的定义是字母之间用连字符间隔。可是在Default配置里面,-是可以分隔单词的,这导致的结果就是我们双击class的时候,没法完整的选中整个class。解决的方法就是从Defult里面复制word_separators的值(这就是为什么不要动Default配置而是当做参考的原因之一),在User里面新建这个字段,然后把值里面的连字符去掉。
  • word_wrap {Boolean} 定义在输入的内容到达右边距的时候,是不换行继续输入还是会自动折行展示

推荐的一个初始配置


{
    "font_size": 15,
    "highlight_line": true,
    "ignored_packages":
    [
    ],
    "translate_tabs_to_spaces": true,
    "trim_trailing_white_space_on_save": true,
    "word_separators": "./\()"':,.;<>~!@#$%^&*|+=[]{}`~?",
    "word_wrap": true
}