KEYMAPS(5) فایل‌های پیکربندی KEYMAPS(5)

keymaps - توصیف جداول صفحه‌کلید برای loadkeys و dumpkeys

این فایل‌ها توسط loadkeys(1) برای اصلاح جدول‌های تبدیل مورد استفاده توسط راه‌انداز صفحه‌کلید هسته به کار می‌روند و توسط dumpkeys(1) از همان جدول‌های تبدیل تولید می‌شوند.

قالب این فایل‌ها تا حدودی شبیه به قالبی است که توسط xmodmap(1) پذیرفته می‌شود. این فایل شامل خطوط تعریف مجموعهنویسه (charset)، کلید یا رشته است که با توضیحات (کامنت‌ها) درآمیخته شده‌اند.

توضیحات با نویسه‌های ! یا # آغاز می‌شوند و تا انتهای خط ادامه می‌یابند. هر چیزی که پس از یکی از این نویسه‌ها در آن خط قرار گیرد نادیده گرفته می‌شود. توجه داشته باشید که برخلاف xmodmap(1), نیازی نیست توضیحات از ستون اول شروع شوند.

نحو فایل‌های نگاشت کلید خط‌محور است؛ یک تعریف کامل باید در یک خط منطقی واحد بگنجد. با این حال، خطوط منطقی می‌توانند با قرار دادن نویسه بک‌اسلش (\) در انتهای هر زیرخط، به چندین خط فیزیکی تقسیم شوند.

یک نگاشت کلید می‌تواند با استفاده از نحو زیر، نگاشت‌های کلید دیگر را ضمیمه کند:

include "pathname"

یک خط تعریف مجموعهنویسه به این صورت است:

charset "iso-8859-x"

این خط تعیین می‌کند که keysymهای بعدی چگونه باید تفسیر شوند. برای نمونه، در iso-8859-1 نماد mu (یا میکرو) کد 0265 دارد، در حالی که در iso-8859-7 حرف mu دارای کد 0354 است.

هر خط تعریف کامل کلید به این صورت است:

keycode keynumber = keysym keysym keysym...

keynumber شماره شناسایی داخلی کلید است که تقریباً معادل کد اسکن (scan code) آن می‌باشد. keynumber می‌تواند در نمادگذاری ده‌دهی، هشت‌هشتی یا شانزده‌شانزدهی مشخص شود. سیستم هشت‌هشتی با یک صفر در ابتدا و شانزده‌شانزدهی با پیشوند 0x مشخص می‌شود.

هر یک از keysymها نمایانگر کنش‌های صفحه‌کلید هستند که تا ۲۵۶ مورد از آن‌ها را می‌توان به یک کلید اختصاص داد. کنش‌های در دسترس شامل ارسال کدهای نویسه یا توالی‌های نویسه، تغییر کنسول‌ها یا نگاشت‌های کلید، راه‌اندازی مجدد سیستم و غیره است. (فهرست کامل را می‌توان از dumpkeys(1) با اجرای dumpkeys -l به دست آورد.)

هر keysym می‌تواند دارای پیشوند '+' (علامت مثبت) باشد، که در این صورت این keysym به عنوان یک «حرف» در نظر گرفته می‌شود و بنابراین همانند "Shift"، تحت تأثیر "CapsLock" نیز قرار می‌گیرد (به بیان دقیق‌تر، CapsLock وضعیت Shift را معکوس می‌کند). حروف اسکی ('a'-'z' و 'A'-'Z') به صورت پیش‌فرض قابلیت تأثیرپذیری از CapsLock را دارند. اگر فشردن Shift+CapsLock نباید نمادی با حروف کوچک تولید کند، خطوطی مانند:

keycode 30 = +a  A

را در فایل نگاشت قرار دهید.

اینکه کدام‌یک از کنش‌های متصل به یک کلید هنگام فشرده شدن آن انجام شود، به این بستگی دارد که در آن لحظه چه تبدیل‌کننده‌هایی فعال هستند. راه‌انداز صفحه‌کلید از ۹ تبدیل‌کننده پشتیبانی می‌کند. این تبدیل‌کننده‌ها (به صورت کاملاً دلخواه) به این عناوین برچسب‌گذاری شده‌اند: Shift، AltGr، Control، Alt، ShiftL، ShiftR، CtrlL، CtrlR و CapsShift. هر یک از این تبدیل‌کننده‌ها طبق جدول زیر، دارای وزن متناظری از توان‌های دو هستند:

weight

Shift 1
AltGr 2
Control 4
Alt 8
ShiftL 16
ShiftR 32
CtrlL 64
CtrlR 128
CapsShift 256

کنش مؤثر یک کلید با جمع زدن وزن‌های تمام تبدیل‌کننده‌های فعال مشخص می‌شود. به صورت پیش‌فرض هیچ تبدیل‌کننده‌ای فعال نیست، بنابراین هنگام فشرده شدن یا رها شدن کلید، کنش شماره صفر، یعنی کنشی که در ستون نخست خط تعریف کلید قرار دارد، اعمال می‌شود. برای نمونه هنگامی که تبدیل‌کننده‌های Shift و Alt فعال باشند، کنش شماره نه (از ستون دهم) کنش مؤثر خواهد بود.

تغییر وضعیت تبدیل‌کننده‌های فعال را می‌توان با اختصاص دادن کنش‌های مناسب به کلیدهای دلخواه انجام داد. برای نمونه، متصل کردن نماد Shift به یک کلید، تبدیل‌کننده Shift را در هنگام فشردن آن کلید فعال می‌کند و با رها کردن کلید، اثر آن تبدیل‌کننده لغو می‌شود. اختصاص دادن AltGr_Lock به یک کلید، با فشردن کلید تبدیل‌کننده AltGr را فعال می‌کند و با فشردن دوباره آن، این اثر لغو می‌شود. (به صورت پیش‌فرض Shift، AltGr، Control و Alt به کلیدهایی متصل هستند که برچسب مشابهی دارند؛ AltGr ممکن است نشان‌دهنده کلید Alt سمت راست باشد.)

توجه داشته باشید که هنگام اختصاص دادن کلیدهای تبدیل‌کننده باید بسیار مراقب باشید، در غیر این صورت ممکن است به یک نگاشت صفحه‌کلید غیرقابل‌استفاده منجر شود. برای نمونه اگر کلیدی را طوری تعریف کنید که در ستون اول خود Control داشته باشد و باقی ستون‌ها را به صورت VoidSymbol رها کنید، دچار مشکل خواهید شد. چرا که فشردن کلید، تبدیل‌کننده Control را فعال می‌کند و کنش‌های بعدی از ستون پنجم خوانده می‌شوند (جدول بالا را ببینید). بنابراین، هنگامی که کلید را رها می‌کنید، کنش از ستون پنجم برداشته می‌شود. آن ستون حاوی VoidSymbol است، پس هیچ اتفاقی نمی‌افتد. این یعنی اگرچه کلید را رها کرده‌اید، اما تبدیل‌کننده Control همچنان فعال است. فشردن و رها کردن دوباره کلید نیز اثری ندارد. برای جلوگیری از این وضعیت، باید همواره تمام ستون‌ها را طوری تعریف کنید که نماد تبدیل‌کننده یکسانی داشته باشند. یک روش خلاصه‌نویسی کاربردی برای این کار وجود دارد که در ادامه شرح داده شده است.

keysymها می‌توانند در نمادگذاری ده‌دهی، هشت‌هشتی، شانزده‌شانزدهی، یونیکد یا نمادین مشخص شوند. نمادگذاری‌های عددی از همان قالب keynumber استفاده می‌کنند. نمادگذاری یونیکد به صورت "U+" و به دنبال آن چهار رقم شانزده‌شانزدهی است. نمادگذاری نمادین شبیه به قالب مورد استفاده در xmodmap(1) است. تفاوت‌های قابل توجه در نمادهای اعداد است. نمادهای عددی '0'، ...، '9' در xmodmap(1) با واژه‌های متناظر 'zero'، 'one'، ... 'nine' جایگزین شده‌اند تا از تداخل با نمادگذاری عددی جلوگیری شود.

باید توجه داشت که استفاده از نمادگذاری عددی برای keysymها بسیار غیرقابل‌حمل است، زیرا شماره‌های کنش کلید ممکن است از یک نسخه هسته به نسخه دیگر تفاوت داشته باشد و بنابراین استفاده از نمادگذاری‌های عددی به شدت نهی شده است. این روش تنها زمانی کاربرد دارد که مطمئن باشید در هسته شما کنش صفحه‌کلید پشتیبانی‌شده‌ای وجود دارد که نسخه فعلی loadkeys(1) شما نام نمادینی برای آن ندارد.

