Đệ quy mở tệp phù hợp với biểu thức chính quy trong thư mục được đánh dấu


9

Nói chung, tôi muốn có thể mở tất cả các tệp trong một tập hợp các thư mục nhất định (và thư mục con của chúng) trong đó tên tệp khớp với một biểu thức chính quy định.

Ví dụ

  /home/nispio/project:
  total used in directory 1612 available 1000000000
  drwxrwxr-x 13 nispio group    4096 Sep 19 14:06 .
  drwxrwxr-x  7 nispio group    4096 Sep 22 16:41 ..
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 cfg
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 hlp
* drwxrwxr-x  2 nispio group    4096 Sep 23 16:52 hst
* drwxrwxr-x  2 nispio group    4096 Sep 29 14:52 inc
* drwxrwxr-x  2 nispio group    4096 Oct  1 12:53 lib
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 mcr
  drwxrwxr-x  2 nispio group    4096 Sep 24 10:50 pyl
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 snr
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 unix

Tôi đã đánh dấu các thư mục hst, inclib, và bây giờ tôi muốn đến thăm tất cả các file có phần mở rộng .c, .cc.htrong vòng ba thư mục và thư mục con của họ.

Sẽ tốt hơn nữa nếu tôi có thể nhìn thấy mọi thứ mà tôi đang mở trước khi tôi mở nó. Nếu bộ đệm đã được cập nhật để hiển thị cho tôi tất cả các tệp phù hợp với tìm kiếm của tôi và tất cả các tệp đó được tô sáng, tôi có thể kiểm tra độ tỉnh táo để đảm bảo rằng tìm kiếm của tôi trả về những gì tôi mong đợi.

Tôi mở để gợi ý để làm điều này tương tự sử dụng helmhoặc dired+hoặc bất kỳ phần mở rộng khác mà sẽ cho tôi điều hướng hệ thống tập tin của tôi dễ dàng hơn.


Mathias hoặc Drew đã trả lời Questoin của bạn chưa? Hay bạn đang tìm kiếm một cái gì đó khác biệt?
Malabarba

Câu trả lời:


14

Thử đi:

C-u C-x d

Điều này cho phép bạn nhập đối số cho cách Dired nên liệt kê các tệp. Theo mặc định, nó nói -altại dấu nhắc. Thêm Rvào đó, kết thúc với -alR. Loại RET.

Chọn / nhập một thư mục và sau đó nhấn RET.

Điều này sẽ đệ quy mở tất cả các thư mục từ thư mục bạn chọn và bên dưới.

Từ đây, nhập % mđể đánh dấu tất cả các tệp khớp với một mẫu tên tệp nhất định. Tôi cũng thường xuyên gõ tvà sau đó kđể giết (ẩn) tất cả các tệp tôi không quan tâm. Nhập tlại để đánh dấu tất cả các tệp.

Theo như thực sự mở các tệp, tôi không nghĩ có một cách tiêu chuẩn để làm điều đó, nhưng bạn có thể dễ dàng xác định một lệnh mới để thực hiện (đặt nó trong .emacstệp của bạn ):

(defun dired-find-marked-files ()
 (interactive)
 (dolist (f (dired-get-marked-files)) 
  (find-file f)))

Hầu hết có lẽ ai đó đã bao gồm điều này trong một số gói cải tiến Dired đẹp, nhưng thật vui khi tự mình làm điều đó;)

Thưởng thức!


7

Bạn có thể làm điều này một cách dễ dàng với tệp helm-projectile-find-file . Vì Projectile theo dõi mọi tệp với đường dẫn tương đối của nó, bạn có thể dễ dàng thu hẹp vào bất cứ thứ gì. Hãy sử dụng ví dụ của bạn. Trong trường hợp của bạn, bạn muốn mở tập tin trong hst, inclib. Bạn có thể truy xuất tất cả các tệp thuộc thư mục này bằng hai cách:

  • Trong dấu nhắc Helm của helm-projectile-find-file, nhập từng thư mục và các tệp được đánh dấu được thu hẹp vào thư mục đó. Ví dụ: đầu tiên tôi nhập ^hst/(thu hẹp tất cả các tệp có hst/ở đầu mỗi ứng cử viên). Đánh dấu tất cả các tệp vớiM-a , làm một cái gì đó tương tự cho các tệp trong hai thư mục khác.

  • Hoặc, bạn có thể truy xuất tệp trong tất cả các thư mục bằng mẫu này : ^hst/\|^inc\|^lib. Helm chấp nhận regex sau tất cả. Các regex \|có nghĩa là or. Làm điều này nếu bạn muốn chọn mọi thứ trong một lần.

Với một trong hai thứ này, bạn sẽ đánh dấu tất cả các tệp bạn muốn mở. Sau đó chỉ cần nhấn RETđể mở tất cả.

Xin lưu ý rằng nếu bạn có nhiều tệp trong các thư mục đó, bạn cần tăng helm-candidate-number-limit. Mặt khác, một khi số lượng ứng cử viên đạt đến giới hạn, không có thêm ứng cử viên nào được hiển thị và bạn không thể chọn ứng viên vô hình. Đặt nó thành số cao hơn hoặc đặt thành nilnếu bạn không muốn giới hạn này.

