Edit teks dengan lekukan

1

Saat mengedit teks dalam seleksi menggunakan Applescript di layanan Automator, apakah mungkin untuk menjaga lekukan asli sambil menambahkan spasi tab di depannya?

Alur Kerja dan Skrip Automator

tangkapan layar alur kerja automator

on run {input, parameters}
   if "/*" is in item 1 of input then
      set input to replace("/*", "", input as string)
      set input to replace("*/", "", input as string)
      set input to extract(2, 2, input)
      set input to indent(input, false)
      return input
   else
      set input to indent(input, true)
      set input to "/*" & return & (input as string) & return & "*/"
      return input as text
   end if
end run

on replace(searchString, editString, inputString)
   set previousDelimiters to AppleScript's text item delimiters
   set AppleScript's text item delimiters to searchString
   set stringItems to text items of inputString
   set AppleScript's text item delimiters to editString
   set outputString to stringItems as string
   set AppleScript's text item delimiters to previousDelimiters
   return outputString
end replace

on indent(input, incrementing)
   set spacing to tab
   set input to input's text items
   if not incrementing then
      set previousDelimiters to AppleScript's text item delimiters
      set AppleScript's text item delimiters to ""
      set output to replace(spacing, "", input as string)
      set AppleScript's text item delimiters to previousDelimiters
      return output
   else
      set previousDelimiters to AppleScript's text item delimiters
      set output to item 1 of input as text
      set AppleScript's text item delimiters to linefeed & spacing
      set output to spacing & (every paragraph of output) as string
      set AppleScript's text item delimiters to ""
      return output
   end if
end indent

on extract(startOffset, endOffset, input)
   set firstParagraph to (first paragraph of input)
   set lastParagraph to (last paragraph of input)
   set firstLine to length of firstParagraph
   set lastLine to length of lastParagraph
   set input to text (firstLine + startOffset) thru -(lastLine + endOffset) of input
   return input
end extract

Cuplikan berikut menunjukkan hasil yang diharapkan dan output saat ini menggunakan alur kerja dan skrip yang disebutkan di atas:

Input Sampel

let c1 = CLLocation(latitude: self.latitude, longitude: self.longitude)
let c2 = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)

Hasil yang diharapkan

/*
    let c1 = CLLocation(latitude: self.latitude, longitude: self.longitude)
    let c2 = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)
*/

Output Saat Ini

/*
 let c1 = CLLocation(latitude: self.latitude, longitude: self.longitude)
 let c2 = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)
 */
wshaheer
sumber
@wshaheer, dapatkah Anda menempelkan tautan ke tangkapan layar alur kerja Automator Anda ?
CJK
Anda perlu menambahkan contoh input output yang diharapkan untuk kode yang telah Anda presentasikan dan mengartikulasikan apa yang bisa dan tidak bekerja untuk Anda dan di mana. Lihatlah Cara membuat contoh Minimal, Lengkap, dan dapat diverifikasi , dan meskipun menunjuk ke situs SO, konsepnya masih berlaku di sini. Saya tidak akan membuang waktu untuk masalah yang tidak sepenuhnya diartikulasikan dan menunjukkan contoh input dan output yang diharapkan.
user3439894
@ user3439894, sesuai saran Anda, saya telah memperbarui posting. Beri tahu saya jika Anda membutuhkan klarifikasi lebih lanjut
wshaheer
The run handler memiliki if pernyataan dengan else cabang , sehingga Anda perlu untuk menunjukkan sampel input dan output yang diharapkan sampel untuk kedua cabang , bukan hanya else cabang .
user3439894
@ user3439894, if pernyataan memeriksa untuk melihat apakah teks sudah diformat, dan jika demikian maka kembali ke keadaan semula, yaitu uncommented
wshaheer

Jawaban:

1

Diperbarui untuk mencerminkan pertanyaan yang diperbarui bersama dengan komentar untuk mencapai tujuan mengubah komentar di Xcode.

Contoh kode AppleScript berikut , yang diperlihatkan lebih lanjut di bawah ini, yang digunakan dalam Layanan Automator diuji dalam macOS Sierra dan Xcode 8.3.3 dan berfungsi untuk mengomentari kode yang dipilih atau menghapus komentar kode yang dipilih , dengan cara pengkodean dalam contoh kode AppleScript .

Dengan kata lain, jika kode yang dipilih terlihat seperti:

void myDelay(float value) {
    NSDate *future = [NSDate dateWithTimeIntervalSinceNow:value];
    [NSThread sleepUntilDate:future];
}

Dan Layanan Automator dijalankan pada kode yang dipilih di atas, akan terlihat seperti:

