XMODMAP(1) General Commands Manual XMODMAP(1)

xmodmap - ابزاری برای تغییر نگاشت کلیدها و دکمه‌های اشاره‌گر در X

xmodmap [-options ...] [filename]

برنامهٔ xmodmap برای ویرایش و نمایش modifier map (نگاشت کلیدهای تغییردهنده) و keymap table (جدول نگاشت کلید) صفحه‌کلید به کار می‌رود؛ سازوکارهایی که برنامه‌های کلاینت از آن‌ها برای تبدیل کدهای کلید (keycodes) ناشی از رویدادها به نمادهای کلید (keysyms) بهره می‌برند.

در نسخه‌های پیشین X11، این برنامه معمولاً از اسکریپت راه‌اندازی نشست (session) کاربر اجرا می‌شد تا صفحه‌کلید مطابق سلیقهٔ فردی پیکربندی شود. در نسخه‌های امروزی X11، بیشتر کاربردهای xmodmap برای اصلاح پیکربندی صفحه‌کلید، با استفاده از گزینه‌های XKB جایگزین شده است؛ چه از طریق گزینه‌های پیکربندی کارساز X، ترجیحات محیط رومیزی، یا استفاده از دستورهایی مانند setxkbmap(1).

گزینه‌های زیر می‌توانند به همراه xmodmap استفاده شوند:

این گزینه میزبان و نمایشگر (display) مورد استفاده را مشخص می‌کند.
این گزینه مشخص می‌کند که توضیحی کوتاه دربارهٔ آرگومان‌های خط فرمان باید در خروجی خطای استاندارد چاپ شود. همچنین هر زمان که یک آرگومان پردازش‌نشده به xmodmap داده شود، این کار انجام خواهد شد.
این گزینه مشخص می‌کند که یک پیام راهنما در توصیف دستور زبان (grammar) عبارت‌های استفاده‌شده در فایل‌ها و عبارت‌های همراه با -e باید در خطای استاندارد چاپ شود.
این گزینه مشخص می‌کند که xmodmap باید اطلاعات نسخهٔ خود را چاپ کرده و خارج شود.
این گزینه مشخص می‌کند که xmodmap باید اطلاعات گزارش‌گیری (logging) را هم‌زمان با تجزیهٔ ورودی خود چاپ کند.
این گزینه گزارش‌گیری پرحرف (verbose) را غیرفعال می‌کند. این حالت پیش‌فرض است.
این گزینه مشخص می‌کند که xmodmap نباید نگاشت‌ها را تغییر دهد، بلکه باید نمایش دهد چه کارهایی انجام خواهد داد؛ شبیه به کاری که دستور make(1) هنگام دریافت این گزینه انجام می‌دهد.
این گزینه عبارتی را برای اجرا تعیین می‌کند. می‌توان هر تعداد عبارت را از طریق خط فرمان مشخص کرد.
این گزینه مشخص می‌کند که نگاشت کنونی کلیدهای تغییردهنده (modifier map) باید در خروجی استاندارد چاپ شود. اگر گزینهٔ حالت دیگری تعیین نشده باشد، این حالت پیش‌فرض اجرای برنامه است.
این گزینه مشخص می‌کند که جدول کنونی نگاشت کلیدها (keymap table) باید در خروجی استاندارد چاپ شود.
این گزینه مشخص می‌کند که جدول کنونی نگاشت کلیدها باید به شکل عبارت‌هایی که مجدداً قابلیت ارسال به xmodmap را دارند، در خروجی استاندارد چاپ شود.
این گزینه مشخص می‌کند که نگاشت کنونی دکمه‌های اشاره‌گر (pointer map) باید در خروجی استاندارد چاپ شود.
-
یک خط تیرهٔ تنها به این معناست که ورودی استاندارد باید به عنوان فایل ورودی استفاده شود.

آرگومان filename فایلی حاوی عبارت‌های xmodmap را جهت اجرا تعیین می‌کند. این فایل معمولاً در دایرکتوری خانگی کاربر با نامی مانند .xmodmaprc نگهداری می‌شود..SH "دستور زبان عبارت‌ها (EXPRESSION GRAMMAR)" برنامهٔ xmodmap فهرستی از عبارت‌ها را می‌خواند و پیش از اقدام به اجرای هر یک، تمامی آن‌ها را تجزیه می‌کند. این ویژگی ارجاع به keysymهایی را که در حال بازتعریف هستند، به شکلی طبیعی و بدون نگرانی زیاد بابت تداخل نام‌ها ممکن می‌سازد.

فهرست نام‌های keysym را می‌توان در فایل سرآیند <X11/keysymdef.h> (بدون پیشوند XK_) یافت. keysymهای منطبق با نویسه‌های یونیکد را می‌توان برای تمامی نویسه‌های ممکن یونیکد به‌صورت "U0020" تا "U007E" و "U00A0" تا "U10FFFF" مشخص کرد.

