কোনও বাফার কোনও ফাইল পরিদর্শন করছে কিনা তা কীভাবে পরীক্ষা করবেন?


9

আমি পরীক্ষা করতে চাই যে কিছু (বলুন, বর্তমান) বাফার কোনও ফাইল পরিদর্শন করছে কিনা। আমি বলতে পারি:

(if (buffer-file-name) ...)

তবে এটি খুব মার্জিত নয় বলে মনে হচ্ছে - আমি যা আগ্রহী তা হ'ল বুলিয়ান মান, প্রশ্নে বাফারের আসল নাম নয় । যদি buffer-file-nameফাংশনটি এলিস্পে লেখা থাকে তবে এটির উত্সটি কী ব্যবহার করে তা সন্ধান করতে আমি এটির উত্স সন্ধান করতে পারি - তবে এটি সিটিতে লেখা ছিল এবং আমি ইমাস সূত্রগুলি ইনস্টল করতে পারার পরেও আমি আশঙ্কা করছি যে আমি কোনও এলিস্পের নামটি খুঁজে না পাব afraid ফাংশনটির জন্য যা আমি সেখানে যাই হোক না কেন পরে যাচাই করি।

আমার যা প্রয়োজন তা হ'ল আমি বর্তমান বাফারের ফাইলটির নামের উপর ভিত্তি করে একটি ডিরেক্টরি তৈরি করতে চাই এবং বর্তমানে আমি এটি কম-বেশি করছি:

(make-directory (if (buffer-file-name) (file-name-base) "default-dir"))

সুতরাং, এটি করার এলিস্প-আইডিয়োম্যাটিক পদ্ধতিটি কী হবে?


2
আপনি কেন buffer-file-nameসত্যই ব্যবহার করতে আপত্তি করছেন তা নিশ্চিত নন , এটি করার সঠিক উপায় (যদি আপনি সত্যিই চান তবে এটি tকরুন (and (buffer-file-name) t)কিন্তু এটি অশুভ আইএমও)। এর বাস্তবায়নটি filenameবাফার সি স্ট্রাক্টের ক্ষেত্রটি পড়ছে , যা যাইহোক এলিসপ থেকে সরাসরি অ্যাক্সেসযোগ্য নয়। শেষ পর্যন্ত, এটি কেবল পয়েন্টার যা শূন্য বা না হয়।
সিগমা

ঠিক আছে, যদি এটি সঠিক উপায় হয় তবে আমার সাথে তা ঠিক আছে। যেমনটি আমি বলেছি - আমি সি বাস্তবায়ন জানতাম না, এবং সাধারণ জ্ঞান বলে যে ফাইলের নাম জিজ্ঞাসা করার সময় আমি কেবল জানতে চাই যে এখানে কোনও অনর্থক থাকতে পারে কি না।
এমবর্ক

এবং আমি সম্মত যে (and (buffer-file-name) t)অদ্ভুত লাগছে।
এমবর্ক

আপনি যদি (if (buffer-file-name) ... )এটি মার্জিত না মনে করেন , তবে আপনি খুব দীর্ঘকাল ধরে এলিস্পে কোডিং করছেন না। এটি এখান থেকে কেবল কৃপণতা পায়।
নিসপিও

উত্তর:


12

আমি তর্ক করা চাই যে আপনার ব্যবহারের হয় কথ্য elisp, যেহেতু বাফার নাম তার নিজের অধিকার একটি পুরোপুরি উপযুক্ত বুলিয়ান মান। ম্যানুয়াল থেকে উদ্ধৃতি :

যদি সত্য প্রকাশের পরীক্ষার ক্ষেত্রে একটি গুরুত্বপূর্ণ দিক রয়েছে expression এখনও অবধি, আমরা 'সত্য' এবং 'মিথ্যা' বলে পূর্বাভাসের মান হিসাবে বলেছি যেন তারা নতুন ধরণের ইমাস লিস্প বস্তু ছিল। আসলে, 'মিথ্যা' কেবল আমাদের পুরানো বন্ধু nil। অন্য যে কোনও কিছু all যা কিছু — সত্য —

