| FVWMPERL(1) | FVWMPERL(1) |
نام (NAME)
FvwmPerl - دستورز و پیشپردازنده perl برای fvwm
خلاصه دستور (SYNOPSIS)
برای عملکرد عادی، FvwmPerl باید توسط fvwm (1) اجرا شود.
برای اجرای این ماژول، دستور Module FvwmPerl [params] را در فایل پیکربندی fvwm قرار دهید تا ارسال دستورات به FvwmPerl آغاز شود.
توضیحات (DESCRIPTION)
هدف این ماژول، گسترش دستورات fvwm با قدرت اسکریپتنویسی perl است. این ماژول امکان جاسازی عبارات perl در فایلهای پیکربندی fvwm و ساخت دستورات fvwm را فراهم میآورد.
فراخوانی (INVOCATION)
اگر میخواهید نمونه یکتا و ماندگار FvwmPerl را فراخوانی کنید، پیشنهاد میشود این کار را از طریق StartFunction انجام دهید. فراخوانی آن از ابتدا نیز امکانپذیر است، اما مسائلی به همراه دارد که در اینجا مطرح نشده است.
AddToFunc StartFunction I Module FvwmPerl
چندین سوئیچ خط فرمان وجود دارد:
FvwmPerl [ --eval line ] [ --load file ] [ --preprocess [ --quote char ] [ --winid wid ] [ --cmd ] [ --nosend ] [ --noremove ] [ line | file ] ] [ --export [names] ] [ --stay ] [ --nolock ] [ alias ]
سوئیچهای طولانی را میتوان به سوئیچهای کوتاه تکحرفی خلاصه کرد.
-e|--eval line
-l|--load file
-p|--preprocess [ file ]
۵ گزینه زیر تنها همراه با گزینه --preprocess معتبر هستند.
-c|--cmd line
-q|--quote char
-w|--winid wid
--nosend
--noremove
-x|--export [names]
-s|--stay
--nolock
ModuleSynchronous FvwmPerl --preprocess someconfig.ppp
اگر --nolock در اینجا اضافه شود، ModuleSynchronous بلافاصله بازمیگردد. توجه داشته باشید که Module بدون توجه به این گزینه فوراً بازمیگردد.
نامهای مستعار (aliasها) این امکان را میدهند که چندین فراخوانی از ماژول داشته باشید و با هر فراخوانی بهطور جداگانه کار کنید؛ این یک نمونه است:
ModuleSynchronous FvwmPerl FvwmPerl-JustTest
SendToModule FvwmPerl-JustTest eval $a = 2 + 2; $b = $a SendToModule
FvwmPerl-JustTest eval cmd("Echo 2 + 2 = $b")
KillModule FvwmPerl FvwmPerl-JustTest
نمونه پیشپردازش (PREPROCESSING EXAMPLE)
یکی از راهکارهای مؤثر پیشپردازش، ارسال کل پیکربندی fvwm به همراه کد perl جاسازیشده به FvwmPerl --preprocess است. رویکرد جایگزین دیگر، نوشتن یک اسکریپت perl است که دستورات fvwm را تولید کرده و آنها را برای اجرا ارسال میکند؛ این اسکریپت را میتوان با استفاده از FvwmPerl --load بارگذاری کرد. با این حال، راهکارهای بینابینی نیز وجود دارند که تنها خطوط پیکربندی مجزا را پیشپردازش میکنند (یا متناوباً، دستورات perl مجزایی را اجرا میکنند که دستورات fvwm را تولید مینمایند).
قطعهکد زیر، قابلیت محاسبات ریاضی و اسکریپتنویسی رشتهای را به خطوط خاصی که به آن نیاز دارند میافزاید. برای استفاده از این قابلیت، بهتر است FvwmPerl را به عنوان نخستین دستور خود اجرا کنید تا بتوان از دیگر دستورات خواست که پیشپردازش شوند.
ModuleSynchronize FvwmPerl
AddToFunc .
+ I SendToModule FvwmPerl preprocess -c $*
. Exec exec xterm -name xterm-%{++$i}% # use unique name
. GotoDesk 0 %{ $[desk.n] + 1 }% # go to next desk
. Exec exec %{ -x "/usr/bin/X11/aterm" ? "aterm" : "xterm" }% -sb
# center a window
Next (MyWindow) . Move \
%{($WIDTH - $[w.width]) / 2}%p %{($HEIGHT - $[w.height]) / 2}%p
. Exec exec xmessage %{2 + 2}% # simple calculator
. %{main::show_message(2 + 2, "Yet another Calculator"); ""}%
اقدامات (ACTIONS)
چندین اقدام (action) وجود دارد که FvwmPerl میتواند انجام دهد:
eval perl-code
load file-name
preprocess [-q|--quote char] [-c|--cmd] [line | file]
%Repeat count
%ModuleConfig module-name [ destroy ]
%Prefix prefix
%End any-optional-comment
%Prefix "AddToFunc SwitchToWindow I"
Iconify off
WindowShade off
Raise
WarpToWindow 50 50
%End
%ModuleConfig FvwmPager destroy
Colorset 0
Font lucidasans-10
DeskTopScale 28
MiniIcons
%End ModuleConfig FvwmPager
%Prefix "All (MyWindowToAnimate) ResizeMove "
100 100 %{($WIDTH - 100) / 2}% %{($HEIGHT - 100) / 2}%
%Repeat %{$count}%
br w+2c w+2c w-1c w-1c
%End
%Repeat %{$count}%
br w-2c w-2c w+1c w+1c
%End
%End Prefix
export [func-names]
نامهای توابع (func-names) میتوانند با کاما و/یا فاصلههای خالی از هم جدا شوند. بهطور پیشفرض، دو تابع Eval و . در نظر گرفته میشوند.
اقدام واقعی تعریفشده در یک تابع، در صورت امکان از نام تابع حدس زده میشود، که در آن نام تابع . برای اقدام preprocess رزرو شده است.
برای نمونه، هر یک از این دو دستور fvwm:
SendToModule MyPerl export PerlEval,PP FvwmPerl --export PerlEval,PPMyPerlدو تابع میانبر زیر را تعریف کنید:
DestroyFunc PerlEval AddToFunc I SendToModule MyPerl eval $* DestroyFunc PP AddToFunc I SendToModule MyPerl preprocessc-c $*
این ۴ اقدام را میتوان به یکی از ۳ روش درخواست کرد: ۱) در خط فرمان هنگامی که FvwmPerl فراخوانی میشود (در این حالت FvwmPerl کوتاهمدت خواهد بود مگر اینکه --stay یا --export نیز داده شده باشد)، ۲) با ارسال پیام مربوطه در پیکربندی fvwm با استفاده از SendToModule، ۳) با فراخوانی تابع perl متناظر در کد perl.
توابع (FUNCTIONS)
چندین تابع وجود دارد که کد perl میتواند آنها را فراخوانی کند:
cmd($fvwm_command)
do_eval($perl_code)
load($filename)
preprocess(@params, ["-c $command"] [$filename])
export($func_names, [$do_unexport])
stop()
skip()
unlock()
detach()
show_message($msg, $title[, $use_stderr_too=1])
چندین متغیر سراسری در فضاینام main وجود دارند که ممکن است در کد perl استفاده شوند:
$a, $b, ... $h @a, @b, ... @h %a, %b, ... %h
همگی آنها با مقدار خالی مقداردهی اولیه میشوند و میتوانند برای ذخیره وضعیت میان فراخوانیهای گوناگون به اکشنهای FvwmPerl (eval و load) مورد استفاده قرار گیرند.
اگر به نامهای متغیر خواناتری نیاز دارید، یا عبارت no strict 'vars'; را در آغاز هر کد perl بنویسید یا برای این کار از یک هش (hash) استفاده کنید، مانند:
$h{id} = $h{first_name} . " " . $h{second_name}
یا از یک نام پکیج استفاده کنید، مانند:
@MyMenu::terminals = qw( xterm rxvt ); $MyMenu::item_num = @MyMenu::terminals;
ممکن است یک گزینه پیکربندی برای فعال یا غیرفعال کردن strictness وجود داشته باشد.
پیامها (MESSAGES)
FvwmPerl میتواند با استفاده از دستور fvwm به نام SendToModule پیامها را دریافت کند. نامها، معانی و پارامترهای پیامها همانند اکشنهای متناظر هستند که در بالا توصیف شدند.
علاوه بر این، پیام stop موجب خروج ماژول میشود.
پیام unexport [func-names] اثر export را که در بخش ACTIONS توصیف شد خنثی میکند.
پیام dump محتوای متغیرهای تغییریافته را دامپ (تخلیه) میکند (هنوز پیادهسازی نشده است).
مثالها (EXAMPLES)
یک آزمایش ساده:
SendToModule FvwmPerl eval $h\{dir} = $ENV\{HOME}
SendToModule FvwmPerl eval load($h\{dir} . "/test.fpl")
SendToModule FvwmPerl load $[HOME]/test.fpl
SendToModule FvwmPerl preprocess config.ppp
SendToModule FvwmPerl export Eval,PerlEval,PerlLoad,PerlPP
SendToModulecFvwmPerl unexport PerlEval,PerlLoad,PerlPP
SendToModule FvwmPerl stop
مثال زیر پسزمینههای root را در fvwmrc مدیریت میکند. همه این دستورها را میتوان به StartFunction اضافه کرد.
Module FvwmPerl --export PerlEval
# find all background pixmaps for a later use
PerlEval $a = $ENV\{HOME} . "/bg"; \
opendir DIR, $a; @b = grep \{ /xpm$/ } readdir(DIR); closedir DIR
# build a menu of background pixmaps
AddToMenu MyBackgrounds "My Backgrounds" Title
PerlEval foreach $b (@b) \
{ cmd("AddToMenu MyBackgrounds $b Exec fvwm-root $a/$b") }
# choose a random background to load on start-up
PerlEval cmd("AddToFunc \
InitFunction + I Exec exec fvwm-root $a/" . $b[int(random(@b))])
دستور SendToModule درست مانند هر دستور دیگر fvwm، چندین متغیر با پیشوند علامت دلار را بسط میدهد. این مسئله ممکن است با علامتهای دلار مورد استفاده در perl تداخل داشته باشد. میتوانید با قرار دادن یک خط پیوند (dash) پیش از SendToModule از این تداخل جلوگیری کنید. در هر جفت زیر، این ۲ خط معادل یکدیگرند:
SendToModule FvwmPerl eval $$d = "$[DISPLAY]"
-SendToModule FvwmPerl eval $d = "$ENV\{DISPLAY}"
SendToModule FvwmPerl eval \
cmd("Echo desk=$d, display=$$d")
SendToModule FvwmPerl preprocess -c \
Echo desk=%("$d")%, display=%\{$$d}%
راهکار دیگر برای اجتناب از گریزدهی نمادهای خاص مانند دلار و بکاسلش، ایجاد یک فایل perl در ~/.fvwm و سپس بارگذاری آن است:
SendToModule FvwmPerl load build-menus.fpl
اگر نیاز دارید دستوری را که با خط پیوند آغاز میشود پیشپردازش کنید، باید پیش از آن از «--» استفاده نمایید:
# this prints the current desk, i.e. "0"
SendToModule FvwmPerl preprocess -c Echo "$%\{$a = "c"; ++$a}%"
# this prints "$d"
SendToModule FvwmPerl preprocess -c -- -Echo "$%\{"d"}%"
# this prints "$d" (SendToModule expands $$ to $)
SendToModule FvwmPerl preprocess -c -- -Echo "$$%\{"d"}%"
# this prints "$$d"
-SendToModule FvwmPerl preprocess -c -- -Echo "$$%\{"d"}%"
مجدداً، پیشنهاد میشود دستور(ها)ی خود را در یک فایل قرار داده و در عوض آن فایل را پیشپردازش کنید.
هشدارها (CAVEATS)
برنامهٔ FvwmPerl به دلیل اینکه با perl نوشته شده و با perl سر و کار دارد، از این شعار معروف perl پیروی میکند: «بیش از یک راه برای انجام آن وجود دارد، بنابراین انتخاب با شماست.»
در ادامه جفتهای معادل دیگری از خطوط آورده شده است:
Module FvwmPerl --load "my.fpl" --stay
Module FvwmPerl -e load("my.fpl") -s
SendToModule FvwmPerl preprocess --quote @ my.pp
SendToModule FvwmPerl eval preprocess(\{quote => @}, "my.ppp");
هشدار: شما میتوانید با ارزیابی کد مناسب در perl بر نحوهٔ کارکرد FvwmPerl اثر بگذارید؛ این موضوع یک قابلیت تلقی میشود، نه یک باگ. اما لطفاً این کار را انجام ندهید، بلکه ماژول fvwm اختصاصی خود را با perl بنویسید.
همچنین ببینید (SEE ALSO)
صفحهٔ راهنمای fvwm (1) تمامی دستورهای موجود را شرح میدهد.
اساساً، در کد perl خود میتوانید از هر تابع یا متد کلاسی از کتابخانهٔ perl که به همراه fvwm نصب شده است استفاده کنید؛ به صفحات راهنمای بستههای perl شامل General::FileSystem، General::Parse و FVWM::Module مراجعه کنید..SH "نویسنده (AUTHOR)"
Mikhael Goikhman <migo@homemail.com>.
| 2026-06-28 |