Mac OS

Power management

Most power settings seem to have vanished from system settings, but can be controlled1 with pmset2 and caffeinate.

Power management settings using pmset

man pmset

See man pmset for man pages from MacOS Big Sur and Sonoma.

PMSET(1)                    General Commands Manual                   PMSET(1)

NAME
     pmset – manipulate power management settings

SYNOPSIS
     pmset [-a | -b | -c | -u] [setting value] [...]
     pmset -u [haltlevel percent] [haltafter minutes] [haltremain minutes]
     pmset -g [option]
     pmset schedule [cancel | cancelall] type date+time [owner]
     pmset repeat cancel
     pmset repeat type weekdays time
     pmset relative [wake | poweron] seconds
     pmset [touch | sleepnow | displaysleepnow | boot]

DESCRIPTION
     pmset manages power management settings such as idle sleep timing, wake
     on administrative access, automatic restart on power loss, etc.

     Note that processes may dynamically override these power management
     settings by using I/O Kit power assertions.  Whenever processes override
     any system power settings, pmset will list those processes and their
     power assertions in -g and -g assertions. See caffeinate(8).

SETTING
     pmset can modify the values of any of the power management settings
     defined below. You may specify one or more setting & value pairs on the
     command-line invocation of pmset.  The -a, -b, -c, -u flags determine
     whether the settings apply to battery ( -b ), charger (wall power) ( -c
     ), UPS ( -u ) or all ( -a ).

     Use a minutes argument of 0 to set the idle time to never for sleep
     disksleep and displaysleep

     pmset must be run as root in order to modify any settings.

SETTINGS
     displaysleep - display sleep timer; replaces 'dim' argument in 10.4
     (value in minutes, or 0 to disable)
     disksleep - disk spindown timer; replaces 'spindown' argument in 10.4
     (value in minutes, or 0 to disable)
     sleep - system sleep timer (value in minutes, or 0 to disable)
     womp - wake on ethernet magic packet (value = 0/1). Same as "Wake for
     network access" in System Settings.
     ring - wake on modem ring (value = 0/1)
     powernap - enable/disable Power Nap on supported machines (value = 0/1)
     proximitywake - On supported systems, this option controls system wake
     from sleep based on proximity of devices using same iCloud id. (value =
     0/1)
     autorestart - automatic restart on power loss (value = 0/1)
     lidwake - wake the machine when the laptop lid (or clamshell) is opened
     (value = 0/1)
     acwake - wake the machine when power source (AC/battery) is changed
     (value = 0/1)
     lessbright - slightly turn down display brightness when switching to this
     power source (value = 0/1)
     halfdim - display sleep will use an intermediate half-brightness state
     between full brightness and fully off  (value = 0/1)
     sms - use Sudden Motion Sensor to park disk heads on sudden changes in G
     force (value = 0/1)
     hibernatemode - change hibernation mode. Please use caution. (value =
     integer)
     hibernatefile - change hibernation image file location. Image may only be
     located on the root volume. Please use caution. (value = path)
     ttyskeepawake - prevent idle system sleep when any tty (e.g. remote login
     session) is 'active'. A tty is 'inactive' only when its idle time exceeds
     the system sleep timer. (value = 0/1)
     networkoversleep - this setting affects how OS X networking presents
     shared network services during system sleep. This setting is not used by
     all platforms; changing its value is unsupported.
     destroyfvkeyonstandby - Destroy File Vault Key when going to standby
     mode. By default File vault keys are retained even when system goes to
     standby. If the keys are destroyed, user will be prompted to enter the
     password while coming out of standby mode.(value: 1 - Destroy, 0 -
     Retain)

