Editar texto con sangrías

1

Al editar el texto de la selección utilizando Applescript en un servicio de Automator, ¿es posible mantener la sangría original mientras se agregan espacios con pestañas?

Flujo de trabajo y secuencia de comandos de 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

El siguiente fragmento de código muestra los resultados esperados y la salida actual utilizando el flujo de trabajo y el script mencionados anteriormente:

Entrada de muestra

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

Resultado esperado

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

Salida actual

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

1 respuesta

1

Actualizado para reflejar la pregunta actualizada junto con los comentarios para lograr el objetivo de alternar comentarios en Xcode.

El siguiente ejemplo AppleScript código , que se muestra a continuación, se utiliza en un Automator Servicio se probó en macOS Sierra y Xcode 8.3.3 y funciona para comentar el código seleccionado o quitar el comentario del código , en la forma de codificación en el ejemplo AppleScript código .

En otras palabras, si el código seleccionado se ve así:

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

Y el Automator Servicio se ejecuta en el código seleccionado anterior, se verá así:

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

O si el código seleccionado se ve así:

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

Y el Automator Servicio se ejecuta en el código seleccionado anterior, se verá así:

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

Ejemplo AppleScript código para usar en una acción Ejecutar AppleScript en una Automator Servicio .

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

Notas :

Xcode (8.8.3 de todos modos) no admite el código comentado en bloques anidados, lo que significa que si comenta algún código con este script y luego seleccione el código adicional que incluye el código comentado anteriormente por este script, se generará un error al ejecutar el servicio. Puedes solucionar esto cambiando:

if selectedText contains "/*" then

Para:

if first paragraph of selectedText contains "/*" then
Sin embargo, Xcode mostrará el código comentado anidado con errores. Por lo tanto, el valor real de este script es utilizarlo solo en el código que no se seleccionará nuevamente como un bloque más grande después de los comentarios originales de este script.

Al descomprimir código , siempre debe asegurarse de seleccionar para que la primera y la última línea de selección contengan los caracteres de comentario de bloque, /* y */ , sin líneas en blanco al inicio o al final la selección.

También, Xcode tiene un método abreviado de teclado incorporado para comentar las líneas seleccionadas con un // inicial al seleccionar el código y presionar comando / . Al presionar el mismo método abreviado de teclado, se elimina el // inicial. Esto es de alguna manera niega la necesidad de usar esta solución con script.

Hay complementos de terceros para comentarios en Xcode y una búsqueda de Google debería ser fructífera.

Un ejemplo es: BlockComment for Xcode

Consulte el historial de edición para obtener una respuesta original antes de actualizar el OP con detalles reales del objetivo.

Nota: El ejemplo AppleScript código es solo eso y no emplea ningún manejo de errores y está destinado solo a mostrar una de las muchas maneras en que se puede realizar una tarea. La responsabilidad recae siempre sobre el Usuario para agregar / usar el manejo de errores según sea necesario / deseado.

    
respondido por el user3439894 31.01.2018 - 17:07

Lea otras preguntas en las etiquetas