انجمنهای فارسی اوبونتو
کمک و پشتیبانی => میزکارهای گنو/لینوکس => سایر میزکارها => نویسنده: بهروز رمضانی در 23 بهمن 1394، 07:59 بظ
-
سلام به همگی
من یه چند روزی هست اومدم روی i3 مشکلاتی دارم اما هنوز موفق نشدم ایندیکیتور لاوت کیبرد را به i3statusbar اضافه کنم. یکم سرچ کردم به صفحه زیر رسیدم. بعد از اعمال تغییرات لازم علاوه بر این که رنگ بندی آیتمها روی i3statubar به رنگ سفید در اومد.به علاوه خروجی اسکریپت گفته شده در اون صفحه نمایش هر دو زبان eng,ir با هم بود. در صورتی که باید زبان جاری را نشان بده.
http://docs.slackware.com/howtos:window_managers:keyboard_layout_in_i3 (http://docs.slackware.com/howtos:window_managers:keyboard_layout_in_i3)
این اسکریپت هم یکی از بچههای انجمن ارچ معرفی کرد. که متاسفانه خروجیش اونی نیست که من میخوام.در ضمن بگم لپتاپ من چراغ CapsLK و امثالهم نداره.
#This is a script for changing keyboard between English and Persian layouts
if [ `setxkbmap -print | grep xkb_symbols | awk '{print $4}' | awk -F"+" '{print $2}'` = us ];
then echo "EN"; echo "changing to IR..."; setxkbmap ir;
else echo "IR"; echo "Changing to US..."; setxkbmap us ;
fi
-
https://github.com/szemate/config/blob/master/i3status-extender
$XDG_CONFIG_HOME/i3/config:
bar {
status_command i3status | i3-extender
}
-
https://github.com/szemate/config/blob/master/i3status-extender
$XDG_CONFIG_HOME/i3/config:
bar {
status_command i3status | i3-extender
}
من اون اسکریپت را داخل یه فایل ریختم و أدرس اش را این طور تعریف کردم.
status_command i3status | ~/.i3/i3-extender
خوب بعد از راهاندازی مجدد i3 ایندیکیتور کیبرد ظاهر شده اما با تغییر زبان تغییر نمیکنه.
-
چرا؟
وقتی از دستور زیر برای تغییر طرحبندی کیبورد استفاده بشه:
setxkbmap -option grp:switch,grp:alt_shift_toggle us,ir
در اصل دو طرحبندی تعریف و بوسیلهٔ Alt+Shift بین اونها تعویض انجام میشه:
rules: evdev
model: pc105
layout: us,ir
options: grp:switch,grp:alt_shift_toggle
اسکریپت پایتونی که من به شما معرفی کردم هم با موشکافی خروجی دستور setxkbmap -query طرحبندی حاضر رو بدست میاره بنابراین اگر خروجی طبق بالا باشه فقط اولین طرحبندی با عبارت Regex برابر میشه.
چطور:
برای تعویض طرحبندیهای کیبورد از اسکریپت زیر استفاده کنید:
#!/usr/bin/env bash
# filename: xkblayout.sh
layout=$(setxkbmap -print | awk -F"+" '/xkb_symbols/ {print $2}')
if [ "$layout" = us ]; then
setxkbmap ir
else
setxkbmap us
fi
پیکربندی i3:
bindcode Shift+64 exec ~/xkblayout.sh # Shift+Alt
bindcode Mod1+50 exec ~/xkblayout.sh # Alt+Shift_L
bindcode Mod1+62 exec ~/xkblayout.sh # Alt+Shift_R
منابع:
https://faq.i3wm.org/question/3953/execute-an-sh-file-using-bindsym.1.html
http://unix.stackexchange.com/a/48858
-
برای چک کردن زبان فعلی صفحهکلید دستور اشتباهی رو توی if چک کردید.. حداقل برای من که همیشه us رو نمایش میده (حتی اگه روی فارسی باشه).
در واقع راه بدون ایرادی وجود نداره ولی اگه به جاش دستور زیر رو بررسی کنید برای وقتی که فقط دوتا زبان رو استفاده میکنید مشکلی پیش نمیآد:
$ xset -q|grep LED| awk '{ print $10 }'
برای من وقتی که زبان فارسی باشه خروجی 0000106 و وقتی زبان انگلیسی باشه خروجی 00000002 هست احتمالا توی سیستم شما هم همین خروجیها باشن.
اگه مایل بودید میتونید از این اسکریپت ساده هم استفاده کنید:
#!/bin/bash
case `xset -q|grep LED| awk '{ print $10 }'` in
"00000002") kb='English' ;;
"00001006") kb='Persian' ;;
*) kb='Unknown' ;;
esac
echo $kb
-
اگر توضیحی که دادم رو میخوندید متوجه میشدید که درصورت تعویض کیبورد با استفاده از دوتا طرحبندی همیشه اولین طرحبندی برمیگرده (قاعدتاً us) بنابراین ربطی به دستور if نداره (: ضمناً من راهحلی که ارایه کردم رو قبلاً آزمایش کردم و بهخوبی کار میکنه.
(http://i.imgur.com/c8pfRp5.gif)
-
برای چک کردن زبان فعلی صفحهکلید دستور اشتباهی رو توی if چک کردید.. حداقل برای من که همیشه us رو نمایش میده (حتی اگه روی فارسی باشه).
در واقع راه بدون ایرادی وجود نداره ولی اگه به جاش دستور زیر رو بررسی کنید برای وقتی که فقط دوتا زبان رو استفاده میکنید مشکلی پیش نمیآد:
$ xset -q|grep LED| awk '{ print $10 }'
برای من وقتی که زبان فارسی باشه خروجی 0000106 و وقتی زبان انگلیسی باشه خروجی 00000002 هست احتمالا توی سیستم شما هم همین خروجیها باشن.
اگه مایل بودید میتونید از این اسکریپت ساده هم استفاده کنید:
#!/bin/bash
case `xset -q|grep LED| awk '{ print $10 }'` in
"00000002") kb='English' ;;
"00001006") kb='Persian' ;;
*) kb='Unknown' ;;
esac
echo $kb
ممنون این اسکریپت دقیقا همون کاری را که من نیاز داشتم انجام میده. اما مشکل اینکه باید این اسکریپت همیشه در حال اجرا باشه تا بتونه زبان جاری سیستم را نشون بده.اصولا فکر کنم راه معقولی برای این کار وجود نداشته باشه. احتمالا باید قید اون را بزنم. شایدم قید i3 را ...
-
ممنون از همه دوستان که کمک کردن این مشکل حل بشه. برای دوستانی که دنبال راه حل هستن برای همچین مشکلی
اول یه این اسکریپت را یه جا ذخیره کنید.من داخل این ادرس ذخیره کردم. اسم اسکریپت i3-extender بگذارید.
/home/behrooz/.i3
#!/usr/bin/env python
"""Extend i3status with more stuff.
Each extra module is a function that returns a dictionary with keys 'name' and
'full_text', decorated with `@i3status_module`.
Usage:
i3status | i3status-extender
"""
import json
import os
import re
import sys
extra_modules = []
def main():
while True:
line = sys.stdin.readline()
m = re.search(r"^(,?)(\[.+\])", line)
if m:
modules = json.loads(m.group(2))
for old_module_name, new_module in extra_modules:
modules.insert(position(old_module_name, modules), new_module())
sys.stdout.write("%s%s\n" % (m.group(1), json.dumps(modules)))
else:
sys.stdout.write(line)
sys.stdout.flush()
def position(old_module_name, all_modules):
return next(
i + 1 for i, f in enumerate(all_modules)
if f["name"] == old_module_name) if old_module_name else 0
def i3status_module(after=None):
def decorator(f):
extra_modules.append((after, f))
return f
return decorator
@i3status_module(after="tztime")
def keyboard_layout():
return {
"name": "kblayout",
"full_text":
re.search(r"layout:\s+(\w+)", os.popen("setxkbmap -query").read())
.group(1).upper()}
if __name__ == "__main__":
main()
حالا در فایل پیکرهبندی i3 اینطور اضافه کنید.
status_command i3status | ~/.i3/i3-extender
حالا یه اسکریپت دیگه به نام xkblayout.sh ذخیره کنید با این محتویات
#!/usr/bin/env bash
# filename: xkblayout.sh
layout=$(setxkbmap -print | awk -F"+" '/xkb_symbols/ {print $2}')
if [ "$layout" = us ]; then
setxkbmap ir
else
setxkbmap us
fi
حالا موارد زیر را به فایل کانفیگ i3 اضافه کنید. ادرس فایل را مطابق با ادرس فایل خودتان تغییر دهید.
bindcode Shift+64 exec ~/.i3/xkblayout.sh # Shift+Alt
bindcode Mod1+50 exec ~/.i3/xkblayout.sh # Alt+Shift_L
bindcode Mod1+62 exec ~/.i3/xkblayout.sh # Alt+Shift_R
کار تمام شد الان باید بتونید با ترکیب الت+ شیفت زبان را تغییر دهید و ایندیکیتور هم زبان جاری را نمایش خواهد داد.
-
اصولا فکر کنم راه معقولی برای این کار وجود نداشته باشه. احتمالا باید قید اون را بزنم. شایدم قید i3 را ...
برای من یه یه چیزی سواله. اینکه آرچ چرا ابزاری مثل dpkg-reconfigure نداره؟ توی دبیان بیس ها کافیه زبان اینجوری ست بشه:
sudo dpkg-reconfigure keyboard-configuration
یا گذاشتن محتویات زیر توی فایل etc/default/keyboard/:
XKBMODEL="pc105"
XKBLAYOUT="us,ir"
XKBVARIANT=",pes_keypad"
XKBOPTIONS="grp:alt_shift_toggle,lv3:ralt_alt,grp_led:scroll"
BACKSPACE="guess"
و بعد از کانفیگ و یک ریبوت، زبان مورد نظر با شورتکات دلخواه جا به جا میشه. برای اتوماتیک کردنش برای هر پنجره هم یه kbdd میزنیم تنگش راه می افته.
-
و بعد از کانفیگ و یک ریبوت، زبان مورد نظر با شورتکات دلخواه جا به جا میشه. برای اتوماتیک کردنش برای هر پنجره هم یه kbdd میزنیم تنگش راه می افته.
اینجا مگه مسئله تنظیم کردن یا جابهجا شدن بین زبانهاست؟
-
سوال من یه چیز دیگه بود :)