GETTING
     -g (with no argument) will display the settings currently in use.
     -g live displays the settings currently in use.
     -g custom displays custom settings for all power sources.
     -g cap displays which power management features the machine supports.
     -g sched displays scheduled startup/wake and shutdown/sleep events.
     -g ups displays UPS emergency thresholds.
     -g ps / batt displays status of batteries and UPSs.
     -g pslog displays an ongoing log of power source (battery and UPS) state.
     -g rawlog displays an ongoing log of battery state as read directly from
     battery.
     -g therm shows thermal conditions that affect CPU speed. Not available on
     all platforms.
     -g thermlog shows a log of thermal notifications that affect CPU speed.
     Not available on all platforms.
     -g assertions displays a summary of power assertions. Assertions may
     prevent system sleep or display sleep. Available 10.6 and later.
     -g assertionslog shows a log of assertion creations and releases.
     Available 10.6 and later.
     -g sysload displays the "system load advisory" - a summary of system
     activity available from the IOGetSystemLoadAdvisory API. Available 10.6
     and later.
     -g sysloadlog displays an ongoing log of lives changes to the system load
     advisory. Available 10.6 and later.
     -g ac / adapter will display details about an attached AC power adapter.
     Only supported for MacBook and MacBook Pro.
     -g log displays a history of sleeps, wakes, and other power management
     events. This log is for admin & debugging purposes.
     -g uuid displays the currently active sleep/wake UUID; used within OS X
     to correlate sleep/wake activity within one sleep cycle.  history
     -g uuidlog displays the currently active sleep/wake UUID, and prints a
     new UUID as they're set by the system.
     -g history is a debugging tool. Prints a timeline of system sleeplwake
     UUIDs, when enabled with boot-arg io=0x3000000.
     -g historydetailed Prints driver-level timings for a sleep/wake. Pass a
     UUID as an argument.
     -g powerstate [class names] Prints the current power states for I/O Kit
     drivers. Caller may provide one or more I/O Kit class names (separated by
     spaces) as an argument. If no classes are provided, it will print all
     drivers' power states.
     -g powerstatelog [-i interval] [class names] Periodically prints the
     power state residency times for some drivers. Caller may provide one or
     more I/O Kit class names (separated by spaces). If no classes are
     provided, it will log the IOPower plane's root registry entry. Caller may
     specify a polling interval, in seconds with -i <polling interval>;
     otherwise it defaults to 5 seconds.
     -g stats Prints the counts for number sleeps and wakes system has gone
     thru since boot.
     -g systemstate Prints the current power state of the system and available
     capabilites.
     -g everything Prints output from every argument under the GETTING header.
     This is useful for quickly collecting all the output that pmset provides.
     Available in 10.8.

SAFE SLEEP ARGUMENTS
     hibernatemode supports values of 0, 3, or 25. Whether or not a
     hibernation image gets written is also dependent on the values of standby
     and autopoweroff

     For example, on desktops that support standby a hibernation image will be
     written after the specified standbydelay time. To disable hibernation
     images completely, ensure hibernatemode standby and autopoweroff are all
     set to 0.

     hibernatemode = 0 by default on desktops. The system will not back memory
     up to persistent storage. The system must wake from the contents of
     memory; the system will lose context on power loss. This is,
     historically, plain old sleep.

     hibernatemode = 3 by default on portables. The system will store a copy
     of memory to persistent storage (the disk), and will power memory during
     sleep. The system will wake from memory, unless a power loss forces it to
     restore from hibernate image.

     hibernatemode = 25 is only settable via pmset. The system will store a
     copy of memory to persistent storage (the disk), and will remove power to
     memory. The system will restore from disk image. If you want
     "hibernation" - slower sleeps, slower wakes, and better battery life, you
     should use this setting.

     Please note that hibernatefile may only point to a file located on the
     root volume.

STANDBY ARGUMENTS
     standby causes kernel power management to automatically hibernate a
     machine after it has slept for a specified time period. This saves power
     while asleep. This setting defaults to ON for supported hardware. The
     setting standby will be visible in pmset -g if the feature is supported
     on this machine.

     standbydelayhigh and standbydelaylow specify the delay, in seconds,
     before writing the hibernation image to disk and powering off memory for
     Standby.  standbydelayhigh is used when the remaining battery capacity is
     above highstandbythreshold , and standbydelaylow is used when the
     remaining battery capacity is below highstandbythreshold.

     highstandbythreshold has a default value of 50 percent.

     autopoweroff is enabled by default on supported platforms as an
     implementation of Lot 6 to the European Energy-related Products
     Directive. After sleeping for <autopoweroffdelay> seconds, the system
     will write a hibernation image and go into a lower power chipset sleep.
     Wakeups from this state will take longer than wakeups from regular sleep.

     autopoweroffdelay specifies the delay, in seconds, before entering
     autopoweroff mode.

UPS SPECIFIC ARGUMENTS
     UPS-specific arguments are only valid following the -u option. UPS
     settings also have an on/off value. Use a -1 argument instead of percent
     or minutes to turn any of these settings off. If multiple halt conditions
     are specified, the system will halt on the first condition that occurs in
     a low power situation.

     haltlevel - when draining UPS battery, battery level at which to trigger
     an emergency shutdown (value in %)
     haltafter - when draining UPS battery, trigger emergency shutdown after
     this long running on UPS power (value in minutes, or 0 to disable)
     haltremain - when draining UPS battery, trigger emergency shutdown when
     this much time remaining on UPS power is estimated (value in minutes, or
     0 to disable)

     Note: None of these settings are observed on a system with support for an
     internal battery, such as a laptop. UPS emergency shutdown settings are
     for desktop and server only.

SCHEDULED EVENT ARGUMENTS
     pmset allows you to schedule system sleep, shutdown, wakeup and/or power
     on. "schedule" is for setting up one-time power events, and "repeat" is
     for setting up daily/weekly power on and power off events. Note that you
     may only have one pair of repeating events scheduled - a "power on" event
     and a "power off" event. For sleep cycling applications, pmset can
     schedule a "relative" wakeup or poweron to occur in seconds from the end
     of system sleep/shutdown, but this event cannot be cancelled and is
     inherently imprecise.

     type - one of sleep, wake, poweron, shutdown, wakeorpoweron
     date/time - "MM/dd/yy HH:mm:ss" (in 24 hour format; must be in quotes)
     time - HH:mm:ss
     weekdays - a subset of MTWRFSU ("M" and "MTWRF" are valid strings)
     owner - a string describing the person or program who is scheduling this
     one-time power event (optional)

POWER SOURCE ARGUMENTS
     -g with a 'batt' or 'ps' argument will show the state of all attached
     power sources.

     -g with a 'pslog' or 'rawlog' argument is normally used for debugging,
     such as isolating a problem with an aging battery.

OTHER ARGUMENTS
     boot - tell the kernel that system boot is complete (normally LoginWindow
     does this). May be useful to Darwin users.
     touch - PM re-reads existing settings from disk.
     noidle - pmset prevents idle sleep by creating a PM assertion to prevent
     idle sleep(while running; hit ctrl-c to cancel). This argument is
     deprecated in favor of caffeinate(8). Please use caffeinate(8) instead.
     sleepnow - causes an immediate system sleep.
     restoredefaults - Restores power management settings to their default
     values.
     displaysleepnow - causes display to go to sleep immediately.
     resetdisplayambientparams - resets the ambient light parameters for
     certain Apple displays.
     dim - deprecated in 10.4 in favor of 'displaysleep'. 'dim' will continue
     to work.
     spindown - deprecated in 10.4 in favor of 'disksleep'. 'spindown' will
     continue to work.

EXAMPLES
     This command sets displaysleep to a 5 minute timer on battery power,
     leaving other settings on battery power and other power sources
     unperturbed.

     pmset -b displaysleep 5

     Sets displaysleep to 10, disksleep to 10, system sleep to 30, and turns
     on WakeOnMagicPacket for ALL power sources (AC, Battery, and UPS) as
     appropriate

     pmset -a displaysleep 10 disksleep 10 sleep 30 womp 1

     For a system with an attached and supported UPS, this instructs the
     system to perform an emergency shutdown when UPS battery drains to below
     40%.

     pmset -u haltlevel 40

     For a system with an attached and supported UPS, this instructs the
     system to perform an emergency shutdown when UPS battery drains to below
     25%, or when the UPS estimates it has less than 30 minutes remaining
     runtime. The system shuts down as soon as either of these conditions is
     met.

     pmset -u haltlevel 25 haltremain 30

     For a system with an attached and supported UPS, this instructs the
     system to perform an emergency shutdown after 2 minutes of running on UPS
     battery power.

     pmset -u haltafter 2

     Schedules the system to automatically wake from sleep on July 4, 2016, at
     8PM.

     pmset schedule wake "07/04/16 20:00:00"

     Schedules a repeating shutdown to occur each day, Tuesday through
     Saturday, at 11AM.

     pmset repeat shutdown TWRFS 11:00:00

     Schedules a repeating wake or power on event every tuesday at 12:00 noon,
     and a repeating sleep event every night at 8:00 PM.

     pmset repeat wakeorpoweron T 12:00:00 sleep MTWRFSU 20:00:00

     Cancels all scheduled system sleep, shutdown, wake, and power on events.

     pmset repeat cancel

     Prints the power management settings in use by the system.

     pmset -g

     Prints a snapshot of battery/power source state at the moment.

     pmset -g batt

     If your system suddenly sleeps on battery power with 20-50% of capacity
     remaining, leave this command running in a Terminal window. When you see
     the problem and later power and wake the computer, you'll be able to
     detect sudden discontinuities (like a jump from 30% to 0%) indicative of
     an aging battery.

     pmset -g pslog

