এলিসপ সহ বর্তমান ডায়ার্ড বাফারে সমস্ত ফাইলের নাম পান


10

শিরোনাম অনুসারে, আমি কীভাবে এলিসপ ব্যবহার করে একটি ডায়ার্ড বাফারে সমস্ত ফাইল এন্ট্রি পেতে পারি?


1
এই প্রশ্নটি দেখতে যত সহজ সরল, আপনার যা প্রয়োজন তা হ'ল directory-files
জর্ডন বিওনডো

@ জর্ডন বিয়নদো আরও একটি জেনেরিক ফাংশন জানতে পেরে ভাল। মূলত আমি with-current-bufferফাইল বা চিহ্নিত ফাইলগুলির একটি তালিকা পেতে একটি ডায়ার্ড বাফারে ব্যবহার করার ইচ্ছা নিয়েছিলাম। সমস্ত ফাইলের তালিকার জন্য, আমি এখন ব্যবহার করতে পারি directory-files
টু

@ জর্ডন বিয়নদো আমি আবার চেষ্টা করেছি। আপনার পদ্ধতিটি কেবল তখনই কার্যকর হয় যখন আমাদের কাছে "যথাযথ" ডায়ার্ড বাফার থাকে। আমাদের যদি কাস্টমড ডায়ার্ড বাফার থাকে যা বিভিন্ন ডিরেক্টরি থেকে স্বেচ্ছাসেবী ফাইল সহ সন্নিবেশিত হয়, তবে directory-filesকোনও বিকল্প নয়।
টু

উত্তর:


7

চিহ্নগুলি হেরফের করা অপ্রয়োজনীয় এবং সম্ভবত সমস্যাযুক্ত বলে মনে হচ্ছে।

স্পষ্টতই এই ধরণের জিনিসটি করতে ডাইরডের মধ্যে কার্যকারিতা রয়েছে (যদিও তা ভালভাবে ডকুমেন্টেড নয়)। এখানে একটি সহজ পদ্ধতি:

;; Silence compile-time warning:
(declare-function dired-map-dired-file-lines "dired-aux")

(defun my-dired-files ()
  "Return a list of files (only) in the current dired buffer."
  (eval-when-compile (require 'cl-lib))
  (require 'dired-aux)
  (let (flist)
    (cl-flet ((fpush (fname) (push fname flist)))
      (dired-map-dired-file-lines #'fpush))
    (nreverse flist)))

সম্পাদনা:

মন্তব্যে আপনি বলেছিলেন যে আপনি ফলাফলের তালিকাটি ডিরেক্টরি পাথের পাশাপাশি ফাইলের পাথগুলি অন্তর্ভুক্ত করতে চান।

dired-map-dired-file-linesস্পষ্টত ডিরেক্টরি বাদ দেয় এবং সেগুলি অন্তর্ভুক্ত করার কোনও বিকল্প নেই; তবে মূল ফাংশনটি অনুলিপি করে এবং অযাচিত পরীক্ষা বাদ দিয়ে এমন কোনও ফাংশন সংজ্ঞায়িত করা সহজ:

(defun my-dired-map-over-files-and-dirs (fun)
  "Perform FUN with point at the end of each file or directory line.
FUN takes one argument, the absolute filename."
  (save-excursion
    (let (file buffer-read-only)
      (goto-char (point-min))
      (while (not (eobp))
        (save-excursion
          (and (not (eolp))
               (setq file (dired-get-filename nil t)) ; nil on non-file
               (progn (end-of-line)
                      (funcall fun file))))
        (forward-line 1)))))

dired-map-dired-file-linesপ্রাথমিক ফাংশনের জায়গায় কেবল এটি ব্যবহার করুন । এরপরে আপনি কলটিও বাদ দিতে পারেন declare-function

আপনি অবশ্যই অবশ্যই নতুন ক্রিয়াকলাপটি পরিবর্তনের জন্য পছন্দসই তালিকাটি তৈরি করতে সরাসরি এটি করতে ফাংশনটি কল করার পরিবর্তে তৈরি করতে পারেন। আমি অনুভব করি যে আরও সাধারণ পদ্ধতির অনুশীলনে ভাল, তবে আপনি এটি সমস্ত একক ফাংশনে আবৃত করার ধারণাটি পছন্দ করতে পারেন।


নন-সিএল সংস্করণ আছে? আমি সিএল পছন্দ করি তবে আমি প্রজেক্টটিতে সিএল নির্ভরতা ব্যবহার করতে পারছি না।
আপনি

cl-fletশুধু একটি ফাংশন সংজ্ঞায়িত। এটি কোডটি ক্লিনার করে তোলে তবে এটি এখনও একটি ফাংশন, সুতরাং আপনার প্রয়োজন অনুযায়ী একটি সংজ্ঞা দিন। অথবা একেবারেই ব্যবহার করবেন না dired-map-dired-file-lines, এবং পরিবর্তে প্রয়োজন অনুসারে এর কোডটি নকল করুন এবং সংশোধন করুন।
ফিল্ডস

তুমি ঠিক. টগলিং চিহ্নগুলি পুরানো চিহ্নগুলি সাফ করে, যা সমস্যাযুক্ত। আমি আপনার উত্তরটি সঠিক বলে বিবেচনা করছি।
তু

আপনার সমাধানটি কেবল ফাইলগুলি পুনরুদ্ধার করে বলে মনে হচ্ছে তবে কোনও ডিরেক্টরি নেই। সম্ভব হলে এটি আপডেট করুন।
আপনি

হ্যাঁ, আমি সবকিছু পেতে কিছুটা dired-get-filenameভাগ করে নিয়েছি (dired-get-filename t t)
আপনি

6

আমি জানি না যে এটির কোনও একক ক্রিয়াকলাপ রয়েছে কিনা তবে এটি আপনার পক্ষে কাজ করতে পারে:

(let (r)
  (dired-unmark-all-files ?\r nil)
  (dired-toggle-marks)
  (setq r (dired-get-marked-files))
  (dired-toggle-marks)
  r)

কখনও কখনও আপনি এটি সহজ করতে পারেন:

(progn (dired-toggle-marks)
       (dired-get-marked-files))

3

@ অ্যাবো-অ্যাবো এর উত্তর ছাড়াও, যা আপনাকে কীভাবে ফাইলের (এবং দির) নামের তালিকা পাবেন তা জানায় :

আপনি যা চান তার উপর নির্ভর করে আপনি বিকল্পটির পরিবর্তে dired-copy-filename-as-kill(আবদ্ধ w) ব্যবহার করতে পারেন dired-get-marked-files

এটি ফাইলের নামগুলিকে একটি একক, স্থান-বিভাজিত স্ট্রিংয়ের মধ্যে রাখে এবং স্ট্রিংটি টিপে চাপায় kill-ring

(স্পেস বিভাজনের অর্থ অবশ্যই, যখন ফাইলের কিছু নাম নিজের কাছে স্পেস অক্ষর ধারণ করে তখন এটি এতটা কার্যকর হয় না। ;-))

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