تعدادی نمادگذاری خلاصه‌نویسی برای بهبود خوانایی و کاهش زحمت تایپ و احتمال بروز خطاهای نگارشی وجود دارد.

پیش از هر چیز، می‌توانید یک خط مشخصات نگاشت به این صورت ارائه دهید:

keymaps 0-2,4-5,8,12

تا مشخص کنید که خطوط نگاشت کلید تمامی ۲۵۶ ستون را تعیین نخواهند کرد، بلکه تنها ستون‌های مشخص‌شده را تعریف می‌کنند. (در این مثال: فقط نگاشت‌های plain، Shift، AltGr، Control، Control+Shift، Alt و Control+Alt؛ یعنی ۷ ستون به جای ۲۵۶ ستون.) اگر چنین خطی ارائه نشود، نگاشت‌های کلید 0-M تعریف خواهند شد، که در آن M+1 بیشترین تعداد ورودی‌های یافت‌شده در هر خط تعریف است.

سپس، می‌توانید ورودی‌های VoidSymbol پایانی را از یک خط تعریف کلید حذف کنید. VoidSymbol نشان‌دهنده کنش صفحه‌کلیدی است که هیچ خروجی‌ای تولید نمی‌کند و هیچ اثر دیگری نیز ندارد. برای نمونه، جهت تعریف کلید شماره ۳۰ برای خروجی دادن 'a' در حالت عادی، 'A' در هنگام فشردن با Shift، و انجام ندادن هیچ کاری در هنگام فشردن با AltGr یا سایر تبدیل‌کننده‌ها، می‌توانید به این صورت بنویسید:

keycode  30 = a	A

به جای این حالت طولانی‌تر:

keycode  30 = a	A	VoidSymbol	VoidSymbol \
		VoidSymbol VoidSymbol VoidSymbol ...

برای راحتی بیشتر، معمولاً می‌توانید از تعاریف بسیار فشرده‌تری نیز بهره ببرید. اگر یک خط تعریف کلید را فقط و دقیقاً با یک کد کنش پس از علامت مساوی وارد کنید، معنای ویژه‌ای خواهد داشت. اگر آن کد (عددی یا نمادین) یک حرف اسکی نباشد، به این معنی است که کد به طور ضمنی در تمام ستون‌های در حال تعریف تکرار می‌شود. از طرف دیگر، اگر کد کنش یک نویسه اسکی در محدوده 'a'، ...، 'z' یا 'A'، ...، 'Z' در توالی ترتیبی اسکی باشد، در صورتی که این ترکیب‌های تبدیل‌کننده واقعاً در حال تعریف باشند، تعاریف زیر برای آن‌ها انجام می‌گیرد. (جدول زیر دو حالت ممکن را فهرست می‌کند: یا کد کنش تکی یک حرف کوچک است که با 'x' نشان داده شده، یا یک حرف بزرگ است که با 'Y' مشخص گردیده است.)

symbol
x Y
X y
x Y
X y
Control_x Control_y
Control_x Control_y
Control_x Control_y
Control_x Control_y
Meta_x Meta_Y
Meta_X Meta_y
Meta_x Meta_Y
Meta_X Meta_y
Meta_Control_x Meta_Control_y
Meta_Control_x Meta_Control_y
Meta_Control_x Meta_Control_y
Meta_Control_x Meta_Control_y

تمام اشکال قبلی خطوط تعریف کلید همواره تمامی M+1 ترکیب تبدیل‌کننده ممکن را تعریف می‌کنند، صرف‌نظر از اینکه خط واقعاً شامل آن تعداد کد کنش باشد یا خیر. با این حال، گونه دیگری از نحو تعریف برای مشخص کردن تک‌کنش‌ها برای یک ترکیب تبدیل‌کننده خاص از یک کلید وجود دارد. این ویژگی به‌ویژه زمانی سودمند است که نگاشت کلیدی را بارگذاری می‌کنید که تنها در برخی ترکیب‌های تبدیل‌کننده (مانند AltGr+کلیدهای عاملی) با نیاز شما سازگار نیست. در چنین حالتی می‌توانید یک فایل محلی کوچک بسازید که تنها آن ترکیب‌های تبدیل‌کننده را بازتعریف کند و آن را پس از فایل اصلی بارگذاری نمایید. نحو این ساختار به صورت زیر است:

{ plain | <modifier sequence> } keycode keynumber = keysym

، برای نمونه:

