কিভাবে ইমাক্সের ডিরেক্টরি / উপ-ডিরেক্টরিতে পুনরাবৃত্তভাবে অনুসন্ধান / গ্রেপ ফাইলের বিষয়বস্তু অনুসন্ধান করতে হয়?


14

আমি বেশ কিছু সময়ের জন্য ইমাক্স ব্যবহার করছি এবং আমি এখনও কোনওভাবেই (প্রকল্পের) ডিরেক্টরিতে স্ট্রিংয়ের জন্য (পুনরাবৃত্তি) গ্রেপ করার সর্বোত্তম উপায় কী তা বুঝতে ব্যর্থ হয়েছি এবং ফলাফলগুলি একটি ডায়ার্ড বাফার হিসাবে উপস্থাপন করতে পারি বা আরও কিছুতে পেতে পারি দরকারী উপায়. আমাকে আলোকিত করুন।


আপনি কি helm-projectile-grepকমান্ডটি ব্যবহার করে চেষ্টা করেছেন (যদি আপনি হেলম প্রজেক্টিল ইনস্টল করেন) বা projectile-grep?
চক্রবর্তী রাঘুনন্দন

আমি জানি না কী helmবা projectileতবে এটি যদি প্রস্তাবিত সরঞ্জাম হয় তবে আমি এটি ইনস্টল করে শিখতে পারি।
বরিস স্ট্যাটনিকি

হ্যাঁ, প্রজেক্টাইল এমন একটি প্যাকেজ যা কমান্ডের সাহায্যে আপনার প্রশ্নের মধ্যে উল্লিখিত কাজগুলি করার সহজ উপায় সরবরাহ করে projectile-grep। এছাড়াও, আমি আপনাকে helmপ্যাকেজ ইনস্টল করার পরামর্শ দিচ্ছি । আমি ছাড়া helmএবং ই- এমকে চালানো কল্পনা করতে পারি না helm-projectile। আপনি helm-agপ্যাকেজটিতে আকর্ষণীয়ও হতে পারেন (যা ইমাসে রৌপ্য সন্ধানকারীর জন্য হেল্ম ইন্টারফেস সরবরাহ করে, যা গ্রাইপ বা এসকের চেয়ে সম্ভবত গতিযুক্ত)।
চক্রবর্তী রাঘুনন্দন

2
যাতে ভবিষ্যতের গুগল এবং ফোরাম অনুসন্ধানকারীদের জন্য প্রশ্নটি আরও দরকারী এবং সহজতর হতে পারে, সম্ভবত শব্দটি পুনরাবৃত্তভাবে অন্তর্ভুক্ত করতে প্রশ্নের শিরোনামটি সংশোধন করার বিষয়টি বিবেচনা করুন এবং সুযোগটি সীমাবদ্ধ রাখার বিষয়টি বিবেচনা করুন - যেমন, কোনও ডিরেক্টরিতে পুনরাবৃত্তভাবে গ্রেপ ফাইলের বিষয়বস্তু কীভাবে করবেন / সাব । এটি কেবল একটি উদাহরণ - এটি পরিবর্তে অন্য কিছু হতে পারে।
আইনজীবি

1
যদিও এখন পর্যন্ত দেওয়া মন্তব্য এবং উত্তরগুলি বিভিন্ন অভিনব উপায়ে এটি করার জন্য বেশ কয়েকটি প্যাকেজটির পরামর্শ দিয়েছে, তবে আপনার প্রশ্ন থেকে আমি দেখতে পাচ্ছি না যে সহজ M-x grepআপনার প্রয়োজনীয়তাটি কেন করেন না। এটি আপনাকে একটি স্বেচ্ছাসেবক কমান্ড লাইন দেয়, findযখন আমার পুনরাবৃত্তি প্রয়োজন তখন আমি কখনও কখনও সেখানে ব্যবহার করি।
এমএপি

উত্তর:


15

ঠিক আছে, যেহেতু মূল প্রশ্নের উল্লেখ নেই rgrep, তাই আমি এগিয়ে গিয়ে এখানে এটি উল্লেখ করব point এটি ইতিমধ্যে ইমাসে অন্তর্নির্মিত সবচেয়ে সহজ বিকল্প এবং আমি এটি বেশিরভাগ জিনিসের জন্য পর্যাপ্তর চেয়ে বেশি হিসাবে খুঁজে পেয়েছি।

ডকুমেন্টেশন থেকে,

Recursively grep for REGEXP in FILES in directory tree rooted at DIR.

অনুসন্ধানটি ফাইলের নামগুলি শেল প্যাটার্নের সাথে মিলিত ফাইলগুলিতে সীমাবদ্ধ।

