Come gestire una tastiera ANSI con Shortcuts, senza impazzire

Da ormai un anno mi sono convertito alle tastiere meccaniche, con conseguente layout ANSI (qui una comparativa per chi non conoscesse la differenza).

Il vantaggio di questo layout è di poter avere tutti i simboli utilizzati nello sviluppo (backtip e parentesi graffe su tutti) molto più accessibili, senza dover ricorrere a combo magiche sulla tastiera.

macOS permette di gestire diversi layout di tastiera, ma questo vi costringerà a continui cambi se, come me, passate spesso dalla vostra tastiera meccanica a quella integrata del MacBook.

Quale occasione migliore per sperimentare a fondo Shortcuts su macOS?

Idea

L’idea è quella di realizzare un comando rapido che mi permetta rapidamente di passare da un layout ad un altro, associando uno shortcut ad una combinazione da tastiera.

Il problema maggiore, tuttavia, è che, ad oggi, non esiste un’azione di shortcut che permetta di effettuare il cambio di layout. Vediamo quindi come risolvere il problema, scomodando il buon caro vecchio Carbon!

Carbon è morto, lunga vita a Carbon!

Gli sviluppatori “old school” come il sottoscritto conosceranno sicuramente Carbon. Per i più giovani, sono delle librerie presenti in macOS che permettono di interagire con il sistema operativo che sono date ormai come vecchie e deprecate da anni, ma continuano a vivere tra noi.

Proprio grazie a Carbon riusciamo a definire due script (in Swift), che ci permetteranno di:

  • ottenere l’elenco delle sorgenti di input definite nella nostra installazione di macOS
  • impostare la sorgente di input desiderata

Di seguito il primo script, che permette di recuperare tutte le sorgenti di input definite in macOS:

import Carbon

// retrieve all input sources
guard let cfSources = TISCreateInputSourceList(nil, false),
      let sources = cfSources.takeRetainedValue() as? [TISInputSource] else {
    exit(-1)
}

// print all sources as "name - id"
sources.forEach {
    let cfName = TISGetInputSourceProperty($0, kTISPropertyLocalizedName)!
    let cfID = TISGetInputSourceProperty($0, kTISPropertyInputSourceID)!

    let idString = Unmanaged<CFString>.fromOpaque(cfID).takeUnretainedValue() as String
    let nameString = Unmanaged<CFString>.fromOpaque(cfName).takeUnretainedValue() as String
    print("(nameString) - (idString)")
}

Eseguendo questo script, otterrete un elenco di nome / id simile a questo:

Italian - com.apple.keylayout.Italian-Pro
Emoji & Symbols - com.apple.CharacterPaletteIM
U.S. - com.apple.keylayout.US
com.apple.PressAndHold - com.apple.PressAndHold
EmojiFunctionRowIM_Extension - com.apple.inputmethod.EmojiFunctionRowItem
Dictation - com.apple.inputmethod.ironwood

Nel mio caso, le due righe di interesse sono “Italian” e “U.S.”, che torneranno in gioco a breve.

Il secondo script ci permette, invece, di settare la sorgente di input attiva:

import Carbon

let source = "com.apple.keylayout.Italian-Pro"
let filter = [kTISPropertyInputSourceID: source]

// check if the given source is available in the system
guard let cfSources = TISCreateInputSourceList(filter as CFDictionary?, false),
      let sources = cfSources.takeRetainedValue() as? [TISInputSource],
      let firstSource = sources.first else {
    print("Unable to find source '\(source)'.")
    exit(-1)
}

// select the given input source
let result = TISSelectInputSource(firstSource)
exit(result)

Andremo a breve a fare in modo che il parametro source non sia fisso, ma lo renderemo dinamico in base alla nostra necessità.

Creiamo lo shortcut

Abbiamo ora quello che ci serve per creare il comando rapido Seleziona layout tastiera che tanto desideriamo.


Il comando rapido controlla, per prima cosa, se ha ricevuto l’identificativo di un layout da impostare. Nel caso non sia fornito, richiama lo script #1 per mostrare l’elenco delle sorgenti di input disponibili e scegliere quella desiderata. Una volta scelta, richiama nuovamente lo script per impostare il layout appena scelto.


Comodo, ma possiamo fare di meglio. Possiamo definire altri due comandi rapidi, che richiamano il precedente e settano, in automatico, il layout IT o US senza necessità di interazione.


A questi due shortcut possiamo assegnare anche una scorciatoia da tastiera (rispettivamente Control + Option + Command + I e Control + Option + Command + U nel mio caso) per richiamarli ancora più velocemente.

Shortery

Il tocco finale ce lo fornire l’app Shortery, che permette di definire dei trigger per i nostri comandi rapidi (e che, per inciso, dovrebbe essere parte integrante di Shortcuts, diamine!).

In questo modo, quando la mia tastiera Bluetooth si connette, Shortery esegue il comando rapido Seleziona layout US. La sorgente di input viene subito modificata e io sono subito pronto per lavorare! Allo stesso modo, appena si disconnette viene richiamato lo shortcut Seleziona layout IT per reimpostare il layout di default italiano.

Download

Per chi fosse interessato, vi lascio i link per scaricare i tre comandi rapidi che ho mostrato nel post.

Se avete suggerimenti o miglioramenti, fatemelo sapere nei commenti o su Twitter.

Ingegnere informatico e sviluppatore freelance, mi occupo da anni di sviluppo per iOS (ma non solo). Dal 2008 scrivo su questo piccolo blog (con qualche lunga pausa), in cui parlo di programmazione e di qualsiasi altra cosa che mi diverta.

Leave a reply:

Your email address will not be published.

Site Footer