SEE ALSO
     caffeinate(8)

FILES
     All changes made through pmset are saved in a persistent preferences file
     (per-system, not per-user) at
     /Library/Preferences/SystemConfiguration/com.apple.PowerManagement.plist

     Scheduled power on/off events are stored separately in
     /Library/Preferences/SystemConfiguration/com.apple.AutoWake.plist

     pmset modifies the same file that System Settings modifies.

Darwin                         November 9, 2012                         Darwin

Show the settings currently in use:

$ sudo pmset -g

Show all settings:

$ sudo pmset -g custom

Change a setting:

$ sudo pmset $power_source $setting $value

Arguments for power sources:

  • -b: battery
  • -c: AC (charger/wall power)
  • -a: all
$ sudo pmset -b disablesleep 1

Will set disablesleep to 1 on battery.

Slowing down battery drain (used on M1)

Apple seem to have been removing some of the power settings from the Settings panel, but there are some quite useful settings in pmset that I use.

My current settings

Current settings for my M1 on battery power:

$ sudo pmset -g
System-wide power settings:
 SleepDisabled		0
Currently in use:
 standby              1
 Sleep On Power Button 1
 SleepServices        0
 hibernatefile        /var/vm/sleepimage
 powernap             0
 networkoversleep     0
 disksleep            10
 sleep                1 (sleep prevented by powerd)
 hibernatemode        3
 ttyskeepawake        0
 displaysleep         10
 tcpkeepalive         0
 lowpowermode         1
 womp                 0

Current settings, full output

The full list of settings I am currently using.

$ sudo pmset -g custom
Battery Power:
 Sleep On Power Button 1
 lowpowermode         1
 standby              1
 ttyskeepawake        0
 hibernatemode        3
 powernap             0
 hibernatefile        /var/vm/sleepimage
 displaysleep         10
 womp                 0
 networkoversleep     0
 sleep                1
 lessbright           1
 tcpkeepalive         0
 disksleep            10
 SleepServices        0
AC Power:
 Sleep On Power Button 1
 lowpowermode         1
 standby              1
 ttyskeepawake        1
 hibernatemode        3
 powernap             1
 hibernatefile        /var/vm/sleepimage
 displaysleep         120
 womp                 1
 networkoversleep     0
 sleep                0
 tcpkeepalive         1
 disksleep            10

Disable powernap, prevent remote networking sessions from keeping the laptop awake on battery, and prevent it from sending and reading mDNS while sleeping.

$ sudo pmset -b powernap 0
$ sudo pmset -b ttyskeepawake 0
$ sudo pmset -b networkoversleep 0

These settings slow down battery drain on my M1 while it's sleeping on battery (on MacOS).

To slow it down even further, you can disable tcpkeepalive, but this will impact services like 'Find my mac' (that has a good reason to run while sleeping), and pmset will warn you about that.

$ sudo pmset -b tcpkeepalive 0
Warning: This option disables TCP Keep Alive mechanism when sytem is sleeping.
This will result in some critical features like 'Find My Mac' not to function
properly.

The man page doesn't mention this option, but presumably it disbales TCP keep-alive while sleeping.

I like to disable sleep on AC power:

$ sudo pmset -c disablesleep 1

The M1 chip uses very little power to begin with, and I prefer my laptop not sleep on AC power.

System hardware info from system_profiler

man system_profiler

Man page: man system_profiler