সুতরাং, উদাহরণস্বরূপ, সব পাইথন ফাইলগুলি আমার home ডিরেক্টরির তলদেশে ব্যবহার জন্য অনুসন্ধান করতে some_function, আমি সঙ্গে এটি কল করবে some_function, *.py, ~/আর্গুমেন্ট হিসাবে। ফলাফলগুলি একটি নতুন বাফারে প্রদর্শিত হবে।


1
find-grep-diredওপি "যেহেতু ফলাফল একটি ডায়ার্ড বাফার হিসাবে উপস্থাপিত হয়েছে ... বা" হিসাবে উল্লেখ করা যেতে পারে
এনপোস্টাবস

@ এনপোস্টাভস আমি find-grep-diredনিজে ব্যবহার করি নি, উত্তরে এটির উত্তরে যোগ করুন
ব্যবহারকারী2699

আমি একবার এসি ও এগ্রির পছন্দগুলির সাথে পরীক্ষা করেছিলাম, এই ধারণায় যে আমাকে আরগ্রিপ থেকে কিছু ব্যবহার করে কিছু পরিবর্তন করা উচিত, কারণ তাদের ধারণা আরও ভাল হবে। শেষ পর্যন্ত আমি আরজিআরপি নিয়েই রইলাম, কারণ পরিবর্তনের কোনও লাভ আমি পাইনি! কমান্ড লাইনে অবশ্যই একটি কেস তৈরি করতে হবে, তবে ইমাসে rgrepঅনুসন্ধান অনুসন্ধানকে লক্ষ্য করে এমন একটি ভাল কাজ করেছে যে তাদের মধ্যে কোনও গতির তাত্পর্য নেই। (আমি বলতে চাই যে কিছু ক্ষেত্রে আরগ্রিপ ভগ্নাংশের চেয়ে দ্রুত ছিল , তবে আমি নিশ্চিত মনে করি না))
ফিলস

1
নোট করুন next-errorএবং previous-errorফলাফল সেট মাধ্যমে নেভিগেট করতে ব্যবহার করা যেতে পারে। আমি খুঁজে পাই M-g M-nএবং M-g M-pস্ট্যান্ডার্ড বাইন্ডিংগুলির মধ্যে সবচেয়ে সুবিধাজনক।
ফিল্ডস

find-grep-diredক্রস-রেফারেন্সিং লিঙ্কগুলির সাথে আমাকে বাফার দেয় না। rgrepএটি আমার জন্য এবং সর্বশেষ পরামর্শটি next-error previous-errorদুর্দান্ত! আমার একমাত্র বাছাইযোগ্য বাফারের শুরুতে সমস্ত অগোছালো কমান্ড প্রয়োগের আউটপুট।
রবার্ট

11

আমি আনন্দের সাথে M-x find-grep-diredবছর ধরে ব্যবহার করি । এটি ফলাফলকে একটি ক্লান্ত বাফার হিসাবে ফিরিয়ে দেয়, যা আপনি ব্যবহার করতে পারেন।


এর সাথে কাজ করার জন্য ক্রস-রেফারেন্সটি যুক্ত করতে আমার কিছুটা সমস্যা হয়েছিল। এটির কনফিগারেশনটি বেশ কদর্য ( find-ls-option) এবং সর্বোপরি আপনি এমন কিছু দিয়ে শেষ করেছেন যা ফাইলের নামের আগে তারিখ না থাকলে কাজ করে না!
রবার্ট

5

সমাধান 1 (সেরা সমাধান):