পয়েন্টটি আরও জানাতে, এর জন্য কোডটি দেখুন clone-buffer। আমি আশা করি আপনি নিম্নলিখিত দেখতে পাবেন:

(interactive
 (progn
   (if buffer-file-name
       (error "Cannot clone a file-visiting buffer"))
...

নোট করুন যে buffer-file-nameএটি যুক্তি ছাড়াই ফাংশনটি কল করার পরিবর্তে পরিবর্তনশীল বাঁধাইয়ের পরীক্ষা করছে (buffer-file-name), তবে দু'জনকে সবসময় একই আচরণ করা উচিত।


8

আপনি হয় (buffer-file-name)(alচ্ছিক বাফার যুক্তি সহ) বা বাফার-স্থানীয় buffer-file-nameভেরিয়েবল ব্যবহার করতে পারেন । উভয়ই প্রদত্ত বাফারের জন্য একই মানকে মূল্যায়ন করে।

যে হয় তাই আপনার কোড জরিমানা যদিও Elisp মধ্যে এই কাজ করতে, কথ্য উপায়। আপনি যদি মরিয়া হয়ে চেয়েছিলেন তবে আপনি সর্বদা একটি buffer-has-file-pমোড়কের কাজ করতে পারেন ।


ধন্যবাদ। ফাংশন বা পরিবর্তনশীলটি বেছে নেওয়ার জন্য কোনও উল্লেখযোগ্য পার্থক্য রয়েছে কি?
এমবর্ক

1
আমি তাই মনে করি না. আপনার যদি বাফার যুক্তিটি নির্দেশ করতে হয় তবে (buffer-file-name BUFFER)অবশ্যই এটি তুলনায় খুব ভাল (with-current-buffer BUFFER buffer-file-name), তবে অন্যথায় আমি মনে করি না আপনি কোনটি ব্যবহার করেন তা বিবেচনা করে (এবং যেমন ফাংশন সিটিতে লেখা আছে, আমি সন্দেহ করি যে পারফরম্যান্সের মধ্যে আরও অনেক পার্থক্য রয়েছে)।
ফিল্ডস

3

শুধু ব্যবহার buffer-file-name। লিস্পে আমরা প্রায়শই সত্যnil বোঝার জন্য একটি অ- মান ব্যবহার করি ।

কেবলমাত্র আপনি এটি এড়াতে চাইতে পারেন যদি ফাংশনটি ব্যয়বহুল হয় বা অযাচিত পার্শ্ব প্রতিক্রিয়া থাকে।


আমি দেখি. আমি জানি যে কিছুই অ- nilসত্য, আমি কেবল তখনই নামটি ধরতে ভেবেছিলাম যখন আমি কেবলমাত্র কোনও নাম বিদ্যমান কিনা তা "ব্যয়বহুল" কিনা তা জানতে চাই - তবে মনে হয় এটি এমনটি নয়।
এমবর্ক

1

থেকে "বাফার তালিকা" অধ্যায় নথিপত্রের:

বাফার-তালিকা দিয়ে ফিরে আসা তালিকাটি বিশেষভাবে নির্মিত; এটি কোনও অভ্যন্তরীণ ইমাক্স ডেটা কাঠামো নয় এবং এটিকে সংশোধন করার ফলে বাফারদের ক্রমের কোনও প্রভাব নেই।

সুতরাং আপনাকে লাইভ বাফারগুলির তালিকায় অনুসন্ধানের জন্য কোনও উপায় খুঁজে বের করতে হবে। এখানে একটি:

  (if (string-match-p (regexp-quote "My buffer name") (format "%s" (buffer-list)))
      (message "Open")
    (message "Not open"))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.