SYSTEM_PROFILER(8)          System Manager's Manual         SYSTEM_PROFILER(8)

NAME
     system_profiler – reports system hardware and software configuration.

SYNOPSIS
     system_profiler [-usage]
     system_profiler [-listDataTypes]
     system_profiler [-xml] dataType1 ... dataTypeN
     system_profiler [-xml] [-detailLevel level]
     system_profiler [-json] dataType1 ... dataTypeN
     system_profiler [-json] [-detailLevel level]

DESCRIPTION
     system_profiler reports on the hardware and software configuration of the
     system.  It can generate plain text reports or XML reports which can be
     opened with System Information.app, or JSON reports

     Progress and error messages are printed to stderr while actual report
     data is printed to stdout.  Redirect stderr to /dev/null to suppress
     progress and error messages.

     The following options are available:

     -xml                Generates a report in XML format.  If the XML report
                         is redirected to a file with a ".spx" suffix that
                         file can be opened with System Information.app.

     -json               Generates a report in JSON format.

     -listDataTypes      Lists the available datatypes.

     -detailLevel level  Specifies the level of detail for the report:

                         mini          report with no personal information

                         basic         basic hardware and network information

                         full          all available information

     -timeout            Specifies the maximum time to wait in seconds for
                         results.  If some information is not available within
                         the specified time limit then an incomplete or
                         partial report will be generated.  The default
                         timeout is 180 seconds.  Specifying a timeout of 0
                         means no timeout.

     -usage              Prints usage info and examples.

EXAMPLES
     system_profiler
       Generates a text report with the standard detail level.

     system_profiler -detailLevel mini
       Generates a short report containing no personal information.

     system_profiler -listDataTypes
       Shows a list of the available data types.

     system_profiler SPSoftwareDataType SPNetworkDataType
       Generates a text report containing only software and network data.

     system_profiler -xml > MyReport.spx
       Creates a XML file which can be opened by System Profiler.app

AUTHORS
     Apple Inc.

Darwin                           June 30, 2003                          Darwin

MacOS provides system_profiler, which reports system hardware configurations, including power settings and current power state.

system_profiler -listDataTypes

The available datatypes:

$ system_profiler -listDataTypes
Available Datatypes:
SPParallelATADataType
SPUniversalAccessDataType
SPSecureElementDataType
SPApplicationsDataType
SPAudioDataType
SPBluetoothDataType
SPCameraDataType
SPCardReaderDataType
SPiBridgeDataType
SPDeveloperToolsDataType
SPDiagnosticsDataType
SPDisabledSoftwareDataType
SPDiscBurningDataType
SPEthernetDataType
SPExtensionsDataType
SPFibreChannelDataType
SPFireWireDataType
SPFirewallDataType
SPFontsDataType
SPFrameworksDataType
SPDisplaysDataType
SPHardwareDataType
SPInstallHistoryDataType
SPInternationalDataType
SPLegacySoftwareDataType
SPNetworkLocationDataType
SPLogsDataType
SPManagedClientDataType
SPMemoryDataType
SPNVMeDataType
SPNetworkDataType
SPPCIDataType
SPParallelSCSIDataType
SPPowerDataType
SPPrefPaneDataType
SPPrintersSoftwareDataType
SPPrintersDataType
SPConfigurationProfileDataType
SPRawCameraDataType
SPSASDataType
SPSerialATADataType
SPSPIDataType
SPSmartCardsDataType
SPSoftwareDataType
SPStartupItemDataType

Get current cycle count

One of the things that system_profiler reports is the current number of power cycles on the battery, found in SPPowerDataType.

$ system_profiler SPPowerDataType | grep -i 'Cycle Count' | awk '{print $3 }'
209

By passing the -json argument to system_profiler, we can get JSON formatted output, which we can parse with jq to get to the cycle count:

$ system_profiler SPPowerDataType -json  |
    jq '.SPPowerDataType[]
        | select(._name == "spbattery_information")
        | .sppower_battery_health_info.sppower_battery_cycle_count '
209

This is useful for e.g. writing a script to monitor and track your cycle counts.

You can also download coconutBattery which is a tool running in the system tray showing you various information about your battery state. Unfortunately this is a closed source tool. It is probably just reading the system_profiler output though.

Prevent sleep with caffeinate

man caffeinate

Man page: man caffeinate

CAFFEINATE(8)               System Manager's Manual              CAFFEINATE(8)

NAME
     caffeinate – prevent the system from sleeping on behalf of a utility

SYNOPSIS
     caffeinate [-disu] [-t timeout] [-w pid] [utility arguments...]

DESCRIPTION
     caffeinate creates assertions to alter system sleep behavior.  If no
     assertion flags are specified, caffeinate creates an assertion to prevent
     idle sleep.  If a utility is specified, caffeinate creates the assertions
     on the utility's behalf, and those assertions will persist for the
     duration of the utility's execution. Otherwise, caffeinate creates the
     assertions directly, and those assertions will persist until caffeinate
     exits.

     Available options:

     -d      Create an assertion to prevent the display from sleeping.

     -i      Create an assertion to prevent the system from idle sleeping.

     -m      Create an assertion to prevent the disk from idle sleeping.

     -s      Create an assertion to prevent the system from sleeping. This
             assertion is valid only when system is running on AC power.

     -u      Create an assertion to declare that user is active. If the
             display is off, this option turns the display on and prevents the
             display from going into idle sleep. If a timeout is not specified
             with '-t' option, then this assertion is taken with a default of
             5 second timeout.

     -t      Specifies the timeout value in seconds for which this assertion
             has to be valid. The assertion is dropped after the specified
             timeout. Timeout value is not used when an utility is invoked
             with this command.

     -w      Waits for the process with the specified pid to exit. Once the
             the process exits, the assertion is also released.  This option
             is ignored when used with utility option.

EXAMPLE
     caffeinate -i make
        caffeinate forks a process, execs "make" in it, and holds an assertion
     that prevents idle sleep as long as that process is running.

SEE ALSO
     pmset(1)

LOCATION
     /usr/bin/caffeinate

Darwin                         November 9, 2012                         Darwin

Battery charge limit

Preventing frequent charging to 100% is very important for battery health as it limits the number of full cycles on the battery (avoiding running the battery empty is also important).

I am not aware of any tool provided by Mac OS to limit the battery charge, and the "optmized charging" in the battery settings is limited and unreliable.

There is an excellent tool battery available from the GitHub repo actuallymentor/battery.

battery --help

Battery CLI utility v1.1.6

Usage:

  battery status
    output battery SMC status, % and time remaining

  battery logs LINES[integer, optional]
    output logs of the battery CLI and GUI
	eg: battery logs 100

  battery maintain LEVEL[1-100,stop]
    reboot-persistent battery level maintenance: turn off charging above, and on below a certain value
	it has the option of a --force-discharge flag that discharges even when plugged in (this does NOT work well with clamshell mode)
    eg: battery maintain 80
    eg: battery maintain stop

  battery charging SETTING[on/off]
    manually set the battery to (not) charge
    eg: battery charging on

  battery adapter SETTING[on/off]
    manually set the adapter to (not) charge even when plugged in
    eg: battery adapter off

  battery charge LEVEL[1-100]
    charge the battery to a certain percentage, and disable charging when that percentage is reached
    eg: battery charge 90

  battery discharge LEVEL[1-100]
    block power input from the adapter until battery falls to this level
    eg: battery discharge 90

  battery visudo
    ensure you don't need to call battery with sudo
    This is already used in the setup script, so you should't need it.

  battery update
    update the battery utility to the latest version

  battery reinstall
    reinstall the battery utility to the latest version (reruns the installation script)

  battery uninstall
    enable charging, remove the smc tool, and the battery script
Battery charge limiter tray icon

The tool also provides a system tray menu where you can enabale/disable the charge limit.

Set a charge limit of 75%:

$ battery maintain 75
Maintaining battery at 75%

Discharge battery to 75%, then start charging:

$ battery discharge 75

See the battery --help output or the README.md file for more info.

Using US/ANSI layout on built-in ISO keyboards with US/ANSI layout

On MacBook's with an ISO keyboard (105 keys), the grave key is incorrectly mapped to §± (sometimes called Sector sign) which is rather annoying.

According to a Technical Note in the Apple documentation archive, they key codes are:

  • 0x35: Grave key
  • 0x64: "Keyboard Non-US \ and |"6

Using hidutil

Broken in MacOS 14.2, fixed in 14.3

This broke in MacOS 14.2 (as noticed by other folks as well). The issue was raised on Apple Community and Stack Exchange by Yarsolav L.

The bug was also tracked on Open Radar7 as rdar://FB13465290, where the fix in MacOS 14.3 was confirmed.

I can also confirm that hidutil started working as before after upgrading to MacOS 14.3.

It is possible to remap any key using the built-in hidutil. All keys have a hexadecimal code8 which is passed to hidutil. Apple have published a technical note with a table of the codes.

Get the current key remapping state:

$ hidutil property --get UserKeyMapping
(
)

Remove any changes:

$ hidutil property --set '{"UserKeyMapping":[]}'
UserKeyMapping:(
)

The changes are not permanent and changes get reset to the default state on reboot. But we can use hidutil to remap keys instead of using a tool like Karabiner.

To use use keycodes from the Apple documentation8 with hidutil, first OR the keycode with 0x700000000

  • Grave key: 0x700000035
  • "Non US \ and |": 0x700000064

Then map the grave key correctly:

$ hidutil property --set '{
    "UserKeyMapping":[{
        "HIDKeyboardModifierMappingSrc":0x700000035,
        "HIDKeyboardModifierMappingDst":0x700000064
    }]
  }'

And to map the keys both ways:

$ hidutil property --set '{
    "UserKeyMapping":[{
        "HIDKeyboardModifierMappingSrc":0x700000035,
        "HIDKeyboardModifierMappingDst":0x700000064
    },
    {
        "HIDKeyboardModifierMappingSrc":0x700000064,
        "HIDKeyboardModifierMappingDst":0x700000035
    }]}'

The setting only lives for the login session, but you can save it as a shell script (for example in ~/.local/bin/mac-tilde.shand run it on login (either with "Login items" in system settings or creating a .plist file in /Libary/LaunchDaemon6 )

The Apple documentation lists one more "non-US" key:

  • 0x32: "Keyboard Non-US # and ~"

While I've never needed to remap this key personally, others might find it useful.

Using Karabiner

First Karabiner Elements needs to be downloaded, installed and given the permissions it needs (launches wizard dialogs). Karabiner works by monitoring your keystrokes.

Present a virtual ANSI keyboard to MacOS

Karabiner settings for "virtual keyboard"

Activating a "virtual keyboard" with Karabiner (as an ANSI keyboard), activates the "Change keyboard type" feature in the keyboard settings.

'Change keyboard type' is to the left of 'Set up keyboard'

Settings -> Keyboard -> Change Keyboard Type

This opens the wizard dialog that asks you to press some keys on your keyboard, and pressing the keys that would be there on an ANSI layout makes MacOS identity the (virtual) keyboard as ANSI.

Press the Z (or the key labelled as Y if you have a German keyboard) key when asked for the key next to left shift, the key in that position on an ANSI layout. MacOS now takes your word for it and sets the virtual keyboard from Karabiner as an ANSI layout.

After this, remapping with hidutil works again. Sometimes the grave key will simply be in the right position.

Simple modification

Single keys are remapped with a "simple modifiction" in Karabiner

Remap "non_us_backslash" to "grave_accent"and_tilde (`)". You can also map them the other way, so that you get §± next to Z if you want.

Remap modifier keys

Customise keyboard modifiers

The escape key can easily be moved to caps lock in settings

Show path in Finder

By default Finder does not show the path to the directory you are in (and doesn't show a button to go to the parent path either).

$ defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES

After restarting Finder, this will show the current path in the titlebar (but it's not editable).

$ defaults write com.apple.finder ShowPathbar -bool true

Adds a visual representation of thr current path to the bottom of Finder windows.

Notes

Acessing notifications

Commands

Using Linux most of the time (and using the MacOS commandline almost all of the time to ssh to a Linux computer), these are commands for MacOS.

Routing table

Add a route:

$ route -n add -net ${cidr} ${gw}

Show route table:

$ netstat -rn

Side-note: it's not possible to configure routes in the network settings.

Gatekeeper

To enable or disable Gatekeeper:

$ sudo spctl --master-disable
$ sudo spctl --master-enable