鍍金池/ 教程/ C++/ 文本處理包
調(diào)試
初始文件
作用域設(shè)置、作用域和作用域描述符
在Atom中移動
在Atom背后
Atom中的包
為什么選擇Atom?
從Textmate中轉(zhuǎn)換
小結(jié)
新手入門
折疊
代碼段
Hacking Atom
基本的自定義
Atom中的序列化
文本處理包
字?jǐn)?shù)統(tǒng)計包
所需工具
維護(hù)你的包
Atom基礎(chǔ)
深入鍵表(keymap)
配置API
使用Atom
自動補(bǔ)全
面板
在Atom中寫作
文本選擇
創(chuàng)建主題
圖標(biāo)
小結(jié)
開發(fā)Node模塊
編輯和刪除文本
安裝Atom
通過服務(wù)和其它包交互
小結(jié)
編寫 spec
語法
Atom中的版本控制
查找和替換

文本處理包

在我們寫完第一個包之后,讓我們看一看我們能寫出來的其它包的例子。這一節(jié)會引導(dǎo)你創(chuàng)建一個簡單的命令來將選中的文字替換為字符畫(ascii art)。在你在單詞“cool”選中的時候運行我們的命令,它會被替換為:

                                     o888
    ooooooo     ooooooo     ooooooo   888
  888     888 888     888 888     888 888
  888         888     888 888     888 888
    88ooo888    88ooo88     88ooo88  o888o

這個例子應(yīng)該展示了如何在當(dāng)前的文本緩沖區(qū)做基本的文字操作,以及如何處理選擇。

最后的包在 https://github.com/atom/ascii-art 中查看。

基本的文字插入

首先按下cmd-shift-P來彈出命令面板。然后輸入“generate package”并且選擇“Package Generator: Generate Package”命令,就像我們在“包生成器”一節(jié)中做的那樣。輸入ascii-art作為包的名字。

現(xiàn)在讓我們編輯包中的文件,來讓我們的字符畫包做一些有意思的事情。由于這個包并不需要任何UI,我們可以把所有視圖相關(guān)的移除,所以可以放心刪除lib/ascii-art-view.coffeespec/ascii-art-view-spec.coffeestyles/。

接下來,打開lib/ascii-art.coffee并刪除所有視圖代碼,所以它看起來像這樣:

{CompositeDisposable} = require 'atom'

module.exports =
  subscriptions: null

  activate: ->
    @subscriptions = new CompositeDisposable
    @subscriptions.add atom.commands.add 'atom-workspace',
      'ascii-art:convert': => @convert()

  deactivate: ->
    @subscriptions.dispose()

  convert: ->
    console.log 'Convert text!'

創(chuàng)建命令

現(xiàn)在讓我們添加一個命令。強(qiáng)烈建議你為你的命令取一個命名空間,使用包名后面帶著一個:。所以你可以看到在代碼中,我們把命令叫做ascii-art:convert,并且當(dāng)它調(diào)用時會調(diào)用convert()方法。

到目前為止,它只會在控制臺中記錄。讓我們使它向文本緩沖區(qū)插入一些字符來開始。

convert: ->
  if editor = atom.workspace.getActiveTextEditor()
    editor.insertText('Hello, World!')

就像在“字?jǐn)?shù)統(tǒng)計”中那樣,我們使用atom.workspace.getActiveTextEditor()來獲取表示當(dāng)前活動編輯器的對象。如果convert()方法在沒有編輯器獲取焦點時調(diào)用,它會簡單地返回一個空白的字符串,所以我們可以跳過下一行。

接下來我們使用insertText()方法,向當(dāng)前的文本編輯器插入一個字符串。無論光標(biāo)當(dāng)前在編輯器的哪里,都會在光標(biāo)處插入文本。如果有文本被選中,會把選中文本替換成“Hello, World!”文本。

重新加載包

在我們能夠觸發(fā)ascii-art:convert之前,我們需要通過重新加載窗口,來加載我們的包的最新代碼。從命令面板或按下ctrl-alt-cmd-l來運行“Window: Reload”命令。

觸發(fā)命令

現(xiàn)在可以打開命令面板并搜索“Ascii Art: Convert”命令了。但是根本找不到。要修正它,打開package.json并找到activationCommands屬性?;顒用钔ㄟ^在命令不使用時延遲它們的加載,來加快Atom的啟動。所以把現(xiàn)有的命令移除,并在activationCommands中添加ascii-art:convert

"activationCommands": {
  "atom-workspace": "ascii-art:convert"
}

首先,通過命令面板中的“Window: Reload”命令重新加載窗口,現(xiàn)在你可以執(zhí)行“Ascii Art: Convert”命令了,它會輸出“Hello, World!”。

添加快捷鍵

現(xiàn)在我們來添加用于觸發(fā)“ascii-art:convert”命令的快捷鍵。打開keymaps/ascii-art.cson,添加一個鍵綁定來將ctrl-alt-a鏈接到ascii-art:convert命令上。由于你不需要預(yù)設(shè)的鍵綁定,你可以刪除它們。

完成之后它應(yīng)該像這樣:

'atom-text-editor':
  'ctrl-alt-a': 'ascii-art:convert'

現(xiàn)在重新加載窗口,并驗證快捷鍵是否工作。

添加字符畫

現(xiàn)在我們需要將被選字符轉(zhuǎn)換為字符畫。為了完成它我們使用npm中的figlet node模塊。打開package.json,添加figlet的最新版本到dependencies中:

"dependencies": {
  "figlet": "1.0.8"
}

保存文件之后從命令面板運行“Update Package Dependencies: Update”。這會自動安裝包的node模塊依賴,在這個例子中只有figlet。無論什么時候你更新了package.json文件中的dependencies字段,你都要需要運行“Update Package Dependencies: Update”命令。

如果由于某種原因沒有生效,你會看到“Failed to update package dependencies”這樣的消息,并且會找到一個你的目錄下有個新的npm-debug.log文件。這個文件會告訴你具體哪里有錯誤。

現(xiàn)在在lib/ascii-art.coffee中請求(require)figlet node模塊,并且將被選文本轉(zhuǎn)換成字符畫來代替插入“Hello, World!”。

convert: ->
  if editor = atom.workspace.getActiveTextEditor()
    selection = editor.getSelectedText()

    figlet = require 'figlet'
    font = "o8"
    figlet selection, {font: font}, (error, art) ->
      if error
        console.error(error)
      else
        editor.insertText("\n#{art}\n")

重新加載編輯器,選擇編輯器窗口中的一些文本,并按下ctrl-alt-a,取而代之的是,它會被替換成一個滑稽的字符畫版本。

在這個例子中,我們需要快速查看一些新的東西。首先是editor.getSelectedText(),像你猜的那樣,返回當(dāng)前選中的文本。

之后我們調(diào)用Figlet的代碼,來將它轉(zhuǎn)換成別的東西,并使用editor.insertText()用它替換當(dāng)前選中的文本。

小結(jié)

在這一節(jié)中,我們編寫了一個無UI的包,用于獲取選中文本并替換為處理過的版本。它可能會對創(chuàng)建文本提示和檢查工具有幫助。