নোড.জেএস: কোনও পূর্ববর্তী নিউলাইন ছাড়াই কনসোলের মুদ্রণ?


683

ট্রেলিং করা নতুন লাইন ছাড়া কনসোলে মুদ্রণের জন্য কি কোনও পদ্ধতি আছে? consoleবস্তুর ডকুমেন্টেশন যে সংক্রান্ত কিছু বলে না:

console.log()

নতুন লাইনের সাহায্যে প্রিন্ট করুন। এই ফাংশনটি এক- printf()মত উপায়ে একাধিক যুক্তি নিতে পারে । উদাহরণ:

console.log('count: %d', count);

যদি প্রথম স্ট্রিংয়ে ফর্ম্যাটিং উপাদান না পাওয়া যায় তবে util.inspectপ্রতিটি আর্গুমেন্টে ব্যবহৃত হয়।

উত্তর:


1058

আপনি ব্যবহার করতে পারেন process.stdout.write():

process.stdout.write("hello: ");

বিশদ জন্য ডক্স দেখুন ।


7
এটি আমার জন্য বিপরীত সমস্যা সমাধান করেছে। আমি যখন এটি একটি নতুন লাইনের চরিত্রটি মুদ্রণ করতে চেয়েছিলাম তখন আক্ষরিক console.logমুদ্রণ \nকরছিলাম।
পল

@পলপ্রো নিউলাইন চরটি '\ n' নয়?
আলেকজান্ডার মিলস

