Modifica il testo con le indentazioni

1

Quando si modifica il testo in selezione usando Applescript in un servizio di Automator, è possibile mantenere il rientro originale aggiungendo spazi a schede di fronte ad esso?

Flusso di lavoro e script di Automator

onrun{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

Il seguente frammento mostra i risultati attesi e l'output corrente utilizzando il flusso di lavoro e lo script sopra indicati:

Input di esempio

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

Risultato atteso

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

Uscita corrente

/*
 let c1 = CLLocation(latitude: self.latitude, longitude: self.longitude)
 let c2 = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)
 */
    
posta wshaheer 31.01.2018 - 09:50
fonte

1 risposta

1

Aggiornato per riflettere la domanda aggiornata insieme ai commenti per raggiungere l'obiettivo di attivare e disattivare i commenti in Xcode.

Il seguente esempio codice AppleScript , mostrato di seguito, utilizzato in un Automator servizio è stato testato in macOS Sierra e Xcode 8.3.3 e funziona per commentare il codice selezionato o rimuovere il commento dal codice , secondo la modalità di codifica nel esempio AppleScript codice .

In altre parole, se il code selezionato è:

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

E il Automator servizio viene eseguito sopra il codice selezionato, sarà simile a:

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

O se il codice selezionato

è:

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

E il Automator servizio viene eseguito sopra il codice selezionato, sarà simile a:

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

Esempio AppleScript codice da utilizzare in un'azione Esegui AppleScript in un Automator Servizio .

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

Note:

Xcode (8.8.3 comunque) non supporta il blocco annidato code , il che significa che se si commenta un codice con questo script e quindi seleziona un codice che include codice precedentemente commentato da questo script, genererà un errore durante l'esecuzione del servizio. Puoi ovviare a questo problema modificando:

if selectedText contains "/*" then

A:

if first paragraph of selectedText contains "/*" then

Tuttavia Xcode mostrerà quindi il codice annidato annidato come avente errori. Quindi il vero valore di questo script è di usarlo solo su codice che non verrà più selezionato come blocco più grande dopo il commento originale di questo script.

Quando decommenta codice devi sempre essere sicuro di selezionare in modo che la prima e l'ultima riga di selezione contengano i caratteri del blocco, /* e */ , senza righe vuote iniziali o finali in la selezione.

Inoltre, Xcode ha una scorciatoia da tastiera incorporata per commentare le righe selezionate con una percentuale di // selezionando il codice e premendo comando / . Premendo la stessa scorciatoia da tastiera si rimuove il // iniziale. Questo è un modo per negare la necessità di utilizzare questa soluzione basata su script.

Esistono plug-in di terze parti per i commenti in Xcode e una ricerca Google dovrebbe essere fruttuosa.

Un esempio è: BlockComment per Xcode

Visualizza la cronologia delle modifiche per la risposta originale prima che l'OP fosse aggiornato con i dettagli reali dell'obiettivo.

Nota: il esempio codice AppleScript è proprio questo e non impiega alcuna gestione degli errori e si intende solo per mostrare uno dei molti modi in cui eseguire un compito. L'onere è sempre sull'utente di aggiungere / utilizzare la gestione degli errori appropriata come necessario / voluto.

    
risposta data 31.01.2018 - 17:07
fonte

Leggi altre domande sui tag