فهرست keysymها به keycode مشخص‌شده انتساب می‌یابد (که می‌تواند در مبنای ده‌دهی، شانزده‌شانزدهی یا هشت‌هشتی مشخص شود و با اجرای برنامهٔ xev(1) قابل تعیین است). حداکثر تا هشت keysym را می‌توان به یک کلید متصل کرد، با این حال چهار مورد آخر در هیچ پیاده‌سازی عمده‌ای از کارساز X استفاده نمی‌شوند. نخستین keysym زمانی استفاده می‌شود که هیچ کلید تغییردهنده‌ای (modifier) هم‌زمان با این کلید فشرده نشود، دومی همراه با Shift، سومی زمانی که کلید Mode_switch به همراه این کلید استفاده شود، و چهارمی زمانی که هر دو کلید Mode_switch و Shift به کار روند.
اگر هیچ کلید موجودی فهرست keysymهای مشخص‌شده را به خود اختصاص نداده باشد، یک کلید آزاد روی صفحه‌کلید انتخاب شده و keysymها به آن اختصاص داده می‌شوند. فهرست keysymها را می‌توان در مبنای ده‌دهی، شانزده‌شانزدهی یا هشت‌هشتی مشخص کرد.
عبارت KEYSYMNAME در سمت چپ به keycodeهای منطبق ترجمه می‌شود تا برای اجرای مجموعه عبارت‌های متناظر keycode به کار روند. توجه داشته باشید که اگر یک keysym یکسان به چند کلید مقید شده باشد، عبارت برای هر یک از keycodeهای منطبق اجرا خواهد شد.
تمام مدخل‌های موجود در نگاشت تغییردهنده (modifier map) را برای تغییردهندهٔ مشخص‌شده حذف می‌کند؛ نام‌های معتبر عبارتند از: Shift، Lock، Control، Mod1، Mod2، Mod3، Mod4 و Mod5 (بزرگی یا کوچکی حروف در نام‌های تغییردهنده اهمیتی ندارد، اگرچه برای تمام نام‌های دیگر اهمیت دارد). برای نمونه، «clear Lock» تمام کلیدهایی را که به تغییردهندهٔ shift lock مقید شده بودند، حذف خواهد کرد.
تمام کلیدهای حاوی keysymهای مشخص‌شده را به نگاشت تغییردهندهٔ مورد نظر اضافه می‌کند. نام‌های keysym پس از خوانده شدن تمام عبارت‌های ورودی ارزیابی می‌شوند تا نوشتن عبارت‌ها برای جابه‌جایی کلیدها آسان گردد (بخش «مثال‌ها (EXAMPLES)» را ببینید).
تمام کلیدهای حاوی keysymهای مشخص‌شده را از نگاشت تغییردهندهٔ مورد نظر حذف می‌کند. برخلاف add، نام‌های keysym به محض خوانده شدن خط ارزیابی می‌شوند. این ویژگی به شما اجازه می‌دهد کلیدها را از یک تغییردهنده حذف کنید، بدون اینکه نگران بازتخصیص یافتن یا نیافتن آن‌ها باشید.
نگاشت اشاره‌گر (pointer map) را به تنظیمات پیش‌فرض آن بازمی‌گرداند (دکمهٔ ۱ کد ۱ تولید می‌کند، دکمهٔ ۲ کد ۲ و غیره).
نگاشت اشاره‌گر را به گونه‌ای تنظیم می‌کند که شامل کدهای دکمهٔ مشخص‌شده باشد. این فهرست همیشه با نخستین دکمهٔ فیزیکی آغاز می‌شود. تنظیم کد یک دکمه روی 0، رویدادهای حاصل از آن دکمه را غیرفعال می‌کند.

خطوطی که با علامت تعجب (!) آغاز می‌شوند، به‌عنوان توضیح در نظر گرفته می‌شوند.

اگر می‌خواهید مقیدسازی (binding) یک کلید تغییردهنده را تغییر دهید، باید آن را از نگاشت تغییردهندهٔ مربوطه نیز حذف کنید..SH "مثال‌ها (EXAMPLES)" بسیاری از اشاره‌گرها به‌گونه‌ای طراحی شده‌اند که دکمه اول با انگشت اشاره دست راست فشرده می‌شود. افراد چپ‌دست معمولاً متوجه می‌شوند که معکوس کردن کدهای تولیدشده دکمه‌ها راحت‌تر است، تا دکمه اصلی با انگشت اشاره دست چپ فشرده شود. این کار را می‌توان در یک اشاره‌گر ۳ دکمه‌ای به شکل زیر انجام داد:

%  xmodmap -e "pointer = 3 2 1"

بسیاری از برنامه‌ها از مفهوم کلیدهای Meta پشتیبانی می‌کنند (مشابه کلیدهای Control، جز اینکه به‌جای Control، کلید Meta پایین نگه داشته می‌شود). با این حال، برخی از سرورها فاقد یک keysym برای Meta در جدول نگاشت کلید پیش‌فرض هستند، بنابراین باید یکی به‌صورت دستی اضافه شود. دستور زیر Meta را به کلید Multi-language (که گاهی با برچسب Compose Character مشخص می‌شود) متصل می‌کند. این دستور همچنین از این ویژگی بهره می‌برد که برنامه‌های نیازمند به کلید Meta تنها باید keycode را دریافت کنند و نیازی ندارند که keysym در ستون اول جدول نگاشت کلید قرار داشته باشد. این بدان معناست که برنامه‌هایی که به‌دنبال Multi_key هستند (از جمله نگاشت modifier پیش‌فرض) متوجه هیچ تغییری نخواهند شد.

