چه کارهای جالبی با گنو/لینوکس انجام میدهم : جایگزین کننده خودکار clipboard
by Ahmed on ۱۹/۱۱/۱۳۹۱بعد از نوشتن پست چرا گنو / لینوکس را دوست دارم ، وسوسه شدم پست چه کارهای جالبی با گنو/لینوکس انجام میدهم رو هم برای مسابقه بنویسم:
خوب معمولا این پست ها با طرح یه مشکل شروع میشن و بعد با یه حرکت ژانگولری لینوکسی تموم میشن پس اول میپردازیم به مشکل، داستان از اون جایی شروع شد که قصد کردم مستندات Django که یه فریم ورک نوشته شده با python هست رو مطاله کنیم و PDF مستندادشو گرفتم و هر از گاهی یه مقدارشو میخوندم.
مسئله از اینجا شروع شد که هر از گاهی به کدهایی بر میخوردم که باید کپی و پیست میکردم و مثال ها رو اجرا میکردم، کدهایی مثل کد زیر:
1
2
3
4
5
|
urlpatterns = patterns(’’,
(r’^articles/(\d{4})/$’, ’news.views.year_archive’),
(r’^articles/(\d{4})/(\d{2})/$’, ’news.views.month_archive’),
(r’^articles/(\d{4})/(\d{2})/(\d+)/$’, ’news.views.article_detail’),
)
|
مشکل اینجاست که به جای کاراکتر Typewriter single quotes یا همون کاراکتر ‘ که در برنامه نویسی هم بسیار مرسوم وقتی paste انجام میشه کاراکتر Single quotes (curly) یا همون کاراکتر ‘ ’ پیست میشه و هر دفعه برای اجرای درست کد ها باید با سینگل کوت معمولی ( ‘ ) جایگزین بشن. اینجا میتونید راجع به علایم نقل قول اطلاعات کاملی بدست بیارید.
مثلا برای مثال بالا شکل درستش اینشکلیه:
1
2
3
4
5
|
urlpatterns = patterns('',
(r'^articles/(\d{4})/$', 'news.views.year_archive'),
(r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'),
(r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'),
)
|
و باور کنید بعد از دو بار انجام دادن جایگزینی، دیگه این کار حوصله سر بر میشه!!! و دنبال یه راه حل اتوماتیک برای این جور شرایط میوفتین .
وقتی دقت کردم دیدم من همین مشکلو حتی در برخورد با بعضی از کدهای قرار داده شده بر روی اینترنت هم دارم و مثلا به جای سینگل کت و یا دابل کت با این کاراکتر های ’ و ‘ و ” مواجه میشم که باید یک بار عمل replace رو روشون اعمال کنم تا درست اجرا شن.
خوب حالا که مشکل فهمیدیم باید دنبال یه راه حل باشیم:
بعد از یه مقداری گوگل دیدم ادیتور محبوب لینوکسی ها یعنی vim راه ساده ای برای این کار داره، کافیه تو فایل .vimrc دستور زیرو بنویسی:
1
|
autocmd BufWritePre * :%s/’/'/ge
|
کد بالا باعت میشه هر دفعه که در vim ما دستور :w رو برای ذخیره فایل زدیم، قبل از ذخیره عمل replace یا همون جای گزینی انجام بشه.
درسته که با همین کار کوچیک مشکلمون حل میشه اما راستش من تو کارهام بیشتر از ادیتورهای گرافیکی مثل geany و gedit استفاده میکنم! پس مشکل من هنوز کامل حل نشده.
پس باید یه فکر دیگه ای بکنم، هوووووم خوب من میدونم وقتی یه چیزی copy میشه در یک جایی به نام clipboard ذخیره میشه و اگه من بتونم مدام clipboard رو چک کنم میتونم اگر کاراکتر های ناخواستم توش پیدا شد همونجا عمل replace رو روشون انجام بدم تا وقتی چیزیو paste میکنم همه چیز درست و اونطوری که من میخوام باشه.
بنابراین بازم دست به یه سری سرچ میزنم و به کتابخونه Pyperclip میرسم که به زبان python برای کار با clipboard نوشته شده.
من python کار نیستم اما علاوه بر این که python کارا رو دوست دارم :دی میدونم وقتی یه زبان برنامه نویسی رو بلد باشی و ساختارهای کنترلیشو بشناسی سادس که با زبان های برنامه نویسی دیگه هم کار کنی.
بنا بر این گرچه خیلی ترو تمیز نیست ولی کد زیرو نوشتم ببینم کار میکنه یا نه!
1
2
3
4
5
6
7
8
9
10
11
12
|
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import pyperclip
import time
while 1:
clipboard = pyperclip.paste()
if '’' in clipboard or '‘' in clipboard:
clipboard = clipboard.replace('’', '\'')
clipboard = clipboard.replace('‘', '\'')
pyperclip.copy(clipboard)
time.sleep(1)
|
خوب خدا رو شکر کار میکنه و ما الان تو محیط گرافیکی تمام copy و paste هامون شامل قوانین replace کننده موردنظرمون میشه.
توضیح کد بالا به این صورته که یه حلقه بی نهایت ساختم که هر یک ثانیه یک بار اجرا میشه و با کمک کتابخونه Pyperclip محتویات clipboard رو میگیره و چک میکنه آیا کاراکترهای’ یا ‘ در اون هست یا نه و اگر هست عمل جایگزینی اونها رو با کاراکتر سینگل کوت موردنظر ما انجام میده و محتویات جدید رو جایگزین محتویات قبلی clipboard میکنه.
اما جریان اینجا تموم نشد! موقعی که این کد رو اجرا میکردم احساس میکردم صدای فن لپ تاپم زیاد میشه و وقتی با دستور top میزان مصرف منابع سیستممو چک کردن دیدم بله مصرف منابع کدی که نوشتم، خیلی بیشتر از هیکلشه!
خوب این یعنی حلقه بی نهایت جواب نمیده و باید خیلی دقیق تر بزنیم به هدف! مثلا این عمل جایگزینی فقط وقتی عمل کپی انجام میشه صورت بگیره! خوب سوال اینجاست از کجا بفهمیم کی یه عمل کپی کردن داره انجام میشه؟ شاید با DBUS بشه این کارو پیاده کرد ولی بابا آخه من همیشه دنبال آسون ترین راهم پس یه گوگلی میکنم تا ببینم تو نرم افزار های مدیریت clipboard کدوم به اونچیزی که من میخوام نزدیک تره که به glipper رسیدم.
در توضیحش امده:
It maintains a history of text copied to the clipboard from which you can choose. Glipper uses plugins to give the user all the extra functionality.
پس اگه بتونم یه plugin براش بنویسم احتمال زیاد بتونم مشکل خودمو با یه روش اصولی حل کنم.
بعد از نصبش سعی میکنم از ساختارش سر در بیارم!
1
2
3
|
farid@farid-F80Q:~$ cd /usr/share/glipper/
farid@farid-F80Q:/usr/share/glipper$ ls
plugins plugins-window.ui preferences-window.ui
|
خوب تونستم جایی که plugin هاش نصب میشه رو پیدا کنم و توی پوشه plugins به مورد جالبی بر خوردم! پلاگین newline.py بسیار ساده نوشته شده و میتونه بیس پلاگین جایگزین کننده من باشه، پس بر اساس اون شروع میکنم به کد زدن و به کد زیر میرسم:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#This is a clippboard replacor
#-*- coding:utf-8 -*-
import glipper
from gettext import gettext as _
def on_new_item(arg):
#if type(arg) != 'NoneType':
if '’' in arg or '‘' in arg:
last_set_item = arg
last_set_item = last_set_item.replace('’', '\'')
last_set_item = last_set_item.replace('‘', '\'')
glipper.set_history_item(0, last_set_item)
glipper.add_history_item(last_set_item)
def info():
info = {"Name": _("replacer"),
"Description": _("replace some characters"),
"Preferences": False}
return info
|
خوب این کد ها رو داخل فایلی به نام replacer.py در مسیر /usr/share/glipper/plugins ذخیره میکنم و مریم برای تستش:
در نهایت همونطور که میبینید به هدفم رسیدم و الان دارم به این فکر میکنم که به پلاگینم یه قسمت مدیریت کارکتر های جایگزین شونده اضافه کنم تا کاربرا از طریق رابط گرافیکی بتونن کارکترهای دلخواهو بهش بدن، شاید برنامه نویس اصلی پروژه glipper هم اگر مناسب دید این رو هم به پلاگین های رسمی پروژه اضافه کنه! به نظرم این زیبایی دنیای لینوکسه که بهت امکان آزمایشو خطا و یادگرفتنو یاد دادن و تکمیل کردن اجزای مختلفو میده و من تمام این چیزا رو دوست دارم :)
[email protected]
There are 3 comments in this article: