5 votes

Comment écrire un texte dans le Terminal en utilisant AppleScript ?

Comment puis-je insérer un texte dans Terminal.app en utilisant AppleScript ? Je ne veux pas dire l'exécuter (appuyer sur Entrée). Seulement de l'insérer. Mon script actuel fonctionne presque :

tell application "Terminal"
    activate
    tell application "System Events" to keystroke "TextToInsert" using {}
end tell

Le problème est que cette opération est exécutée par une touche de raccourci, par exemple CMD-T, et que la touche CMD enfoncée interfère alors avec les frappes et modifie le comportement souhaité.

J'ai besoin soit de dire à la keystroke pour ignorer toute touche modificatrice ou pour utiliser une autre commande pour écrire le texte à cet endroit. Je pense que write Je devrais le faire mais je ne sais pas comment.

4voto

wch1zpink Points 6067

Vous pouvez essayer quelque chose comme, tout d'abord, copier le texte dans votre presse-papiers, que vous voulez insérer dans le Terminal, puis demander au code AppleScript de coller le presse-papiers dans le Terminal.

tell application "Terminal"
    activate
    tell application "System Events"
        tell application process "Terminal"
            set frontmost to true
            repeat while not frontmost
                delay 0.1
            end repeat
        end tell
        keystroke "v" using {command down}
    end tell
end tell

Si toutes vos fenêtres de terminal sont configurées pour s'ouvrir dans des onglets plutôt que dans des fenêtres séparées, le code AppleScript suivant devrait permettre de résoudre toutes les situations mentionnées par @user3439894 dans son commentaire sur votre article.

tell application "Terminal"
    activate
    repeat until frontmost
        delay 0.5
    end repeat
    set windowCount to count of window
    if windowCount is not 0 then
        tell its front window
            set isMinimized to miniaturized
        end tell
    end if

    if windowCount is 0 then
        tell application "System Events" to tell application process "Terminal"
            set frontmost to true
            repeat while not frontmost
                delay 0.1
            end repeat
            keystroke "n" using {command down}
            delay 1
            keystroke "v" using {command down}
        end tell
    else
        activate
        repeat until frontmost
            delay 0.5
        end repeat
        delay 0.1
        if ((processes of selected tab of front window) is {} or isMinimized) then
            tell application "System Events" to tell application process "Terminal"
                set frontmost to true
                repeat while not frontmost
                    delay 0.1
                end repeat
                keystroke "n" using {command down}
                delay 1
                keystroke "v" using {command down}
            end tell
        else
            tell application "System Events" to tell application process "Terminal"
                set frontmost to true
                repeat while not frontmost
                    delay 0.1
                end repeat
                delay 0.5
                keystroke "v" using {command down}
            end tell
        end if
    end if
end tell

1voto

J'ai marqué la réponse ci-dessus comme correcte, même si elle n'a pas résolu mon problème, car il y a beaucoup d'autres codes utiles.

Mes problèmes non résolus : 1. les touches modificatrices interfèrent toujours, même avec l'astuce CMD-c 2. L'astuce du presse-papiers modifie le presse-papiers. Je pourrais le remettre à sa valeur d'origine mais cela change l'historique.

Ma solution : Ne pas exécuter le script tant qu'aucune touche modificatrice n'est pressée. C'est aussi une sorte d'astuce mais cela résout la cause première.

Voici mon code :

- (void) cmd_panel_curItem_sendPathToTerminal;
{
    if (self.noKeyModifiersTimer != nil) {
        return;
    }
    self.noKeyModifiersTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(_cmd_panel_curItem_sendPathToTerminal) userInfo:nil repeats:YES];
}

- (void) _cmd_panel_curItem_sendPathToTerminal;
{
    NSUInteger modifiers = ([NSEvent modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask);

    if ((modifiers & NSEventModifierFlagOption) == 0 && (modifiers & NSEventModifierFlagShift) == 0 && (modifiers & NSEventModifierFlagCommand) == 0 && (modifiers & NSEventModifierFlagControl) == 0) {
        [self.noKeyModifiersTimer invalidate];
        self.noKeyModifiersTimer = nil;
        [self impl_panel_curItem_sendPathToTerminal];
    }
}

- (void) impl_panel_curItem_sendPathToTerminal;
{
    // orig code
}

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X