প্রতিবার কেউ ভার্চুয়াল কনসোলের জন্য আলাদা আকার নির্ধারণ করে, less
উইন্ডো রেজোলিউশনটি স্বীকৃতি দেয় (আমি ধরে নিচ্ছি যে ...); সেই অনুসারে, এটি পাঠ্যের কতগুলি লাইনকে ভিজ্যুয়ালাইজ করা উচিত তা পরিবর্তন করে। সেই পরামিতিটি কীভাবে গণনা করা হয়?
প্রতিবার কেউ ভার্চুয়াল কনসোলের জন্য আলাদা আকার নির্ধারণ করে, less
উইন্ডো রেজোলিউশনটি স্বীকৃতি দেয় (আমি ধরে নিচ্ছি যে ...); সেই অনুসারে, এটি পাঠ্যের কতগুলি লাইনকে ভিজ্যুয়ালাইজ করা উচিত তা পরিবর্তন করে। সেই পরামিতিটি কীভাবে গণনা করা হয়?
উত্তর:
আপনি যদি কোনও স্ক্রিপ্ট থেকে চেক করার কোনও উপায় খুঁজছেন, আপনি এইগুলির মধ্যে যে কোনওটি করতে পারেন:
tput cols
এবং tput lines
, ম্যানটওয়ার্কের পরামর্শ অনুসারেতবে আপনি যদি বিশদ চান, এখানে আমরা যাচ্ছি:
ভার্চুয়াল টার্মিনালগুলির জন্য (xterm, et al) একটি ioctl()
সিস্টেম কল রয়েছে যা জানায় যে উইন্ডোটি আকার size যদি এটি করতে পারে তবে less
এই কলটি ব্যবহার করুন। তদ্ব্যতীত, আপনি যখন উইন্ডোর আকার পরিবর্তন করেন, উইন্ডোটিতে যা কিছু চলছে তা একটি SIGWINCH
সিগন্যাল পায় যা less
জানতে দেয় যে এটি একটি নতুন উইন্ডো আকারের জন্য পরীক্ষা করা উচিত। উদাহরণস্বরূপ, আমি একটি less
দৌড় শুরু করেছি (প্রক্রিয়া আইডি হিসাবে 16663) এটির সাথে সংযুক্ত strace
এবং উইন্ডোটিকে পুনরায় আকার দিয়েছি । এটি আমি দেখেছি:
$ strace -p 16663
Process 16663 attached - interrupt to quit
read(3, 0xbfb1f10f, 1) = ? ERESTARTSYS (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
rt_sigaction(SIGWINCH, {0x805cf10, [WINCH], SA_RESTART}, {0x805cf10, [WINCH], SA_RESTART}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
ioctl(2, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
এটাও কি tput cols
এবং tput lines
লোকচক্ষুর অন্তরালে কি, যদি তারা করতে পারেন। এই পদ্ধতিতে আরও তথ্যের man tty-ioctl
জন্য দেখুন এবং টিআইওসিজিউইউএনএসজেড অনুসন্ধান করুন।
অন্যান্য টার্মিনালগুলির জন্য যেমন সিরিয়াল পোর্টগুলির সাথে সংযুক্ত রয়েছে তাদের পক্ষে এই তথ্যটি সরাসরি পাওয়ার কোনও উপায় নেই। সেক্ষেত্রে, less
এনভায়রনমেন্ট ভেরিয়েবল মধ্যে সংকেত সনাক্ত করুন খুঁজছেন শুরু।
LINES
এবং COLUMNS
প্রায়শই টার্মিনাল মাত্রায় সেট করা হবে। প্রকৃতপক্ষে, যদি bash
বা zsh
টার্মিনালের মাত্রা সন্ধান করতে পারে তবে এটি স্বয়ংক্রিয়ভাবে এই ভেরিয়েবলগুলি সেট করে দেবে, না-চালাক প্রোগ্রামগুলির পক্ষে টার্মিনালের আকার দেখতে সহজ করে তোলে। যাইহোক, dash
এবং অন্যান্য বেশিরভাগ শেলগুলি tcsh
এই ভেরিয়েবলগুলি সেট করে না।TERM
সাধারণত টার্মিনাল টাইপ সেট করা হয়, সেক্ষেত্রে টার্মিনো ডাটাবেসে টার্মিনালের প্রত্যাশিত আকার থাকতে পারে। যদি tput rows
আইওসিটিএল ব্যবহার না করতে পারে (উদাহরণস্বরূপ, আপনি যদি সিরিয়াল পোর্টের সাথে সংযুক্ত থাকেন) তবে এটি এখানে রেকর্ড করা মানগুলিতে ফিরে আসবে। এমন টার্মিনালের জন্য যার আকার পরিবর্তন হতে পারে, এটি কেবল অনুমান এবং ভুল হওয়ার সম্ভাবনা রয়েছে।আরও তথ্যের man tput
জন্য, টার্মিনালটি নিয়ন্ত্রণ করতে কমান্ডের জন্য, এবং man terminfo
টার্মিনালটি যে কাজটি করতে বলতে পারেন তার একটি তালিকার জন্য দেখুন।
আপনি যদি সোর্স কোডটি একবার দেখে থাকেন তবে লিনাক্সের উইন্ডোর আকার পুনরুদ্ধার করার জন্য আপনি less
কলগুলি ioctl()
জানতে পারবেন।
#ifdef TIOCGWINSZ
{
struct winsize w;
if (ioctl(2, TIOCGWINSZ, &w) == 0)
{
if (w.ws_row > 0)
sys_height = w.ws_row;
if (w.ws_col > 0)
sys_width = w.ws_col;
}
}
#else
#ifdef WIOCGETD
{
struct uwdata w;
if (ioctl(2, WIOCGETD, &w) == 0)
{
if (w.uw_height > 0)
sys_height = w.uw_height / w.uw_vs;
if (w.uw_width > 0)
sys_width = w.uw_width / w.uw_hs;
}
}
#endif
আমি নিশ্চিত নই যে আপনি যে তথ্যটি সন্ধান করছেন এটি এটি কিনা। আমার ধারণা, এর less
জন্য একটি সিগন্যাল হ্যান্ডলার নিবন্ধন করে SIGWINCH
। টার্মিনালের মাত্রা পরিবর্তিত হলে এটি SIGWINCH
সিগন্যাল পায় এবং টার্মিনালের বর্তমান মাত্রার জন্য tty তথ্য অনুসন্ধান করে।
http://www.gnu.org/software/libc/manual/html_node/Miscellaneous-Signals.html