%  xmodmap -e "keysym Multi_key = Multi_key Meta_L"

به‌طور مشابه، برخی صفحه‌کلیدها دارای کلید Alt هستند اما کلید Meta ندارند. در این حالت، دستور زیر ممکن است مفید باشد:

%  xmodmap -e "keysym Alt_L = Meta_L Alt_L"

یکی از کاربردهای ساده‌تر، و در عین حال کارآمد xmodmap، تنظیم کلید «rubout» (پاک‌کردن) صفحه‌کلید برای تولید یک keysym جایگزین است. این عمل معمولاً شامل جابه‌جایی Backspace با Delete برای راحتی بیشتر کاربر است. اگر منبع ttyModes در xterm(1) نیز تنظیم شده باشد، تمام پنجره‌های شبیه‌ساز پایانه از همان کلید برای پاک کردن نویسه‌ها استفاده خواهند کرد:

%  xmodmap -e "keysym BackSpace = Delete"
%  echo "XTerm*ttyModes:  erase ^?" | xrdb -merge

برخی صفحه‌کلیدها هنگام فشرده شدن هم‌زمان Shift با کلیدهای ویرگول (comma) و نقطه (period)، نویسه‌های کوچکتری و بزرگتری را به‌صورت خودکار تولید نمی‌کنند. این مشکل را می‌توان در xmodmap با بازنشانی اتصالات ویرگول و نقطه با استفاده از اسکریپت‌های زیر برطرف کرد:

!
! make shift-, be < and shift-. be >
!
keysym comma = comma less
keysym period = period greater

یکی از تفاوت‌های آزاردهنده‌تر میان صفحه‌کلیدها، محل قرارگیری کلیدهای Control و CapsLock است. یک کاربرد رایج xmodmap جابه‌جایی این دو کلید به‌صورت زیر است:

!
! Swap Caps_Lock and Control_L
!
remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L

این مثال را می‌توان مجدداً اجرا کرد تا کلیدها به وضعیت و تخصیص قبلی خود بازگردند.

دستور keycode برای تخصیص یک keysym یکسان به چندین keycode مفید است. اگرچه این دستور غیرقابل‌حمل (وابسته به سخت‌افزار) است، اما امکان نوشتن اسکریپت‌هایی را فراهم می‌کند که می‌توانند وضعیت صفحه‌کلید را به یک حالت مشخص بازنشانی کنند. اسکریپت زیر کلید Backspace را برای تولید Delete تنظیم می‌کند (همان‌طور که در بالا نشان داده شد)، تمامی اتصالات فعلی Caps Lock را پاک می‌کند، کلید CapsLock را به یک کلید Control تبدیل می‌کند، کاری می‌کند که F5 نویسه Escape را تولید کند، و Break/Reset را به یک Shift Lock تبدیل می‌نماید.

!
! On the HP, the following keycodes have key caps as listed:
!
!     101  Backspace
!      55  Caps
!      14  Ctrl
!      15  Break/Reset
!      86  Stop
!      89  F5
!
keycode 101 = Delete
keycode 55 = Control_R
clear Lock
add Control = Control_R
keycode 89 = Escape
keycode 15 = Caps_Lock
add Lock = Caps_Lock
برای دریافت نام میزبان پیش‌فرض و شماره نمایشگر.

X(7), xev(1), setxkbmap(1), XStringToKeysym(3), مستندات Xlib درباره رویدادهای کلید و نشانگر (pointer)

هر بار که یک عبارت keycode ارزیابی می‌شود، کارساز یک رویداد MappingNotify برای تمام کلاینت‌ها تولید می‌کند. این امر می‌تواند باعث کوبش (thrashing) شود. تمام تغییرات باید به صورت دسته‌ای جمع‌آوری شده و یک‌باره اعمال شوند. کلاینت‌هایی که ورودی صفحه‌کلید را دریافت کرده و رویدادهای MappingNotify را نادیده می‌گیرند، متوجه هیچ‌یک از تغییرات اعمال‌شده در نگاشت‌های صفحه‌کلید نخواهند شد.

برنامه Xmodmap باید هر زمان که یک keycode که پیش‌تر به یک کلید تبدیلگر (modifier) مقید شده تغییر می‌کند، عبارت‌های add و remove را به صورت خودکار تولید کند.

باید راهی وجود داشته باشد تا عبارت remove بتواند علاوه بر keysymها، keycodeها را نیز برای مواقعی که نگاشت‌های خود را واقعاً به‌هم می‌ریزید بپذیرد.

جیم فولتون (Jim Fulton)، MIT X Consortium، بازنویسی‌شده از یک نسخه قدیمی‌تر توسط دیوید روزنتال (David Rosenthal) از Sun Microsystems.

xmodmap 1.0.12 X Version 11