| 2016.5.21 - 南京 | SublimeText |
目录
Ctrl + P:输入文件名,实时预览内容,回车打开,↑ ↓ 预览其他,有自动完成提示Ctrl + P:输入@+标记,实时跳到相应内容,可简写首字母组合,有自动完成提示Ctrl + P:输入#+字符,实时跳到相应内容,有自动完成提示Ctrl + P:输入:+行号,实时跳到相应行Ctrl + Shift + L,然后输入双引号,按End然后输入,,按Ctrl + J排放在一行,按Ctrl + L选择一行,Shift + ←去选换行符,按[加数组标识,按Home,回到行首,定义变量名称Ctrl + Shift + P调出这个板,输入模糊的记忆,就能调取你想设置的功能窗Shift + F11,再按一次退出该模式)Ctrl + Shift + P,输入vmenu购买(Purchase)
Sublime Text是一个收费闭源软件,可以在这里购买。
不过不购买Sublime Text也可以“正常”使用它,只是Sublime Text会时不时的弹出一个对话框提醒你购买,此外窗口处会有一个很屌丝很low逼的(UNREGISTERED)。(在高频操作下,一般20分钟提示一次,个人认为算是很厚道了)
| 默认配置:**Preferences | Settings - Default** |
| 自定义配置:**Preferences | Settings - User** |
{
"caret_style": "phase",
"default_encoding": "UTF-8",
"ensure_newline_at_eof_on_save": true,
"font_size": 12,
"highlight_line": true,
"tab_size": 2,
"translate_tabs_to_spaces": true,
"trim_trailing_white_space_on_save": true
}
保存位置:Packages/User/Preferences.sublime-settings
插件包管理器安装
快捷键Ctrl + `(Esc下面那个键) 或 **View |
Show Console**调出命令行,输入以下代码 |
import urllib.request,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d1514676163dafc88'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
按回车键,等待安装完成后重启Sublime Text
常用的插件有:
IMESupport:解决输入法不跟随的问题
ConvertToUTF8:解决中文乱码问题
Emmet:html快速构建工具
Bracket Highlighter:括号对高亮
插件安装方法:
打开命令板,快捷键Ctrl + Shift + P 或 **Tools |
Command Palette** |
输入pci(全称是Package Control: Install Package),回车
待输入框再次出现后输入 Emmet 找到Emmet插件后回车进行安装,待左下角的跑马灯跑完之后说明安装成功了
Ctrl + NCtrl + Shift + P -> ss(Set Syntax) + [语法]Ctrl + Shift + '(Enter左边那个键)Ctrl + D,重复执行追加选择下一个相同词,跳过可按Ctrl + K,或者按 Alt + F3 选择全部相同的词Ctrl + Shift + ← / →Ctrl + Shift + DCtrl + L,重复执行追加选择下一行Ctrl + EnterCtrl + Shift + EnterCtrl + Shift + ↑ / ↓Ctrl + [ / ]Ctrl + Shift + VCtrl + XAlt + - / Alt + Shift + -Ctrl + Tab / Ctrl + Shift + TabCtrl + JCtrl + K + BackspaceCtrl + KCtrl + MCtrl + Shift + M ,一般和上一个命令结合使用Ctrl + 点选多处,可以进行多位置编辑自定义Snippet代码片段 Tools | New Snippet…
<snippet>
<content>
<![CDATA[
Hello, ${1:this} is a ${2:snippet}.
]]>
</content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<!-- <tabTrigger>hello</tabTrigger> -->
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<!-- <scope>source.python</scope> -->
</snippet>
这是一个自带的代码模板,需要做一些修改,比如我们输入p然后按tab后生成<p></p>,如果我们要输入p然后生成
<p>
|
</p>
这样的效果呢,我们改一下代码
<snippet>
<content>
<![CDATA[
<p>
$1
</p>
]]>
</content>
<tabTrigger>p</tabTrigger>
<scope>text.html</scope>
</snippet>
保存为html-p.sublime-snippet,然后我们Ctrl + N,然后输入SSHTML设置一下html语法,输入p按tab,然后光标就停留在了$1位置了,$1是一个占位符,它标识了光标出现的位置,但是如果我们的模板很长篇大论,我们需要快速切换到模板需要手动输入的位置时,怎么办呢,对了,就是可以用$n来为我们服务,比如我们修改p模板如下
<snippet>
<content>
<![CDATA[
<p>
$1
</p>
<p>
$2
</p>
<p>
$3
</p>
]]>
</content>
<tabTrigger>p</tabTrigger>
<scope>text.html</scope>
</snippet>
然后我们Ctrl + N,然后输入SSHTML设置一下html语法,输入p按tab,然后光标就停留在了$1位置了,输入div1,然后按tab,光标就跑到$2位置了,输入div2,按tab,光标就到$3位置了,非常方便,如果我们要联动更改呢,很简单,只要在不同的位置使用相同的$n占位符即可,比如下面的代码
<snippet>
<content>
<![CDATA[
<!DOCTYPE html>
<html>
<head>
<title>$1</title>
</head>
<body>
<p>$1</p>
</body>
</html>
]]>
</content>
<tabTrigger>html</tabTrigger>
<scope>text.html</scope>
</snippet>
保存为html-doctype.sublime-snippet,然后我们Ctrl + N,然后输入SSHTML设置一下html语法,输入html按tab,然后光标就在<title></title>和<p></p>之间同时闪动了,这就达到联动修改的效果了。

我们的模板代码是可以加入默认值的,格式很简单${1:Placeholder},而且还可以嵌套哦${1:Nested ${2:Placeholder}}
自定义插件 Tools | New Plugin…
import sublime, sublime_plugin
class ExampleCommand(sublime_plugin.TextCommand):
def run(self, edit):
self.view.insert(edit, 0, "Hello, World!")
这是自动生成的模板,假如我们现在要写一个生成日期的插件,可以修改为如下代码
import sublime, sublime_plugin
from datetime import datetime
import time
class TimestampCommand(sublime_plugin.EventListener):
"""Expand `isoD`, `now`, `datetime`, `utcnow`, `utcdatetime`,
`date` and `time`
"""
def on_query_completions(self, view, prefix, locations):
if prefix in ('isoD', 'now', 'datetime'):
val = datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
elif prefix in ('utcnow', 'utcdatetime'):
val = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S')
elif prefix == 'date':
val = datetime.now().strftime("%y-%m-%d")
elif prefix == 'time':
val = str(int(time.time()))
else:
val = None
return [(prefix, prefix, val)] if val else []
然后我们保存为timestamp.py,试试效果

然而,如果并不想要YYYY-mm-dd效果呢,而是想要YYYY-(+)m-(+)d效果,查了一下文档,发现这个语法%-m和%-d可以去掉填充的0,但是在win7上并没有效果,于是继续查,最后有一法可用
val = '{d.year}-{d.month}-{d.day}'.format(d=datetime.now())

新建文件保存时自动选到前一个文件所在目录
参考这里,代码如下
# NewFileAtCurrentFolder
import sublime_plugin
import os.path
class NewFileListener(sublime_plugin.EventListener):
def on_new_async(self, view):
if not view.window().active_view():
print("NF: no view")
return
newView = view.window().active_view()
index = view.window().views().index(newView)
lastView = view.window().views()[index - 1]
if not lastView:
print("NF: no lastView")
return
fileName = lastView.file_name()
if not fileName:
print("NF: no fileName")
return
basePath = os.path.dirname(fileName)
if not basePath:
print("NF: no basePath")
return
print("NF: "+basePath)
newView.settings().set('default_dir', basePath)
实时打印当前操作的命令,对于调试快捷键相当有用,启用方法:
Ctrl + `(Esc下面那个键)
然后输入
sublime.log_commands(True)
回车进行启动监控
自动修改模板最后更新时间
---
layout: post
title: title
categories: svn
lastUpdated:
---
我现在想让lastUpdated自动更新时间,思路是这样的: 我现在的文件命名规则是YYYY-mm-dd-title.md,那么就要获取这个文件名中的日期作为创建日期(你也可以建一个created:这样的标题保存创建日期),然后和今天的日期比较,如果不相等,则在保存之前自动修改lastUpdated:
代码是这样的
import sublime
import sublime_plugin
from datetime import datetime
class AutoUpdateLastUpdatedCommand(sublime_plugin.TextCommand):
def run(self, edit):
LASTUPDATED_PATTERN = 'lastUpdated:( )?(\\d+)?(.)?(\\d+)?'
fileName = self.view.file_name()
if not fileName:
print('Thers isn\'t a fileName')
if fileName:
# get create date from file name like this C:\project\simple\2016-05-23-title.md
created = fileName[fileName.rfind('\\')+1:fileName.rfind('\\')+11]
current = datetime.now().strftime("%Y-%m-%d")
if not created == current:
self.edit = edit
idx = self.view.find(LASTUPDATED_PATTERN, 1)
suffix = fileName[fileName.rfind('.'):]
# only change the files that
# contain 'lastUpdated:' and suffix is '.md(is not case sensitive)'
if idx and suffix.upper() == '.MD':
today = '{d.month}.{d.day}'.format(d=datetime.now())
replacement = 'lastUpdated: %s' % today
self.view.replace(edit, idx, replacement)
self.view.end_edit (edit)
class AutoUpdateLastUpdatedListener(sublime_plugin.EventListener):
def on_pre_save(self, view):
view.run_command('auto_update_last_updated')
上面的python代码涉及到的语法
'lastUpdated: %s' % today 这里的s是占位符,会用today填充如果使用import datetime会报异常
AttributeError: 'module' object has no attribute 'now'
要修改为from datetime import datetime,这是版本问题导致
更新列表:
| CMD文件夹内新建一个cmd.py文件(也可以使用**Tools | New Plugin…**),代码如下 |
python
import os, sublime_plugin
class CmdCommand(sublime_plugin.TextCommand):
def run(self, edit):
file_name=self.view.file_name()
path=file_name.split("\\")
current_driver=path[0]
path.pop()
current_directory="\\".join(path)
command= "cd "+current_directory+" & "+current_driver+" & start cmd"
os.system(command)
再建一个Context.sublime-menu文件,内容如下
[
{ "command": "cmd" }
]
现在你可以在文件上右键看到cmd命令了,你可以绑定快捷键Preferences -> Key Bindings - User
{ "keys": ["c", "m", "d"], "command": "cmd"}
这样只要在打开的文件上输入cmd就可以自动打开命令行了
参考文章: