Българска фонетична клавиатура на Mac: Ч на правилния клавиш

Готов keylayout файл и инсталация за две минути. Ч, Ю и Я на местата им, точно както си свикнал на Windows.
Идваш от Windows и знаеш клавиатурата наизуст. Клавишът вляво до Shift пише ч и пръстите ти го правят, без да мислиш.
Купуваш Mac. Инсталираш Bulgarian Phonetic. Натискаш същия клавиш и получаваш § или нищо. И така двадесет пъти на ден, всеки ден.
Решението не е да се преучиш. Решението е файл.
Този клавиш съществува само на ISO клавиатури - европейската подредба. Ако Mac-ът ти е с американска ANSI клавиатура, клавишът физически го няма и статията не важи за теб.
Проверката отнема секунда: погледни вляво от левия Shift. Ако там има допълнителен тесен клавиш - имаш ISO. Ако Shift-ът е широк и стига до края - имаш ANSI.
Бързият път
Ако не те интересува как работи, а само да проработи:
- Свали прикачения файл
Bulgarian-Phonetic-Windows.keylayoutот края на публикацията - Отвори Finder, натисни Shift+Cmd+G и напиши
~/Library/Keyboard Layouts - Ако папката я няма, създай я с това име
- Пусни файла вътре
- Излез от профила си и влез обратно
- System Settings, Keyboard, Input Sources, Edit, бутон +, търси "DTGaraGe"
Готово. Останалата част от статията обяснява какво точно се случва и как да си го промениш сам.
Какво е keylayout файл
macOS не знае какво пише всеки клавиш. Знае само номера на физическия клавиш - код 10, код 42, код 7. Кой символ да излезе при кой код се определя от XML файл с разширение
.keylayout.Всяка клавиатура в системата е такъв файл. Bulgarian Phonetic, US, German - всичките са XML.
Това означава, че нищо не е заключено. Можеш да напишеш свой файл и системата ще го третира точно като фабричен.
| Папка | За кого | Права |
|---|---|---|
| /System/Library/Keyboard Layouts/ | Системни, фабрични | Не се пипат |
| ~/Library/Keyboard Layouts/ | Само за теб | Без sudo |
| /Library/Keyboard Layouts/ | Всички профили | Изисква sudo |
Системната папка е защитена от SIP и не подлежи на редакция дори с sudo. Не е нужно да я пипаш - потребителската папка има приоритет.
Структурата, в едно изречение на елемент
| Елемент | Какво прави |
|---|---|
| keyboard | Коренът - id и име, което ще видиш в списъка |
| modifierMap | Кой модификатор кой слой включва |
| keyMapSet | Контейнерът на всички слоеве |
| keyMap index="0" | Един слой - нормален, Shift, Caps и така нататък |
| key code / output | Физически клавиш и символът, който извежда |
Слоевете в този файл са шест:
Code:
index 0 нормален
index 1 Shift
index 2 Caps Lock главни букви, цифрите остават цифри
index 3 Caps + Shift малки букви, цифрите дават символи
index 4 Option
index 5 Option + Shift
Разделянето на слоеве 2 и 3 е важно и е мястото, където повечето самоделни файлове грешат. Ако слой 2 просто наследи целия Shift слой, с включен Caps Lock цифрата 1 ще започне да пише удивителна. Затова слой 2 стъпва върху нормалния и подменя само буквите.
Ключовият ред в целия файл е един:
XML:
<key code="10" output="ч"/>
Код 10 е физическият клавиш вляво до Shift. Независимо какво е щамповано върху него, за системата той е код 10. Казваш му да пише ч и толкова.
Пълният код
Прикаченият файл е същият. Кодът е тук за тези, които искат да го прочетат или да го променят преди инсталация.
XML:
<?xml version="1.1" encoding="UTF-8"?>
<!DOCTYPE keyboard SYSTEM "file://localhost/System/Library/DTDs/KeyboardLayout.dtd">
<!--
Bulgarian Phonetic Windows Style - DTGaraGe Edition
Автор: Тони Ангелчовски | dtgarage.eu
Разлика от стандартния Apple Bulgarian Phonetic:
Клавиш § (code 10, вляво до Shift) = ч / Ч
Изисква ISO клавиатура (европейска подредба).
На американска ANSI клавиатура клавишът § физически не съществува.
Инсталация:
cp Bulgarian-Phonetic-Windows.keylayout ~/Library/Keyboard\ Layouts/
Logout -> Login -> System Settings -> Keyboard -> Input Sources -> Add
Слоеве:
index 0 = нормален
index 1 = Shift
index 2 = Caps Lock (главни букви, цифрите остават цифри)
index 3 = Caps + Shift (малки букви, цифрите дават символи)
index 4 = Option
index 5 = Option + Shift
-->
<keyboard group="126" id="-30008" name="Bulgarian Phonetic Windows DTGaraGe" maxout="1">
<layouts>
<layout first="0" last="17" mapSet="ANSI" modifiers="commonModifiers"/>
<layout first="18" last="18" mapSet="ANSI" modifiers="commonModifiers"/>
<layout first="21" last="23" mapSet="ANSI" modifiers="commonModifiers"/>
<layout first="30" last="30" mapSet="ANSI" modifiers="commonModifiers"/>
</layouts>
<modifierMap id="commonModifiers" defaultIndex="0">
<keyMapSelect mapIndex="0"><modifier keys=""/></keyMapSelect>
<keyMapSelect mapIndex="1"><modifier keys="anyShift"/></keyMapSelect>
<keyMapSelect mapIndex="2"><modifier keys="caps"/></keyMapSelect>
<keyMapSelect mapIndex="3"><modifier keys="anyShift caps"/></keyMapSelect>
<keyMapSelect mapIndex="4"><modifier keys="anyOption"/></keyMapSelect>
<keyMapSelect mapIndex="5"><modifier keys="anyShift anyOption"/></keyMapSelect>
</modifierMap>
<keyMapSet id="ANSI">
<!-- ============================================================
INDEX 0 - нормален слой
============================================================ -->
<keyMap index="0">
<key code="10" output="ч"/> <!-- § -> ч ГЛАВНАТА ПРОМЯНА -->
<!-- Горен буквен ред -->
<key code="12" output="я"/> <!-- Q -->
<key code="13" output="в"/> <!-- W -->
<key code="14" output="е"/> <!-- E -->
<key code="15" output="р"/> <!-- R -->
<key code="17" output="т"/> <!-- T -->
<key code="16" output="ъ"/> <!-- Y -->
<key code="32" output="у"/> <!-- U -->
<key code="34" output="и"/> <!-- I -->
<key code="31" output="о"/> <!-- O -->
<key code="35" output="п"/> <!-- P -->
<key code="33" output="ш"/> <!-- [ -->
<key code="30" output="щ"/> <!-- ] -->
<!-- Среден буквен ред -->
<key code="0" output="а"/> <!-- A -->
<key code="1" output="с"/> <!-- S -->
<key code="2" output="д"/> <!-- D -->
<key code="3" output="ф"/> <!-- F -->
<key code="5" output="г"/> <!-- G -->
<key code="4" output="х"/> <!-- H -->
<key code="38" output="й"/> <!-- J -->
<key code="40" output="к"/> <!-- K -->
<key code="37" output="л"/> <!-- L -->
<key code="41" output=";"/> <!-- ; -->
<key code="39" output="'"/> <!-- ' -->
<key code="42" output="ю"/> <!-- \ -->
<!-- Долен буквен ред -->
<key code="6" output="з"/> <!-- Z -->
<key code="7" output="ь"/> <!-- X -->
<key code="8" output="ц"/> <!-- C -->
<key code="9" output="ж"/> <!-- V -->
<key code="11" output="б"/> <!-- B -->
<key code="45" output="н"/> <!-- N -->
<key code="46" output="м"/> <!-- M -->
<key code="43" output=","/> <!-- , -->
<key code="47" output="."/> <!-- . -->
<key code="44" output="/"/> <!-- / -->
<!-- Цифров ред -->
<key code="50" output="`"/>
<key code="18" output="1"/>
<key code="19" output="2"/>
<key code="20" output="3"/>
<key code="21" output="4"/>
<key code="23" output="5"/>
<key code="22" output="6"/>
<key code="26" output="7"/>
<key code="28" output="8"/>
<key code="25" output="9"/>
<key code="29" output="0"/>
<key code="27" output="-"/>
<key code="24" output="="/>
<!-- Управляващи -->
<key code="36" action="return"/>
<key code="48" action="tab"/>
<key code="49" output=" "/>
<key code="51" action="delete"/>
<key code="53" output=""/>
<!-- Цифрова клавиатура -->
<key code="65" output="."/>
<key code="67" output="*"/>
<key code="69" output="+"/>
<key code="71" output=""/>
<key code="75" output="/"/>
<key code="76" output=""/>
<key code="78" output="-"/>
<key code="81" output="="/>
<key code="82" output="0"/>
<key code="83" output="1"/>
<key code="84" output="2"/>
<key code="85" output="3"/>
<key code="86" output="4"/>
<key code="87" output="5"/>
<key code="88" output="6"/>
<key code="89" output="7"/>
<key code="91" output="8"/>
<key code="92" output="9"/>
<!-- Навигация -->
<key code="114" output=""/>
<key code="115" output=""/>
<key code="116" output=""/>
<key code="117" output=""/>
<key code="119" output=""/>
<key code="121" output=""/>
<key code="123" output=""/>
<key code="124" output=""/>
<key code="125" output=""/>
<key code="126" output=""/>
</keyMap>
<!-- ============================================================
INDEX 1 - Shift
============================================================ -->
<keyMap index="1">
<key code="10" output="Ч"/> <!-- Shift + § -> Ч -->
<key code="12" output="Я"/>
<key code="13" output="В"/>
<key code="14" output="Е"/>
<key code="15" output="Р"/>
<key code="17" output="Т"/>
<key code="16" output="Ъ"/>
<key code="32" output="У"/>
<key code="34" output="И"/>
<key code="31" output="О"/>
<key code="35" output="П"/>
<key code="33" output="Ш"/>
<key code="30" output="Щ"/>
<key code="0" output="А"/>
<key code="1" output="С"/>
<key code="2" output="Д"/>
<key code="3" output="Ф"/>
<key code="5" output="Г"/>
<key code="4" output="Х"/>
<key code="38" output="Й"/>
<key code="40" output="К"/>
<key code="37" output="Л"/>
<key code="41" output=":"/>
<key code="39" output="""/>
<key code="42" output="Ю"/>
<key code="6" output="З"/>
<key code="7" output="Ь"/>
<key code="8" output="Ц"/>
<key code="9" output="Ж"/>
<key code="11" output="Б"/>
<key code="45" output="Н"/>
<key code="46" output="М"/>
<key code="43" output="<"/>
<key code="47" output=">"/>
<key code="44" output="?"/>
<key code="50" output="~"/>
<key code="18" output="!"/>
<key code="19" output="@"/>
<key code="20" output="#"/>
<key code="21" output="$"/>
<key code="23" output="%"/>
<key code="22" output="^"/>
<key code="26" output="&"/>
<key code="28" output="*"/>
<key code="25" output="("/>
<key code="29" output=")"/>
<key code="27" output="_"/>
<key code="24" output="+"/>
<key code="36" action="return"/>
<key code="48" action="tab"/>
<key code="49" output=" "/>
<key code="51" action="delete"/>
<key code="53" output=""/>
<key code="65" output="."/>
<key code="67" output="*"/>
<key code="69" output="+"/>
<key code="71" output=""/>
<key code="75" output="/"/>
<key code="76" output=""/>
<key code="78" output="-"/>
<key code="81" output="="/>
<key code="82" output="0"/>
<key code="83" output="1"/>
<key code="84" output="2"/>
<key code="85" output="3"/>
<key code="86" output="4"/>
<key code="87" output="5"/>
<key code="88" output="6"/>
<key code="89" output="7"/>
<key code="91" output="8"/>
<key code="92" output="9"/>
<key code="114" output=""/>
<key code="115" output=""/>
<key code="116" output=""/>
<key code="117" output=""/>
<key code="119" output=""/>
<key code="121" output=""/>
<key code="123" output=""/>
<key code="124" output=""/>
<key code="125" output=""/>
<key code="126" output=""/>
</keyMap>
<!-- ============================================================
INDEX 2 - Caps Lock
Главни букви, но цифровият ред остава цифри.
Затова базата е index 0, а не index 1.
============================================================ -->
<keyMap index="2" baseMapSet="ANSI" baseIndex="0">
<key code="10" output="Ч"/>
<key code="12" output="Я"/>
<key code="13" output="В"/>
<key code="14" output="Е"/>
<key code="15" output="Р"/>
<key code="17" output="Т"/>
<key code="16" output="Ъ"/>
<key code="32" output="У"/>
<key code="34" output="И"/>
<key code="31" output="О"/>
<key code="35" output="П"/>
<key code="33" output="Ш"/>
<key code="30" output="Щ"/>
<key code="0" output="А"/>
<key code="1" output="С"/>
<key code="2" output="Д"/>
<key code="3" output="Ф"/>
<key code="5" output="Г"/>
<key code="4" output="Х"/>
<key code="38" output="Й"/>
<key code="40" output="К"/>
<key code="37" output="Л"/>
<key code="42" output="Ю"/>
<key code="6" output="З"/>
<key code="7" output="Ь"/>
<key code="8" output="Ц"/>
<key code="9" output="Ж"/>
<key code="11" output="Б"/>
<key code="45" output="Н"/>
<key code="46" output="М"/>
</keyMap>
<!-- ============================================================
INDEX 3 - Caps Lock + Shift
Малки букви, цифровият ред дава символи (както в Windows).
============================================================ -->
<keyMap index="3" baseMapSet="ANSI" baseIndex="1">
<key code="10" output="ч"/>
<key code="12" output="я"/>
<key code="13" output="в"/>
<key code="14" output="е"/>
<key code="15" output="р"/>
<key code="17" output="т"/>
<key code="16" output="ъ"/>
<key code="32" output="у"/>
<key code="34" output="и"/>
<key code="31" output="о"/>
<key code="35" output="п"/>
<key code="33" output="ш"/>
<key code="30" output="щ"/>
<key code="0" output="а"/>
<key code="1" output="с"/>
<key code="2" output="д"/>
<key code="3" output="ф"/>
<key code="5" output="г"/>
<key code="4" output="х"/>
<key code="38" output="й"/>
<key code="40" output="к"/>
<key code="37" output="л"/>
<key code="42" output="ю"/>
<key code="6" output="з"/>
<key code="7" output="ь"/>
<key code="8" output="ц"/>
<key code="9" output="ж"/>
<key code="11" output="б"/>
<key code="45" output="н"/>
<key code="46" output="м"/>
</keyMap>
<!-- ============================================================
INDEX 4 - Option
Базата е index 0, за да не онемеят клавишите под Option.
============================================================ -->
<keyMap index="4" baseMapSet="ANSI" baseIndex="0">
<key code="10" output="§"/> <!-- Option + § -> оригиналният § -->
<key code="18" output="¡"/>
<key code="19" output="™"/>
<key code="20" output="£"/>
<key code="21" output="¢"/>
<key code="23" output="∞"/>
<key code="22" output="§"/>
<key code="26" output="¶"/>
<key code="28" output="•"/>
<key code="25" output="ª"/>
<key code="29" output="º"/>
<key code="27" output="-"/>
<key code="24" output="≠"/>
<key code="43" output="„"/>
<key code="47" output="“"/>
</keyMap>
<!-- ============================================================
INDEX 5 - Option + Shift
============================================================ -->
<keyMap index="5" baseMapSet="ANSI" baseIndex="1">
<key code="10" output="±"/>
<key code="24" output="±"/>
<key code="27" output="-"/>
<key code="43" output="«"/>
<key code="47" output="»"/>
</keyMap>
</keyMapSet>
<actions>
<action id="delete">
<when state="none" output=""/>
</action>
<action id="return">
<when state="none" output="
"/>
</action>
<action id="tab">
<when state="none" output="	"/>
</action>
</actions>
</keyboard>
Инсталация през терминала
Ако предпочиташ терминала пред Finder:
Bash:
# създай папката, ако я няма
mkdir -p ~/Library/Keyboard\ Layouts
# копирай файла от Downloads
cp ~/Downloads/Bulgarian-Phonetic-Windows.keylayout ~/Library/Keyboard\ Layouts/
# провери
ls -l ~/Library/Keyboard\ Layouts/
За всички профили на машината:
Bash:
sudo cp ~/Downloads/Bulgarian-Phonetic-Windows.keylayout /Library/Keyboard\ Layouts/
Задължителен е logout и login. macOS чете keylayout файловете само при вход в профила. Без това новата подредба няма да се появи в списъка и ще решиш, че нещо не е станало.
Рестарт също върши работа, но е излишен.
Ако го пишеш на ръка
Копи-пейст в текстов редактор е най-честият източник на счупени файлове. Ако все пак минеш по този път:
TextEdit изисква Format, Make Plain Text преди запис. По подразбиране записва форматиран текст и файлът става негоден, макар да изглежда наред.
Разширението трябва да е .keylayout, не .keylayout.txt. Finder крие разширенията по подразбиране - включи ги от Finder, Settings, Advanced.
По-добрият вариант е редактор, който не се меси: BBEdit, TextMate, VS Code или nano в терминала.
Активиране
- System Settings, после Keyboard
- Input Sources, бутон Edit
- Бутонът + долу вляво
- Търси "DTGaraGe" или превърти до Bulgarian
- Избери Bulgarian Phonetic Windows DTGaraGe и натисни Add
Превключването е от иконата в лентата горе или с Control+Space, ако си оставил стандартната комбинация.
Полезно: в същия панел има отметка "Show Input menu in menu bar". Ако я няма включена, няма да виждаш коя подредба е активна и ще се чудиш защо пише грешно.
Проверка
| Натискаш | Трябва да пише |
|---|---|
| § (вляво до Shift) | ч |
| Shift + § | Ч |
| Option + § | § (оригиналът, ако ти трябва) |
| A S D F | а с д ф |
| Caps Lock, после 1 | 1, не удивителна |
| Цифри от numpad | Цифри |
| Стрелки | Курсорът се движи |
Последните три реда не са излишни. Точно там се чупят самоделните keylayout файлове - клавиши, дефинирани с празен изход, спират да работят напълно, а човек го забелязва чак след седмица.
Има и вграден инструмент: System Settings, Keyboard, отметката за визуална клавиатура. Показва живата подредба на екрана и веднага виждаш кое къде е.
Ако не работи
| Проблем | Причина | Решение |
|---|---|---|
| Не се появява в списъка | Няма logout | Излез и влез отново |
| Пак пише § или нищо | Активна е старата подредба | Виж иконата в лентата |
| Файлът не се вижда | Записан като .txt или RTF | Plain Text и правилно разширение |
| Няма такъв клавиш | ANSI клавиатура | Ремапни друг код по избор |
| Част от клавишите мълчат | Дефинирани с празен изход | Свали файла оттук наново |
Ако системата зареди файла, но нещо се държи странно, изтрий го, излез от профила, влез, върни го и излез пак. macOS кешира подредбите и понякога държи стара версия.
Картата на клавишите
Code:
§ -> ч Q -> я W -> в E -> е R -> р T -> т
Y -> ъ U -> у I -> и O -> о P -> п
[ -> ш ] -> щ
A -> а S -> с D -> д F -> ф G -> г
H -> х J -> й K -> к L -> л
\ -> ю
Z -> з X -> ь C -> ц V -> ж B -> б
N -> н M -> м
Ако искаш ч на друг клавиш, смени само номера в реда с output="ч". Номерата се виждат във всеки редактор на подредби, или просто ги преброй от таблицата горе.
In English
How to add a Bulgarian Phonetic keyboard on macOS with the Windows key placement:
1. Download the attached
Bulgarian-Phonetic-Windows.keylayout file.2. Move it to
~/Library/Keyboard Layouts/ (create the folder if missing).3. Log out and log back in - macOS only reads layout files at login.
4. Go to System Settings, Keyboard, Input Sources, Edit, then press +.
5. Search for "DTGaraGe" and add the layout.
The layout matches the standard Bulgarian Phonetic arrangement, with one change: the ISO key to the left of the left Shift outputs ч and Ч instead of §. Option plus that key still gives you the original § character.
Requires an ISO keyboard. On US ANSI keyboards that physical key does not exist.
Цялата macOS серия: aiflux.eu/macos-mastery
Ако имаш друг клавиш, който искаш да ремапнеш, пиши в темата - файлът се променя за минута.
Ключови думи: българска фонетична клавиатура mac, bulgarian phonetic macos, keylayout файл, ч на mac клавиатура, ремап на клавиш macos, кирилица на mac, bulgarian phonetic windows style, input sources macos, персонализирана клавиатурна подредба
Източници: Apple Keyboard Layout DTD, документация за Input Sources в macOS, собствена практика.
toni@dtgarage:~$ whoami
Тони Ангелчовски | Ексклузивно за DTGaraGe
toni@dtgarage:~$ cat LICENSE
Копирането и препубликуването без разрешение не е позволено.
toni@dtgarage:~$ ./support.sh
Подкрепи DTGaraGe и независимото техническо съдържание
toni@dtgarage:~$ █
Тони Ангелчовски | Ексклузивно за DTGaraGe
toni@dtgarage:~$ cat LICENSE
toni@dtgarage:~$ ./support.sh
toni@dtgarage:~$ █
Attachments
Last edited: