নীচে প্রম্পট দিয়ে এক্সটার্ম কিভাবে শুরু করবেন?


12

এক্সটার্ম শুরু করার সময় প্রম্পটটি টার্মিনালের প্রথম লাইনে শুরু হয়। চলমান কমান্ডগুলি প্রম্পটটি নীচে না পৌঁছানো অবধি সরে যায় এবং তারপরে এটি সেখানেই থাকে (এমনকি Shift- Page Downবা মাউস এটি পরিবর্তন করতে পারে না)। পরিবর্তে টার্মিনালটির শুরুটি আজীবন "বিশেষ" হওয়ার অনুরোধটি সর্বদা টার্মিনালের নীচে থাকা উচিত। দয়া করে নোট করুন যে আমার কাছে একটি বহু-লাইন প্রম্পট রয়েছে

অবশ্যই এটি অন্যথায় আগের মতো কাজ করা উচিত (আকার পরিবর্তনযোগ্য, স্ক্রোলযোগ্য, আউটপুটে কোনও অপ্রয়োজনীয় নিউলাইন এবং কোনও আউটপুট রহস্যজনকভাবে অদৃশ্য হয়ে যাবে), সুতরাং PROMPT_COMMAND='echo;echo;...'বা অনুরূপ কোনও বিকল্প নয়। সমাধানটি আদর্শভাবে শেল-নির্দিষ্ট হওয়া উচিত নয়।

সম্পাদনা: বর্তমান সমাধান , যখন সহজ ক্ষেত্রেই কাজ, কয়েক বিষয় রয়েছে:

  • এটা ব্যাশ নির্দিষ্ট । একটি আদর্শ সমাধান অন্যান্য শাঁসের জন্য পোর্টেবল হতে হবে।
  • অন্যান্য প্রক্রিয়াগুলি পরিবর্তিত হলেPS1 এটি ব্যর্থ হয় । একটা উদাহরণ যা যোগ করা virtualenv হয়, (virtualenv)শুরু এর PS1, যা সবসময় শুধু ভাঁজ উপরে দেখা যাবে না।
  • Ctrl- lএখন ইতিহাসের শেষ পৃষ্ঠাটি সরিয়ে দেয়

এই সমস্যাগুলি এড়াতে কি কোনও উপায় আছে, এক্সটার্মের কাঁটাচামচ করা?


একরকম, আমাদের এক্সটারমের স্ক্রোলবার বাফারে ফাঁকা অক্ষরগুলি প্রবর্তন করতে হবে।
SHW

3
প্রকৃতপক্ষে, clearকমান্ড কার্যকর করে প্রম্পটটি যে কোনও সময় সহজেই শীর্ষে ফেলা যায় ।
ওয়েলডিভার

@ এসএইচডাব্লু আমি আশা করছিলাম যে হ্যাকের পরিবর্তে এটির জন্য কোনও সেটিংস রয়েছে। টার্মিনাল হ্যাকগুলির আমার অভিজ্ঞতায় খুব সূক্ষ্ম বাগ প্রবর্তনের প্রবণতা রয়েছে।
l0b0

@ উত্তরদাতা তবে আমি চাই না যে এটি শীর্ষে থাকবে।
l0b0

1
যেহেতু কেবল শেল জানে যখন এটি কোনও প্রম্পট দেয় তখন কোনও সমাধান অবশ্যই শেলের প্রসঙ্গে থাকতে পারে। এমনকি এক্সটার্মকে কাঁটাচামচ করা সাহায্য করবে না কারণ এক্সটার্ম জানে না যা আউটপুট জিজ্ঞাসা করা হয় তা প্রম্পট কিনা or টার্মিনালের জন্য, শেল প্রম্পটটি কেবলমাত্র অন্য একটি চরিত্রের অনুক্রম, এটি প্রাপ্ত অন্য কোনও অক্ষরের ক্রম থেকে আলাদা নয়।
celtschk

উত্তর:


11

ব্যবহার করা হলে bash, নিম্নলিখিতটি কৌশলটি করা উচিত:

TOLASTLINE=$(tput cup "$LINES")
PS1="\[$TOLASTLINE\]$PS1"

বা ( tputপ্রতিটি প্রম্পটের আগে এটি একটি কমান্ড চালিত হওয়ায় কম দক্ষ , তবে টার্মিনাল উইন্ডোটি পুনরায় আকার দেওয়ার পরে কাজ করে):

PS1='\[$(tput cup "$LINES")\]'$PS1

tputপ্রস্থান কোডটি পরিবর্তন থেকে রোধ করতে, আপনি স্পষ্টভাবে এটি সংরক্ষণ এবং পুনরায় সেট করতে পারেন:

PS1='\[$(retval=$?;tput cup "$LINES";exit $retval)\]'$PS1

ভেরিয়েবল retvalস্থানীয় হয় নোট করুন ; এটি retvalশেল আপনি অন্যভাবে সংজ্ঞায়িত হতে পারে কোনও পরিবর্তনশীল প্রভাবিত করে না ।

যেহেতু বেশিরভাগ টার্মিনালগুলির cupক্ষমতা একই \e[y;xH, আপনি এটি হার্ডকোডও করতে পারেন:

PS1='\[\e[$LINES;1H\]'$PS1

আপনি যদি PS1 এর পরে পুনরায় সেট করার বিরুদ্ধে সুরক্ষিত থাকতে চান তবে আপনি PROMPT_COMMANDভেরিয়েবলটিও ব্যবহার করতে পারেন । যদি সেট করা থাকে তবে প্রম্পট আউটপুট আসার আগে এটি কমান্ড হিসাবে চালিত হবে । সুতরাং প্রভাব দ্বারা অর্জন করা যেতে পারে

PROMPT_COMMAND='(retval=$?;tput cup "$LINES";exit $retval)'

অবশ্যই, রিসেটটি PS1এটিকে প্রভাবিত করবে না এমন কিছু অন্যান্য সফ্টওয়্যারও পরিবর্তিত হতে পারে PROMPT_COMMAND


কিভাবে tputঅনেক থেকে পৃথক echoকমান্ড? (কৌতূহল থেকে জিজ্ঞাসা করা)
SHW

@ l0b0, সম্ভবত পৃথক উত্তর প্রাপ্য নয়। আমি আশা করি celtschk কিছু মনে করবে না আমি তার উত্তর সম্পাদনা করেছি।
স্টাফেন চেজেলাস

'\[$(tput cup "$LINES")\]' সুন্দর কাজ করে । ধন্যবাদ!
l0b0

এখানে একটি সমস্যা রয়েছে tput: মনে হচ্ছে এটি পুনরায় সেট হয়ে গেছে $exit_code। ব্যবহার করে স্থির\[\e[$LINES;1H\]
l0b0

1
@ l0b0: আমি এখন এমন একটি সংস্করণ ব্যবহার করেছি tputযা প্রস্থান কোডটি সংরক্ষণ করে।
celtschk

4

পূর্বের উত্তরের সামান্য সরলকরণ হিসাবে, আমি কেবল চালানো সহজ করে পেয়েছি:

tput cup $LINES

শুরুতে .bashrcবা .zshrc। এটা ঠিক কাজ করে।

পেশাদাররা:

  • এটি কেবল একবার মুদ্রণ করে যখন আপনি নিজের শেলটি শুরু করেন

কনস:

  • যখন ^ এল মাধ্যমে স্ক্রীনের ক্লিয়ারিং, এটা মুদ্রণ করে না এবং aliasing clearকরতে clear; tput ...সাহায্য করে না;
  • টার্মিনালকে পুনরায় আকার দেওয়া হলে প্রম্পট অন্যত্র চলে যায়

2

ব্যবহার করা উত্তরগুলি $LINESঅহেতুক অ-বহনযোগ্য are হিসাবে সম্পন্ন resize, আপনি কেবল xtermএকটি নির্বিচারে বড় লাইন সংখ্যাতে অবস্থান নির্ধারণ করতে বলতে পারেন , উদাহরণস্বরূপ,

tput cup 9999 0

(ধরে নিচ্ছি যে আপনার কাছে 10 হাজার লাইনের চেয়ে কম উইন্ডো রয়েছে, স্ক্রোলব্যাক উপেক্ষা করে )।

স্ট্রিংটি উইন্ডোটির আকার পরিবর্তন করার কোনও পার্শ্ব-প্রতিক্রিয়া হিসাবে পরিবর্তিত হবে না, আপনি এটি একবার গণনা করতে পারেন এবং এটি আপনার প্রম্পট-স্ট্রিংয়ে একটি ধ্রুবক হিসাবে আটকান, উদাহরণস্বরূপ,

TPUT_END=$(tput cup 9999 0)

এবং পরে

PS1="${TPUT_END} myprompt: "

আপনার পছন্দ অনুযায়ী।

অন্যান্য প্রক্রিয়াগুলি সংশোধন করার ক্ষেত্রে PS1: আপনাকে অবশ্যই PS1এটির মতো পরিবর্তন করা উচিত তা নিশ্চিত করতে আপনাকে এই পরিবর্তনগুলির পরে পুনরায় সংশোধন করতে হবে । তবে পরিবর্তনগুলি কোথায় করা উচিত তা উল্লেখ করার জন্য প্রশ্নের পর্যাপ্ত বিবরণ নেই ।

এবং পরিশেষে: বাশের অনুমানের কারণে ট্যাব-সমাপ্তির আচরণ এই ধরণের পরিবর্তনের সাথে জড়িত নয়।


"ট্যাব-সমাপ্তির আচরণ এই ধরণের পরিবর্তনের সাথে জড়িত হয় না" এর অর্থ কী?
l0b0

আমি মনে করি আপনার অর্থ PS1="${TPUT_END} myprompt: ", বা এমনকিPS1="${TPUT_END}${PS1}"
l0b0

পরেরটির জন্য - ডান (মেকফাইলগুলি চিন্তা করে টাইপ করুন)। প্রাক্তনদের জন্য, আমি মনে রেখেছি যে বাশের কমান্ড-সম্পাদনা লাইনটি পুনরায় মুদ্রণ করতে সক্ষম হবে (প্রম্পট সহ), এবং কমান্ড-সমাপ্তির কারণে যখন এই স্ক্রোলিংয়ের সাথে মিলিত হয় তখন আপনি কিছু অদ্ভুত আচরণ পেতে পারেন।
থমাস ডিকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.