Điều tốt với Helm là bạn có thể tương tác chọn các tệp.


Tôi nghĩ rằng anh ấy muốn mở tất cả chúng cùng một lúc, không chọn một trong số chúng.
Malabarba

1
@Malabarba Bạn có thể chọn nhiều tệp bằng M-acách sử dụng helm-projectile-find-filevà nhấn RET một lần để mở tất cả chúng bằng phương pháp tôi đã liệt kê.
Từ Đô

Tất nhiên! Xin lỗi, đã bỏ lỡ câu đó. Tôi chỉnh sửa để làm cho nó rõ ràng hơn một chút với những kẻ ngốc như tôi. Vui lòng quay lại nếu bạn không thích hoặc nếu tôi đã làm gì đó sai.
Malabarba

@Malabarba Cảm ơn. Bây giờ thì rõ hơn rồi.
Từ Đô

4

Đây là hai khả năng (lựa chọn thay thế):

  1. Trong Dired, bạn có thể bao gồm tất cả các thư mục con chứa tệp bạn muốn hành động, bằng cách sử dụng các lscông tắc bao gồm -Rhoặc bằng cách sử dụng iđể bao gồm các thư mục con cụ thể. Nếu bạn sử dụng thư viện Dired + thì bạn có thể sử dụng * .(bị ràng buộc diredp-mark/unmark-extension, để đánh dấu tất cả các tệp được liệt kê có phần mở rộng nhất định (chẳng hạn như .h). Sau đó, bạn có thể sử dụng F(bị ràng buộc dired-do-find-marked-files) để mở tất cả các tệp được đánh dấu.

  2. Với thư viện Dired +, bạn có thể hành động trên tất cả các tệp được đánh dấu và tất cả các tệp được đánh dấu trong các thư mục con được đánh dấu, được định nghĩa đệ quy, IOW, thư mục con của thư mục con, thư mục con của chúng, v.v.

    Đối với bất kỳ thư mục được đánh dấu nào, nếu không có tệp nào được đánh dấu trong thư mục đó (nghĩa là được đánh dấu trong danh sách được điều hướng cho thư mục con đó) thì hành động nằm trên tất cả các tệp của nó.

    Có một số lượng lớn các lệnh để hành động trên các tệp như vậy theo các cách khác nhau (mở, tìm kiếm, v.v.). Nhưng các tập tin để hành động chỉ được xác định theo cách đó; cũng không có khả năng, nói, nhập một mô hình toàn cầu hoặc một biểu thức chính quy để lọc tập hợp.

    Tuy nhiên, nếu bạn sử dụng thư viện Icicles cùng với Dired + thì bạn có thể sử dụng M-+ C-F, nghĩa là M-+ C-S-f(bị ràng buộc icicle-visit-marked-file-of-content-recursive), để mở bất kỳ hoặc tất cả các tệp vừa mô tả (nghĩa là những tệp được đánh dấu hoặc trong các thư mục con được đánh dấu, được định nghĩa đệ quy).

    Bạn có thể sử dụng regexps, nhanh chóng, để lọc tên tệp (và / hoặc nội dung tệp). Ví dụ, Bạn có thể, khi bạn yêu cầu, mở tất cả các file có phần mở rộng .c, .cc.htrong subdirs đánh dấu (với subdirs đánh dấu được xử lý theo cùng một cách, một cách đệ quy).


3

eshell xử lý **/*việc mở rộng toàn cầu theo kiểu zsh , vì vậy một cách tiếp cận là kích hoạt eshell trong thư mục chính xác và chạyfor f in **/*cc **/*h { find-file $f}

Ngoài ra, chức năng find-filehỗ trợ ký tự đại diện khi được gọi từ elisp. Đây là một đoạn hữu ích từ tài liệu cho rằng find-file:

(find-file FILENAME &optional WILDCARDS)
Interactively, or if WILDCARDS is non-nil in a call from Lisp, expand wildcards (if any) and visit multiple files.

Tôi không thể tìm ra cách để làm việc đó với tính năng toàn cầu theo kiểu zsh, nhưng nó có thể là một lựa chọn tốt.

Nếu tất cả các tệp này nằm trong một dự án được kiểm soát nguồn đơn, thì đạn có thể là một cách tiếp cận khác và tốt hơn.

Tái bút Nếu bạn đi với eshell, tôi khuyên bạn nên liên kết eshell-toggle-cdvới một khóa để bạn có thể dễ dàng bật lên một dấu nhắc eshell trong thư mục của bộ đệm bạn đang chỉnh sửa.


Tôi không nghĩ rằng nó find-filesẽ hoạt động đệ quy, đó là tính năng chính mà tôi theo đuổi. Mở một shell và gõ một lệnh có vẻ như quá nhiều công việc, bởi vì (tôi đoán) lệnh của tôi sẽ phải giống như for d in inc src hst { for f in $d/**/*cc $d/**/*c $d/**/*h { find-file $f } }Hoặc nó đơn giản hơn thế?
nispio
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.