XCode8原始碼編輯器拓展開發

2021-09-17 06:10:14 字數 3364 閱讀 5347

xcode8起,xcode不在支援外掛程式,alcatraz不能再使用了。蘋果提供了xcodekit原始碼編輯器拓展,使用它開發出xcode拓展來代替以前的外掛程式。

環境

macos 10.12

xcode 8.2.1

新建工程

新建乙個"xcode source editor extension"的target,命名為mycommentext

注意:如果彈出詢問是否啟用scheme提示,選擇啟用

編輯scheme

之後執行這個拓展target就會出現灰色xcode,這個就是可用測試我們工具的執行例項。

修改命令

mycommentext中info.plist修改xcsourceeditorcommandidentifier, xcsourceeditorcommandname內容。這個是命名選單裡有我們的命令。

執行檢視前,需要新增證書。signing裡使用自動管理證書。mycomment,mycommentext都需要新增。

點執行後,隨便選乙個工程開啟,開乙個原始檔檢視

新增**實現我們的功能

在我們建立的工程裡有兩個swift檔案,sourceeditorextension.swift, sourceeditorcommand.swift。前者可以用來自定義命令,而命令在後者裡實現。通過繼承xcsourceeditorcommand,xcode在呼叫這個命令時將會執行perform方法。我們可以在perform裡實現我們要的功能。下面引用了xcodeccomment的**。(稍微修改了一下它的小問題。)

// sourceeditorcommand.swift

import foundation

import xcodekit

enum commentstatus

class sourceeditorcommand: nsobject, xcsourceeditorcommand

}} else }}

completionhandler(nil)

}func handle(range: xcsourcetextrange, inbuffer buffer: xcsourcetextbuffer) -> bool

return false

}func text(inrange textrange: xcsourcetextrange, inbuffer buffer: xcsourcetextbuffer) -> string

var text = ""

for aline in textrange.start.line...textrange.end.line

}return text

}func position(_ i: xcsourcetextposition, offsetby: int, inbuffer buffer: xcsourcetextbuffer) -> xcsourcetextposition else

aline += 1

alinecolumn = 0

} while aline < buffer.lines.count

return i

}func replace(position: xcsourcetextposition, length: int, with newelements: string, inbuffer buffer: xcsourcetextbuffer)

linetext.replacesubrange(start..= linetext.endindex

linetext.insert(contentsof: newelements.characters, at: start)

linetext.remove(at: linetext.index(before: linetext.endindex)) //remove end "\n"

buffer.lines[position.line] = linetext

}}extension string catch

return nil

}var isunpaircommented: bool }}

return false

}var commentstatus: commentstatus

if isunpaircommented

return .plain}}

perform中invocation.buffer可以獲取到我們執行命令時的緩衝文字資訊,包括選中的文字內容,每行內容等。buffer.sections是所選文字內容陣列,由xcsourcetextrange組成,它標示文字的位置區間,可以找到所選文字的起始位置。buffer.lines是緩衝文字的每行對應的內容,通過對它進行操作起到操作文字的作用。

再次執行**可以看到我們的命令生效了

安裝拓展

找到products在finder,將之拷貝到應用程式資料夾內,再重啟xcode就可以看到生效了。

遺留乙個問題

從我執行過這個程式後,xcode自身帶有的注釋功能就不可用了。但是如果我除錯run了本工程時,卻又可以用。停止除錯後又不能用了。應該是xcode的bug吧,暫時沒有找到方法解決。知道解決的告訴我一下,謝謝。

查考資料

更多拓展

xcode-extensions

Xcode8 模擬器截圖崩潰問題解決

從xcode7公升級到xcode8有一段時間了,也聽到一些小夥伴說使用xcode8時遇到的一些坑,比如 自動提示的外掛程式無法使用,模擬器截圖閃退的問題。這次說一下如何解決模擬器無法截圖的問題。看到這個一定有人有話要講,那我可以用snip mac os 自帶的系統快捷鍵 command shift ...

《Xcode實戰開發》 2 6節編輯器區域

2.6 編輯器區域 xcode實戰開發 編輯器區域 見圖2.16 動態地在適合於當前選擇的檔案 通過專案導航器或者跳轉欄選擇 的編輯器之間跳轉。這意味著,對於源 檔案,開發人員將會看到源 編輯器 source editor 對於介面構建器檔案,開發人員將看到介面編輯器 inte ce editor ...

Lesson8 vim 編輯器的使用

本文僅介紹部分常用操作,完整操作可參考 1.游標移動 ctrl f ctrl b page down page up 移動到改行最前面的字元 最後面的字元 gg g 移動到檔案第一行 最後一行 ngg ng 移動到第 n 行 2.查詢 word word 從前向後 從後向前查詢word 3.替換 格...