3
@ অ্যালেক্সমিলস এটি একটি নতুন লাইন চরিত্রের জন্য পালানোর ক্রম, তবে এটি নিজেই একটি নতুন লাইন চরিত্র নয়। আমি একটি আক্ষরিক অর্থে ` followed by an পাচ্ছিলাম, যখন আমি একটি আসল নিউলাইন চরিত্র আউটপুট করতে চেয়েছিলাম।
পল

379

এছাড়াও, যদি আপনি একই লাইনে বার্তাগুলি ওভাররাইট করতে চান, উদাহরণস্বরূপ একটি কাউন্টডাউন, আপনি স্ট্রিংয়ের শেষে '\ r' যুক্ত করতে পারেন।

process.stdout.write("Downloading " + data.length + " bytes\r");

18
যদিও প্রশ্নের উত্তর না হলেও এটি একটি আশ্চর্যজনক উত্তর। চেষ্টা করার অপেক্ষা করতে পারি না।
লংদা

8
এটি আমার জন্য উইন্ডোজে কাজ করে না । তবে অ-ডো-তে দুর্দান্ত কাজ করে।
চৌই

45
উইন্ডোজের জন্য, আপনি সমমানের কোড '\ 033 [0 জি' ব্যবহার করতে পারেন, যেমন:process.stdout.write("Downloading " + data.length + " bytes\033[0G");
গার্সিয়াডেল কাস্টিলো

19
করতে ANSI পালাবার কোড উপরে কঠোর মোডে কাজ @GarciadelCastillo দ্বারা একটি মন্তব্যে দেওয়া প্রতিস্থাপন অকট্যাল আক্ষরিক \033হেক্স আক্ষরিক সঙ্গে \x1bভালো: \x1b[0G। (এটি কঠোর এবং অ-কঠোর কোড উভয়ই দিয়ে কাজ করে)
কিছু

7
উইন্ডোজটিতে এটি কাজ করার জন্য স্ট্রিংয়ের শেষে না থেকে শুরুতে \ r রাখুন।
daremkd

20

উইন্ডোজ কনসোলে (লিনাক্স, এছাড়াও) আপনার '\r'সমতুল্য কোডটি প্রতিস্থাপন করা উচিত \033[0G:

process.stdout.write('ok\033[0G');

এটি প্রথম কলামে কার্সারটি প্রেরণ করতে একটি ভিটি 220 টার্মিনাল অব্যাহতি ক্রম ব্যবহার করে।


1
আপনি কেবলমাত্র বর্তমান লাইনের পরিবর্তে একাধিক লাইন ব্যাক আপ করবেন কীভাবে? শীর্ষ প্রোগ্রাম যখন এটি চলমান পুনরুদ্ধার কি ছিল যখন এটি সম্পন্ন করা হচ্ছে আমার সমগ্র বাফার ওভাররাইড করতে পারবে বলে মনে হয়। যে কেউ এটি কিভাবে এটি জানেন? i.imgur.com/AtCmEjn.gif
শেভ

আমি বিশ্বাস করি এটি সম্ভবত এর মধ্যে একটির মতো কিছু ব্যবহার করে: github.com/mscdex/node-ncurses github.com/chjj/blessed
ব্র্যান্ডন

1
এটি কাজ করে তবে আমি কার্সারটিও পছন্দ মতো [\] 39করে var spinner = '|/-\\'.split('');process.stdout.write("["+this.randomElement(spinner)+"] "+message+"\033[0G");
পেয়েছি

1
@ শেভ টপটি বিশেষ, এএনএসআই এস্কেপ কোডগুলি দিয়ে আপনি লিখতে পারেন এমন কিছু নয়। এটি প্রকৃতপক্ষে এনক্রোস ব্যবহার করে যার কারণে আপনি এটি এম্বেড করা সিস্টেমে পাবেন না যেখানে বড় সি লিবস নেই
বিড়াল

1
@ শেভ: বেশিরভাগ লোকেরা তাদের নিজস্ব এফইউডির কারণে হার্ডকডযুক্ত পালানোর ক্রমগুলি খেলতে আপনাকে বিরত রাখবে, তবে প্রায় প্রত্যেকেই এখন ভিটি 100 ব্যবহার করে, সুতরাং সামঞ্জস্যতা আসলে কোনও সমস্যা নয়। আপনি যে কার্যকারিতাটির উল্লেখ করছেন সেটি হ'ল "বিকল্প স্ক্রিন" আচরণ। man console_codes(লিনাক্স বা অনলাইনে) একটি প্রাথমিক পরিচয় পাওয়া যাবে এবং আমার প্রিয় রেফারেন্সটি www2.phys.canterbury.ac.nz/dept/docs/manouts/unix/DEC_4.0e_Docs/… (এর সামগ্রীর 99% অংশ এখনও কাজ করে) । কেবলমাত্র সতর্কতামূলক: ব্যাপকভাবে মোতায়েনের আগে বিভিন্ন টার্মিনালগুলিতে যে কোনও পরীক্ষা-নিরীক্ষার পরীক্ষা করার জন্য প্রস্তুত থাকুন।
i336_

18

একটি সারি ওভাররাইট করতে সক্ষম হবার বিষয়ে উপরে @rodowi দ্বারা করা উজ্জ্বল সংযোজনটির সম্প্রসারণ / বর্ধন হিসাবে:

process.stdout.write("Downloading " + data.length + " bytes\r");

আপনি যদি না চান যে টার্মিনাল কার্সারটি প্রথম অক্ষরটিতে অবস্থিত হয়, যেমন আমি আমার কোডে দেখেছি, নিম্নলিখিতগুলি করা বিবেচনা করুন:

let dots = ''
process.stdout.write(`Loading `)

let tmrID = setInterval(() => {
  dots += '.'
  process.stdout.write(`\rLoading ${dots}`)
}, 1000)

setTimeout(() => {
  clearInterval(tmrID)
  console.log(`\rLoaded in [3500 ms]`)
}, 3500)

\rপরবর্তী মুদ্রণ বিবৃতিটির সামনে রেখে কার্সারটি প্রতিস্থাপনের স্ট্রিং পূর্ববর্তীটি ওভাররাইট করার ঠিক আগে কার্সারটি পুনরায় সেট করা হয়।


13

ব্যবহার.প্রিন্ট ব্যবহার করা যেতে পারে। পড়ুন: http://nodejs.org/api/util.html#util_util_print

ব্যবহার.প্রিন্ট ([...]) # একটি সিঙ্ক্রোনাস আউটপুট ফাংশন। প্রক্রিয়াটিকে অবরুদ্ধ করবে, প্রতিটি যুক্তিকে স্ট্রিংয়ে ফেলে দেবে এবং পরে স্টাডআউটে আউটপুট দেয়। প্রতিটি যুক্তির পরে নতুন লাইন স্থাপন করে না।

একটি উদাহরণ:

// get total length
var len = parseInt(response.headers['content-length'], 10);
var cur = 0;

// handle the response
response.on('data', function(chunk) {
  cur += chunk.length;
  util.print("Downloading " + (100.0 * cur / len).toFixed(2) + "% " + cur + " bytes\r");
});

39
util.printএখন
অবহেলিত

(node:7616) DeprecationWarning: util.print is deprecated. Use console.log instead.
সবুজ

10

মনে হচ্ছে অনেক উত্তর রয়েছে:

process.stdout.write

ত্রুটি লগগুলি নির্গত করা উচিত:

process.stderr

পরিবর্তে ব্যবহার করুন:

console.error

যে কারও জন্য অবাক process.stdout.write('\033[0G');হওয়ার কারণ এটি কেন কিছু করছে না কারণ stdoutএটি বাফার হয়েছে এবং আপনাকে drainইভেন্টের জন্য অপেক্ষা করতে হবে ( আরও তথ্য )।

রিটার্ন লিখলে falseতা কোনও drainইভেন্টে আগুন ধরিয়ে দেয় ।


4

এই সমাধানগুলির কোনওটিই আমার পক্ষে কাজ করে না, process.stdout.write('ok\033[0G')এবং কেবল '\r'একটি নতুন লাইন তৈরি করে তবে ম্যাক ওএসএক্স ১০.৯.২ এ ওভাররাইট করবেন না।

সম্পাদনা: বর্তমান লাইনটি প্রতিস্থাপন করতে আমাকে এটি ব্যবহার করতে হয়েছিল:

process.stdout.write('\033[0G');
process.stdout.write('newstuff');

4

কড়া মোড ব্যবহার করার সময় আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

নোড ত্রুটি: "কঠোর মোডে অক্টাল আক্ষরিক অনুমতি নেই" "

নিম্নলিখিত সমাধান কাজ করে ( উত্স ):

process.stdout.write("received: " + bytesReceived + "\x1B[0G");

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