Système -> Préférences -> Clavier -> Texte

Bonjour,

Est-il possible d'appliquer à un texte créé par code les raccourcis définis dans les "Préférences -> Clavier -> Texte" par exemple pour remplacer ^2 par ² ?

Réponses

  • LarmeLarme Membre

    Manuellement, tu peux apparemment les sélectionner, et les glisser déposer dans le Finder, cela te créera un .plist.
    L'inverse est possible pour les importer...
    Ensuite, tu fais ton replacement...

    Y'a un fichier ~/Library/KeyboardServices/TextReplacements.db SQL qui pourrait peut-être te les donner, mais je ne suis même pas sûr que ce soit le bon...

    Y'a peut-être aussi un BinaryPlist (encodé via NSArchiver) dans ~/Library/Keyboard/textReplacements.cache qui semble être un bon candidat...

    Ou suivre les infos de ce post
    Pas sûr qu'il y ait un API ouverte, mais sait-on jamais...

  • Merci Larme, je vais voir de ce côté.

  • LarmeLarme Membre
    juin 2022 modifié #4

    Curieux par ce decoding, j'ai appris une nouvelle trouvaille de debug...
    Je vais l'utiliser sur mon propre textReplacements.cache.
    Quand je voyais des (NS)Data qui correspondaient à des NSArchives, je le savais car je faisais String(data: archivedData, encoding: someEncoding) (en général, j'y passe tous les encodings, car je ne me rappelle jamais du quel affiche un truc).

    J'ai même d'ailleurs ça dans mes méthodes de debug :

    extension String.Encoding {
        static func allEncodings() -> [String.Encoding] {
            return [.ascii, .iso2022JP, .isoLatin1, .isoLatin2, .japaneseEUC, .macOSRoman, .nextstep, .nonLossyASCII, .nextstep, .nonLossyASCII, .shiftJIS, .symbol, .unicode, .utf16, .utf16BigEndian, .utf16LittleEndian, .utf32, .utf32BigEndian, .utf32LittleEndian, .windowsCP1250, .windowsCP1251, .windowsCP1252, .windowsCP1253, .windowsCP1254]
        }
    }
    
    extension String {
        static func printAllStringDecoding(data: Data) {
            String.Encoding.allEncodings().forEach { anEncoding in
                if let str = String(data: data, encoding: anEncoding) {
                    print(str)
                }
            }
        }
    }
    

    Et donc, quand je vois ça : bplist00Ф X$versionY$archiverT$topX$objects�†, avec bplist, pour Binary PList notamment, et "archiver" plus loin, je sais que c'est un truc qui vient de NS(Secure)Coding, et donc de NSArchiver (ou NSKeyedArchiver, etc.)

    Mais, voici une petite astuce pour avoir un truc plus lisible :

    let url = URLOfTheData
    let dict = try NSDictionary(contentsOf: url, error: ())
    print(dict)
    

    Ce qui print :

    {
        "$archiver" = NSKeyedArchiver;
        "$objects" =     (
            "$null",
                    {
                "$class" = "<CFKeyedArchiverUID 0x600001172840 [0x7fff8065eb70]>{value = 9}";
                "NS.objects" =             (
                    "<CFKeyedArchiverUID 0x600001172820 [0x7fff8065eb70]>{value = 2}"
                );
            },
                    {
                "$class" = "<CFKeyedArchiverUID 0x600001172940 [0x7fff8065eb70]>{value = 8}";
                cloudID = "<CFKeyedArchiverUID 0x600001172900 [0x7fff8065eb70]>{value = 7}";
                phrase = "<CFKeyedArchiverUID 0x6000011728a0 [0x7fff8065eb70]>{value = 3}";
                priorValue = "<CFKeyedArchiverUID 0x600001172920 [0x7fff8065eb70]>{value = 0}";
                shortcut = "<CFKeyedArchiverUID 0x6000011728c0 [0x7fff8065eb70]>{value = 4}";
                timestamp = "<CFKeyedArchiverUID 0x6000011728e0 [0x7fff8065eb70]>{value = 5}";
            },
            "J\U2019arrive\U00a0!",
            jrv,
                    {
                "$class" = "<CFKeyedArchiverUID 0x600001172980 [0x7fff8065eb70]>{value = 6}";
                "NS.time" = "-337082460";
            },
                    {
                "$classes" =             (
                    NSDate,
                    NSObject
                );
                "$classname" = NSDate;
            },
            "1870AE0B-3F5F-486E-8E6D-E2569299821B",
                    {
                "$classes" =             (
                    "_KSTextReplacementEntry",
                    NSObject
                );
                "$classname" = "_KSTextReplacementEntry";
            },
                    {
                "$classes" =             (
                    NSMutableArray,
                    NSArray,
                    NSObject
                );
                "$classname" = NSMutableArray;
            }
        );
        "$top" =     {
            root = "<CFKeyedArchiverUID 0x6000011727c0 [0x7fff8065eb70]>{value = 1}";
        };
        "$version" = 100000;
    }
    

    Bien plus pratique.
    On voit d'ailleurs le "jrv/j'arrive", qui est un des shortcuts par défaut.
    On pourrait aller plus loin je pense dans le debug, mais bon...
    Là, le NSDictionary devrait suffire largement, on devrait pouvoir itérer dessus, faudrait voir ce que ça donne aved d'autres entrées de shortcuts...

    Au passage, on notera la version dégueulasse de traduction de la méthode qui a gardé le paramètre error, mais en Void...

    Cette petite méthode bien pratique m'avait déjà été utile, puis qu'elle permet de lire les fichiers localizable.strings, les transformants en dictionnaires...

  • PyrohPyroh Membre

    Attention que ~/Library/Keyboard/textReplacements.cache n'existe pas forcément.
    Sur mon système (12.4) il n'existe pas et pourtant j'ai des shortcuts qui existent.

Connectez-vous ou Inscrivez-vous pour répondre.