পরামর্শ ইনস্টল করুন ( https://github.com/abo-abo/swiper/blob/master/counsel.el )

তারপরে M-x counsel-git-grep

কোনও সেটআপের প্রয়োজন নেই (গিটটি প্রকল্পের মূল এবং বাদ দিতে ফাইলগুলি জানে)। উভয় git grepএবং counselদক্ষ।

প্রকল্পটি গিট দ্বারা পরিচালনা করা প্রয়োজন।

পরামর্শ আইভি-মোড প্রয়োজন।

সমাধান 2:

এই সমাধানটি গ্রেপ ব্যবহার করে এবং যে কোনও প্রকল্পে কাজ করে। এটি সমাধান 1 এর নিকৃষ্টতর কারণ এটি ধীর এবং ম্যানুয়াল সেটআপ প্রয়োজন। এটি আইভি-মোডের উপর ভিত্তি করে।

(defvar simple-project-root "~/.emacs.d")
(defun simple-grep ()
  (interactive)
  (unless (featurep 'ivy)
    (require 'ivy))
  (let* ((default-directory (file-name-as-directory simple-project-root))
         (keyword (read-string "Keyword:")))
    (ivy-read (format "Grep at %s:" simple-project-root)
              (split-string (shell-command-to-string (format "grep -rsnI %s ." keyword)) "\n" t)
              :action (lambda (val)
                        (let* ((lst (split-string val ":"))
                               (linenum (string-to-number (cadr lst))))
                          ;; open file
                          (find-file (car lst))
                          ;; goto line if line number exists
                          (when (and linenum (> linenum 0))
                            (goto-char (point-min))
                            (forward-line (1- linenum))))))))

আপনার সেটআপের জন্য .dir-local.el তৈরি করতে হবে simple-project-root, প্রযুক্তিগত তথ্যের জন্য https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html দেখুন

সমাধান 2 এর কোডটি কেবল একটি প্রোটোটাইপ। আমার বাস্তব বাস্তবায়ন অনেক জটিল। দেখুন counsel-etags-grephttps://github.com/redguardtoo/counsel-etags/blob/master/counsel-etags.el

সারসংক্ষেপ:

এগুলি আমার জানা সেরা দুটি সমাধান।

অন্য কোনও ভাল সমাধান যদি বিদ্যমান থাকে তবে উত্পাদন-প্রস্তুত হওয়ার জন্য তাদের কমপক্ষে নীচের সমস্যার সমাধান করতে হবে,

  • কীভাবে গ্রেপ-তে কীওয়ার্ড পাবেন (উদাহরণস্বরূপ, নির্বাচিত অঞ্চল থেকে কীওয়ার্ড পান)

  • কীওয়ার্ড এড়িয়ে চলুন

  • যদি আরও দক্ষ গ্রেপ প্রোগ্রাম বিদ্যমান থাকে তবে আমাদের এটি ব্যবহার করা উচিত (রিপগ্রিপ, দ্য_সিলভার_সার্চার / এজি, ... ইত্যাদি), অথবা অন্যথায় ডিফল্ট গ্রেপ

  • প্রার্থী উইন্ডোটির স্ক্রিনের পুরো প্রস্থ ব্যবহার করা উচিত এবং ব্যবহারকারীরা ইন্টারেক্টিভভাবে প্রার্থীদের ফিল্টার করতে পারে (এজন্য লোকেরা আইভি বা হেলম ব্যবহার করে)

  • আমাদের প্রার্থী উইন্ডোতে আপেক্ষিক পথটি দেখানো উচিত

  • পূর্ববর্তী গ্রেপড ফলাফল পুনরায় ব্যবহার করতে সক্ষম। সুতরাং আগের ফলাফল সংরক্ষণ করা উচিত। আপনি ব্যবহার করতে পারেন ivy-resumeথেকে ivyবা helm-resumeথেকেhelm

  • আপনি যখন আগের গ্রেপড ফলাফল সংরক্ষণ করেন, তখন আগের ফলাফলের প্রসঙ্গটিও সংরক্ষণ করা উচিত। উদাহরণস্বরূপ, সলিউশন 2 এর কোডটিতে default-directoryপ্রসঙ্গ। আরও তথ্যের জন্য https://github.com/abo-abo/swiper/issues/591 দেখুন ।

  • বর্ধিত নিয়মিত অভিব্যক্তিটি ব্যবহার করা উচিত কারণ এটি সহজ এবং ইতোমধ্যে counsel-git-grepএবং the_silver_searcher / ag ব্যবহার করে ।


4

আমি @ চেন বিনের সমাধানে আরও একটি সমাধান যুক্ত করতে চাই যা এটিও ব্যবহার করে counsel(তবে এটির জন্য আপনার কোনও প্রকল্প বজায় রাখার দরকার নেই git)।

আপনাকে এগ্রি (রৌপ্য অনুসন্ধানকারী) ইনস্টল করতে হবে এবং সুনির্দিষ্টভাবে counselকমান্ড সরবরাহ করবে counsel-agযা প্রবেশ করা স্ট্রিংয়ের জন্য বর্তমান ডিরেক্টরিটি অনুসন্ধান করে।

আপনি যদি কোনও প্রকল্পের মধ্যে অনুসন্ধান করতে চান (কেবলমাত্র বর্তমান ওয়ার্কিং ডিরেক্টরি নয়) তবে এটিতে আপনার যুক্ত করুন .emacs: -

  (defun rag/counsel-ag-project-at-point ()
    "use counsel ag to search for the word at point in the project"
    (interactive)
    (counsel-ag (thing-at-point 'symbol) (projectile-project-root)))

এই ফাংশনটি agপুনরাবৃত্তভাবে প্রকল্পের মূল ডিরেক্টরিটি অনুসন্ধান করতে ব্যবহার করবে ।

সম্পাদনা করুন : উপরের ফাংশনটি অনুসন্ধানের জন্য প্রতীকটিতে ডিফল্ট হয়। আপনি যদি এই আচরণটি পছন্দ না করেন তবে এটির (thing-at-point 'symbol)সাথে প্রতিস্থাপন করুন nil। এবং আপনি যদি অনুসন্ধানের ফলাফলগুলি এর নিজস্ব বাফার প্রেসে চানC-c C-o

সম্পাদনা 2 : আপনি ripgrepইনস্টল করা থাকলে, আপনি উপরের ফাংশনটি counsel-agদিয়ে প্রতিস্থাপন করতে পারেন counsel-rgএবং এটি ঠিক ঠিক হবে :)


কি projectile-project-rootপাগল প্রকল্পের রুট এটি ব্যবহারযোগ্য?
বরিস স্ট্যাটনিকি

হ্যাঁ, যতক্ষণ না এটি একটি বৈকল্পিক প্রজেক্টাল প্রকল্প এটি কাজ করবে। আমার ধারণা প্রজেক্টাইল-রেল নামে কিছু প্যাকেজ ছিল।
চক্রবর্তী রাঘুনন্দন 14

কেন আপনি এই ফাংশনটির নাম দিয়েছেন rag/...?
বোরিস স্ট্যাটনিকিকি

এটি একটি সাধারণ শৈলী যা লোকেরা তাদের নিজস্ব ফাংশনগুলি লেখার সময় প্রায়শই ব্যবহার করে (আপনি যদি তাদের ইম্যাক্স কনফিগারেশনটি ব্রাউজ করেন তবে এটি অন্য অনেকের দ্বারা সম্পন্ন হতে পারে)। আমি যে সমস্ত ফাংশন সংজ্ঞায়িত করেছি তা rag/উপসর্গ দিয়ে শুরু হয় এবং এটি তাদের অধীনে খুঁজে পাওয়া সহজ করে তোলে M-x:)
চক্রবর্তী রাঘুনন্দন

আইসি, এটি আপনার নাম :-)
বোরিস স্ট্যাটনিকি

2

এখানে একটি কাস্টম গ্রেপ ফাংশনের উদাহরণ রয়েছে যা ডিরেক্টরি এবং এর উপ-ডিরেক্টরিগুলিতে ফাইল বিষয়বস্তু (অনুসন্ধানের শর্তের জন্য একটি রেজিএক্সপক্স ব্যবহার করে) পুনরাবৃত্ত করে এবং এর আগে এবং পরে প্রসঙ্গের রেখার সাথে ফলাফলগুলি প্রদর্শন করে। অন্তর্নির্মিত compile.elএবং grep.elলাইব্রেরিগুলি অনুসন্ধানের ফলাফল সহ ফাইলে অবস্থানে যাওয়ার জন্য কয়েকটি পদ্ধতি সরবরাহ করে। এই উদাহরণটি কাজ করার জন্য আর কিছু ইনস্টল করার দরকার নেই - যা যা প্রয়োজন তা হ'ল ইম্যাকসের একটি সম্পূর্ণ সংস্করণ এবং grepইউটিলিটি ইনস্টল থাকা কম্পিউটার computer ভেরিয়েবলটি ডিফল্ট পর্যাপ্ত পরিমাণে না হলে ইউটিলিটির grep-programকোনও নির্দিষ্ট স্থানে নির্দেশ করতে সামঞ্জস্য করা যায় grep

(defun recursive-grep ()
"Recursively grep file contents.  `i` case insensitive; `n` print line number;
`I` ignore binary files; `E` extended regular expressions; `r` recursive"
(interactive)
  (let* ((search-term (read-string "regex:  "))
         (search-path
           (directory-file-name (expand-file-name (read-directory-name "directory:  "))))
         (default-directory (file-name-as-directory search-path))
         (grep-command
           (concat
             grep-program
             " "
             "-inIEr --color=always -C2"
             " "
             search-term
             " "
             search-path)))
    (compilation-start grep-command 'grep-mode (lambda (mode) "*grep*") nil)))

যদিও উপরের গ্রেপ ফাংশনটির ফলে ফলাফল হিসাবে ফিরে আসা একাধিক ফাইল একসাথে কীভাবে সংশোধন করা যায় তা প্রশ্নে আসে না, তবে আমি এটি ব্যবহার করতে খুব সহায়ক multiple-cursorsএবং বলে মনে করি wgrep। এটি একের মধ্যে একাধিক ফাইলকে পরিবর্তন করে বাতাসের ঝাপটায় পড়ে। এই বৈশিষ্ট্যগুলি পছন্দসই হলে লাইব্রেরিগুলি ইনস্টল করা প্রয়োজন বলেছে।
আইনজীবি

বিল্টিনের ওপরে এটি ব্যবহারের সুবিধা কী rgrep?
npostavs

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