/*
    void myDelay(float value) {
        NSDate *future = [NSDate dateWithTimeIntervalSinceNow:value];
        [NSThread sleepUntilDate:future];
    }
*/

Atau jika kode yang dipilih terlihat seperti:

/*
    void myDelay(float value) {
        NSDate *future = [NSDate dateWithTimeIntervalSinceNow:value];
        [NSThread sleepUntilDate:future];
    }
*/

Dan Layanan Automator dijalankan pada kode yang dipilih di atas, akan terlihat seperti:

void myDelay(float value) {
    NSDate *future = [NSDate dateWithTimeIntervalSinceNow:value];
    [NSThread sleepUntilDate:future];
}

Contoh AppleScript kode untuk digunakan dalam Run AppleScript tindakan dalam Automator layanan .

on run {input, parameters}
    set selectedText to item 1 of input as text
    set outputText to {}
    if selectedText contains "/*" then
        repeat with i from 2 to ((count paragraphs of selectedText) - 1)
            if (count characters of paragraph i of selectedText as text) is 1 then
                copy "" to end of outputText
            else
                copy (characters 2 thru -1 of paragraph i of selectedText as text) to end of outputText
            end if
        end repeat
    else
        copy "/*" to end of outputText
        repeat with i from 1 to (count paragraphs of selectedText)
            copy tab & paragraph i of selectedText to end of outputText
        end repeat
        copy "*/" to end of outputText
    end if
    set AppleScript's text item delimiters to {linefeed}
    set outputText to outputText as text
    set AppleScript's text item delimiters to {}
    return outputText
end run

Catatan:

Xcode (8.8.3 toh) tidak mendukung kode komentar blok bersarang , artinya jika Anda berkomentar beberapa kode dengan skrip ini dan kemudian memilih kode tambahan yang mencakup kode yang sebelumnya dikomentari oleh skrip ini, itu akan menimbulkan kesalahan saat menjalankan layanan. Anda dapat mengatasi ini dengan mengubah:

if selectedText contains "/*" then

Untuk:

if first paragraph of selectedText contains "/*" then

Namun Xcode kemudian akan menunjukkan kode komentar bersarang memiliki kesalahan. Jadi nilai sebenarnya dari skrip ini adalah menggunakannya hanya pada kode yang tidak akan dipilih lagi sebagai blok yang lebih besar setelah komentar asli oleh skrip ini.

Saat menghapus komentar kode, Anda harus selalu memastikan untuk memilih sehingga baris pilihan pertama dan terakhir berisi karakter komentar blokir, /*dan */, tanpa baris awal atau akhir baris kosong dalam seleksi.

Juga, Xcode memiliki pintasan keyboard bawaan untuk mengomentari baris yang dipilih dengan pemimpin //dengan memilih kode dan menekan command/. Menekan pintasan keyboard yang sama menghilangkan yang memimpin //. Ini adalah beberapa cara meniadakan kebutuhan untuk menggunakan solusi skrip ini.

Ada plugin pihak ketiga untuk komentar di Xcode dan pencarian Google harus membuahkan hasil.

Salah satu contoh adalah: BlockComment untuk Xcode


Lihat edit riwayat untuk jawaban asli sebelum OP diperbarui dengan detail aktual tujuan.


Catatan: The contoh AppleScript kode hanya itu dan tidak mempekerjakan penanganan kesalahan dan dimaksudkan hanya untuk menunjukkan salah satu dari banyak cara menyelesaikan tugas. Tanggung jawab selalu ada pada Pengguna untuk menambah / menggunakan penanganan kesalahan yang sesuai sebagaimana diperlukan / diinginkan.

pengguna3439894
sumber
Saat mengedit teks secara umum, solusi yang diusulkan berfungsi seperti yang diharapkan. Namun, ketika saya mencoba membuat indentasi teks dalam Xcode, sepertinya tidak berpengaruh
wshaheer
@wshaheer, saya baru saja menguji ini di Xcode dan berhasil tanpa masalah.
user3439894
Saya sudah mencoba hanya dengan saran Anda saja, namun hasilnya sama. Hanya karena penasaran, apakah pengaturan lekukan Xcode memengaruhi ini dengan cara apa pun?
wshaheer
@wshaheer Yang bisa saya katakan adalah saya menggunakan pengaturan Indentasi default Xcode Preferences, tidak pernah mengubahnya, dan contoh kode AppleScript telah bekerja untuk saya di setiap aplikasi yang biasanya saya gunakan di mana teks dapat diedit. Saya baru saja memperhatikan Anda memperbarui pertanyaan Anda, menambahkan kode dan tangkapan layar. Saya akan memeriksanya sedikit.
user3439894