plain keycode 14 = BackSpace
control alt keycode 83 = Boot
alt keycode 105 = Decr_Console
alt keycode 106 = Incr_Console
استفاده از "plain" تنها ورودی پایه یک کلید (یعنی زمانی که هیچ تبدیل‌کننده‌ای فعال نیست) را بدون تغییر انتساب‌های سایر ترکیب‌های تبدیل‌کننده آن کلید تعریف می‌کند.

علاوه بر توضیحات و خطوط تعریف کلید، یک نگاشت کلید می‌تواند شامل تعریف‌های رشته باشد. از این تعریف‌ها برای تعیین آنچه هر کد کنش کلید عاملی ارسال می‌کند، استفاده می‌شود. نحو تعریف‌های رشته به صورت زیر است:

string keysym = "text"

text می‌تواند شامل نویسه‌های حرفی، کدهای نویسه هشت‌هشتی در قالب بک‌اسلش و به دنبال آن حداکثر سه رقم هشت‌هشتی، و سه توالی گریز \n، \\ و \" به ترتیب برای خط جدید، بک‌اسلش و نقل‌قول باشد.

همچنین ممکن است تعریف‌های ترکیب (compose) نیز وجود داشته باشد. ساختار آن‌ها به این صورت است:

compose 'char' 'char' to 'char'
و چگونگی ترکیب دو بایت برای تشکیل بایت سوم را توصیف می‌کنند (هنگامی که از یک اکسنت مرده یا کلید compose استفاده می‌شود). از این قابلیت برای دریافت حروف دارای اعراب و موارد مشابه در صفحه‌کلید استاندارد استفاده می‌شود.

کوتاه‌نوشت‌های مختلفی را می‌توان با kbd-0.96 و نسخه‌های پس از آن به کار برد.

مقادیر معمول رشته‌ها را تعریف می‌کند (اما نه کلیدهایی را که به آن‌ها متصل هستند).
ترکیب‌های معمول compose را تعریف می‌کند.

برای آگاهی از اینکه چه keysymهایی برای استفاده در نگاشت‌های کلید در دسترس هستند، از دستور زیر استفاده کنید:

dumpkeys --long-info

متأسفانه در حال حاضر هیچ توضیحی درباره اینکه هر نماد چه کاری انجام می‌دهد وجود ندارد؛ باید آن را از روی نام حدس زد یا از کدهای منبع هسته استخراج کرد.

(دقت کنید که از یک خط keymaps استفاده نمایید، مانند نخستین خط `dumpkeys` یا "keymaps 0-15" یا مشابه آن.)

ورودی زیر جای کلید Control سمت چپ و کلید Caps Lock را در صفحه‌کلید با یکدیگر عوض می‌کند:

keycode  58 = Control
keycode  29 = Caps_Lock

کلید شماره ۵۸ معمولاً کلید Caps Lock و کلید شماره ۲۹ معمولاً کلید Control است.

ورودی زیر کلیدهای Shift و Caps Lock را طوری تنظیم می‌کند که عملکرد بهتری داشته باشند، شبیه به ماشین‌تحریرهای قدیمی. بدین صورت که یک یا چند بار فشردن کلید Caps Lock صفحه‌کلید را در وضعیت CapsLock قرار می‌دهد و فشردن هر یک از کلیدهای Shift آن را آزاد می‌کند.

keycode  42 = Uncaps_Shift
keycode  54 = Uncaps_Shift
keycode  58 = Caps_On

ورودی زیر چیدمان کلیدهای ویرایشی را در صفحه‌کلید پیشرفته به گونه‌ای تنظیم می‌کند که بیشتر شبیه به پایانه‌های سری VT200 باشد:

keycode 102 = Insert
keycode 104 = Remove
keycode 107 = Prior
shift keycode 107 = Scroll_Backward
keycode 110 = Find
keycode 111 = Select
control alt   keycode 111 = Boot
control altgr keycode 111 = Boot

در اینجا مثالی برای متصل کردن رشته "du\ndf\n" به کلید AltGr-D آمده است. ما از کد کنش «یدکی» F100 استفاده می‌کنیم که به طور معمول به هیچ کلیدی متصل نیست.

altgr keycode 32 = F100
string F100 = "du\ndf\n"

Andries Brouwer <aeb@cwi.nl>

loadkeys(1), dumpkeys(1), showkey(1), xmodmap(1)

۲۴ آوریل ۱۹۹۸ kbd