Sublime Text進(jìn)階(二) API的使用:TextCommand

前言

在(一)中我們使用了 WindowCommand Class 里面的window.run_command去批量執(zhí)行了一堆命令,
在很長一段時(shí)間里都滿足了我的使用需求.比如批量預(yù)處理一些日志,預(yù)處理一些繁瑣但是工作內(nèi)容固定的任務(wù).
類似下面

import sublime
import sublime_plugin

class UsEditCommand(sublime_plugin.WindowCommand):
    def run(self, reverse=False):
        window = self.window
        window.run_command("show_panel", {"panel": "find"})#打開查找面板
        window.run_command("insert", {"characters": "[\(\)\{\}\$\^\-]"})#輸入字符串[\(\)\{\}\$\^\-]
        window.run_command("hide_panel",{"cancel":"true"})#關(guān)掉查找面板
        window.run_command("find_all", {"characters": "n"})#查找所有符合的內(nèi)容
        window.run_command("left_delete")#左刪除
#在Key Bindings 里面添加快捷鍵
#{ "keys": ["f5"], "command": "us_edit" }

上面代碼所做的工作其實(shí)是查找出所有 (){}$^- 這些符號刪掉,這里是輸入了一個(gè)正則表達(dá)式,而我們操作的時(shí)候,是需要先打開啟用正則表達(dá)式開關(guān)的,(因?yàn)闆]有打開找御、關(guān)閉正則表達(dá)式的command)如果沒有打開的話,其實(shí)是在查找符合的字符串然后刪掉的,也就不符合我們的場景需求,即沒有效果了.

此外使用 window.run_command 去做一個(gè)批處理的操作還有一些其他的缺陷

  • 只能按照固定命令執(zhí)行,無法添加邏輯判斷等,不能處理一些復(fù)雜的文字處理
  • 如果使用到查找功能,需要手工開啟/關(guān)閉正則表達(dá)式功能
  • 如果執(zhí)行了不是我們想要的效果,撤退需要撤退多次(類似于你自己操作了那么多步驟,所以撤退還是要按多次的)
  • 雖然有大部分command,但還是不足夠我們使用

此篇文章介紹一下Sublime Text API 里面的Sublime.view 和TextCommand,已經(jīng)如何使用view 來創(chuàng)建一些自定義的Command.

sublime.View

TextCommand里面的View提供了更多操縱視圖的方法,如內(nèi)容的新增斥废、修改决侈、替換和光標(biāo)的一些操作等.
那么如何使用view呢?我們先在User目錄下面先新建一個(gè)py文件

TestView.py

import sublime
import sublime_plugin
class TestViewCommand(sublime_plugin.TextCommand):
    def run(self,edit):
        view = self.view
        point =  view.sel()[0].begin()
        view.insert(edit,point,"hello Sublime Text")
#{ "keys": ["f5"], "command": "test_view" },

上面代碼的執(zhí)行效果是在你的當(dāng)前視圖的第一個(gè)光標(biāo)所在位置插入了 "hello Sublime Text" 內(nèi)容.觀察可以發(fā)現(xiàn)與上一章不一樣的是現(xiàn)在這里引用了TextCommand 替換了WindowCommand 且 run()里面添加多了一個(gè)edit參數(shù). edit 是TextCommand里面的一個(gè)對象,view里面對內(nèi)容操作的一些方法需要使用到TextCommand 的edit對象才可以編輯.

view相當(dāng)于我們獲取當(dāng)前所在的sublime的窗口的視圖,獲取了該視圖才能對里面的內(nèi)容做操作.

view一些常用的方法

    view.file_name()#獲取當(dāng)前視圖的文件名(包含文件路徑)
    view.run_command()#等價(jià)于window.run_command()
    view.substr(region)#獲取此region區(qū)域的內(nèi)容
    view.substr(point)#獲取此point區(qū)域的內(nèi)容
    view.insert(edit, point, string)#在此point上插入字符串string
    view.replace(edit, region, string)#替換region上的內(nèi)容為string
    view.sel()#獲取當(dāng)前光標(biāo)所在的region,返回region的數(shù)組Selection.(因?yàn)楣鈽?biāo)可以多選)
    view.line(point)#獲取此point的所在行的region
    view.find(pattern, start_point, <flags>)#查找符合正則表達(dá)式pattern的內(nèi)容所在的Region,從start_point開始查找,返回第一個(gè)符合的Region
    view.find_all(pattern, <flags>, <format>, <extractions>)#同上,返回所有符合的Region

解釋view里面參數(shù)的含義

point = x 表示一個(gè)整數(shù),表示一個(gè)位置,從文本開頭計(jì)算,第一個(gè)為0,一個(gè)任意字符占用一個(gè)位置
reigon =(x,y) 表示一個(gè)區(qū)域,兩個(gè)point指間的內(nèi)容,表示第x個(gè)字符到第y個(gè)字符指間的區(qū)域
selection = [(x,y),(x1,y1),(x2,y2)],表示一組區(qū)域,如在多行編輯的時(shí)候 view.sel()就返回一組region

如果對point,region,selection有不太理解的話
可以試試下面代碼自己動手操作試試輸出是什么,更容易理解

import sublime
import sublime_plugin
class HelloWorldCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        view = self.view
        selection = view.sel()
        if selection:
            print("selection = ",selection)#輸出Selection 對象 到console 面板
            for region in selection:
                print("region = ",region)#輸出region
                print("begin point = ",region.begin())#輸出region的第一個(gè)point

        str = view.substr(selection[0])#獲取第一個(gè)光標(biāo)選中的內(nèi)容
        print("str = ",str)
        #輸出當(dāng)前文件的路徑到光標(biāo)位置上
        path = view.file_name()#獲取文件名(包含路徑)
        point =  view.sel()[0].begin()#獲取當(dāng)前視圖第一個(gè)光標(biāo)region的第一個(gè)位置
        view.insert(edit,point,path)#在此point上輸出file_name
#{ "keys": ["f5"], "command": "hello_world" },

一些例子

有時(shí)候我們經(jīng)常需要獲取當(dāng)前文件目錄,那么可以使用下面代碼

import re
import sublime
import sublime_plugin
class GetPathCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        view = self.view
        def getpath():
            pattern = re.compile(r"\\[\w._-]+$")
            return re.sub(pattern, '', view.file_name())
        view.insert(edit,view.sel()[0].begin(),getpath())
#{ "keys": ["f5"], "command": "get_path" },
#改寫一下可以講路徑存到剪貼板,可以當(dāng)作練習(xí)
image
image

對選中的內(nèi)容中,替換為首字母大寫

import sublime
import sublime_plugin
class CamelCaseCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        view = self.view
        selection = view.sel()
        for region in selection:
            str = view.substr(region)
            str = str.title()
            view.replace(edit,region,str)
#{ "keys": ["f5"], "command": "camel_case" },
image
image

在多個(gè)光標(biāo)下輸入遞增數(shù)字

import sublime
import sublime_plugin
class MultiNumberCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        view = self.view
        selection = view.sel()
        for i in range(0,len(selection)):
            view.insert(edit,selection[i].begin(),str(i))
#{ "keys": ["f5"], "command": "multi_number" },
image
image

此篇文章需要有一定python的基礎(chǔ)知識,python的基礎(chǔ)語法也不會太難,花幾個(gè)小時(shí)基本上就可以學(xué)會,我本人也不是學(xué)python的.有興趣的小伙伴可以周末花個(gè)半天學(xué)學(xué)python的基礎(chǔ)語法,再研究一下sublime Text的API,就可以寫一些自己想要的command了.

如果有幫助,請幫忙點(diǎn)喜歡,謝謝逢防!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拴测,更是在濱河造成了極大的恐慌,老刑警劉巖府蛇,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件集索,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)抄谐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門渺鹦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛹含,你說我怎么就攤上這事毅厚。” “怎么了浦箱?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵吸耿,是天一觀的道長。 經(jīng)常有香客問我酷窥,道長咽安,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任蓬推,我火速辦了婚禮妆棒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沸伏。我一直安慰自己糕珊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布毅糟。 她就那樣靜靜地躺著红选,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姆另。 梳的紋絲不亂的頭發(fā)上喇肋,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機(jī)與錄音迹辐,去河邊找鬼蝶防。 笑死,一個(gè)胖子當(dāng)著我的面吹牛明吩,可吹牛的內(nèi)容都是我干的慧脱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贺喝,長吁一口氣:“原來是場噩夢啊……” “哼菱鸥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起躏鱼,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤氮采,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后染苛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹊漠,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡主到,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躯概。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片登钥。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖娶靡,靈堂內(nèi)的尸體忽然破棺而出牧牢,到底是詐尸還是另有隱情,我是刑警寧澤姿锭,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布塔鳍,位于F島的核電站,受9級特大地震影響呻此,放射性物質(zhì)發(fā)生泄漏轮纫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一焚鲜、第九天 我趴在偏房一處隱蔽的房頂上張望掌唾。 院中可真熱鬧,春花似錦忿磅、人聲如沸糯彬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叽粹,卻和暖如春览效,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虫几。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工锤灿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辆脸。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓但校,卻偏偏與公主長得像,于是被迫代替她去往敵國和親啡氢。 傳聞我的和親對象是個(gè)殘疾皇子状囱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容