2009-06-03 44 views
58

Tôi muốn các emacs đánh dấu các tệp được tạo dưới dạng chỉ đọc khi chúng được mở. Một phần của câu đố mà tôi đang thiếu là làm thế nào để kiểm tra xem một tập tin "tồn tại". Tôi hiện có:Làm cách nào để kiểm tra xem tệp có tồn tại bằng Emacs Lisp không?

;; 
;; get file extension 
;; 
(defun get-ext (file-name) 
    (car (cdr (split-string file-name "\\.")))) 

;; 
;; get the base name of the file 
;; 
(defun base-name (file-name) 
    (car (split-string file-name "\\."))) 

;; 
;; if an 'lzz' file exists for this header, mark it as read only 
;; 
(defun mark-read-only() 
    (if (string= (get-ext (cur-file)) "h") 
     (if (??file-exists??? (concat (base-name (cur-file)) ".lzz")) 
      (toggle-read-only)))) 

Tôi có thể sử dụng gì cho "??? tồn tại tệp ???"?

Khi tôi tìm thấy điều này, tôi sẽ thêm "chỉ đọc" vào móc thích hợp (mà tôi nghĩ là móc tìm-tệp).

BỐI CẢNH

Chúng tôi sử dụng lzz như một bộ tạo mã để đơn giản hóa C của chúng tôi C quá trình phát triển/++. Tóm lại, lzz lấy một tệp đầu vào đơn (trông rất giống C/C++) và tạo các tệp đầu trang và nguồn khi thích hợp. Theo mặc định, lzz bao gồm các chỉ thị #line để trình gỡ lỗi trỏ đến nguồn gốc chứ không phải nguồn được tạo, tuy nhiên, để giảm phụ thuộc biên dịch, chúng tôi thường vô hiệu hóa các chỉ thị này trong các tệp tiêu đề. Kết quả là khi gỡ lỗi các mẫu hoặc các hàm nội tuyến, trình gỡ lỗi thường trỏ đến tệp tiêu đề được tạo và không phải là tệp nguồn gốc.

Đây không phải là vấn đề lớn, tuy nhiên, gần đây tôi thấy rằng khi gỡ lỗi, tôi sẽ sửa đổi nhanh tệp được hiển thị và sau đó tôi sẽ xây dựng lại. Tất nhiên điều này thường có nghĩa là thay đổi tôi đã biến mất vì tệp tôi đã chỉnh sửa được tạo và do đó các thay đổi được "thổi bay" trong khi xây dựng lại thư viện.

SOLUTION

Nhờ mọi người giúp đỡ và ý kiến ​​của họ. Một lời cảm ơn đặc biệt đến cobbal để chỉ ra chức năng chính xác để sử dụng.

Dưới đây là mã kết quả (với bản cập nhật dựa trên các ý kiến ​​khác ở đây quá):

(defun cur-file() 
    "Return the filename (without directory) of the current buffer" 
    (file-name-nondirectory (buffer-file-name (current-buffer))) 
) 

(defun mark-generated-as-read-only() 
    "Mark generated source files as read only. 
Mark generated files (lzz or gz) read only to avoid accidental updates." 
    (if 
     (or (string= (file-name-extension (cur-file)) "h") 
      (string= (file-name-extension (cur-file)) "cpp")) 
     (cond 
     (
     (file-exists-p (concat (file-name-sans-extension (cur-file)) ".lzz")) 
     (toggle-read-only)) 
     (
     (file-exists-p (concat (file-name-sans-extension (cur-file)) ".gz")) 
     (toggle-read-only)) 
     ) 
    ) 
) 
+3

Thay vì đặt nhận xét phía trên các chức năng của bạn, trong Elisp, bạn có thể viết chúng trong dòng đầu tiên của khai báo hàm. Nó được gọi là "docstring". Xem http: //www.gnu.org/software/emacs/elisp/html_node/Tài liệu-Khái niệm cơ bản.html –

+9

Lưu ý: hai hàm đầu tiên của bạn đi kèm với Emac, chúng được đặt tên là 'tên tệp-phần mở rộng và' tên tệp-sans-extension –

Trả lời

79

thử file-exists-p

"Return t nếu tập tin filename tồn tại (hay không, bạn có thể đọc nó.) "

+2

Tại sao điều này không chức năng xuất hiện khi tôi làm một "CH a" appros tìm kiếm cho nó? Tôi đã thử tìm kiếm tệp và thực hiện các kết quả cho 'tồn tại' và không có kết quả nào phù hợp! –

+0

vâng, tôi đã cố gắng tìm 'tồn tại' theo cách đó, sau đó tìm thấy hàm 'find-file-existing' trong files.el, mở nó ra và tìm thấy tệp tồn tại-p. không biết tại sao nó không hiển thị dưới C-H a – cobbal

+12

tập tin tồn tại-p không hiển thị trong "C-H a" bởi vì nó không phải là một chức năng "tương tác". Nó sẽ hiển thị dưới "M-x apropos" mặc dù. – Edric

14
  • Tùy thuộc vào những gì bạn cần, bạn có thể muốn file-readable-p thay vì file-exists-p.

  • Apropos sẽ chỉ giúp bạn nhận được từ trước đến nay. Icicles cung cấp apropos completionprogressive completion cho phép bạn tìm trợ giúp dễ dàng cho các lệnh, hàm, biến, v.v ... tên phù hợp với các phân mục theo thứ tự tùy ý (là file-exists-p hoặc exists-file-p?).

7

Sử dụng f.el, thư viện hiện đại để xử lý tệp và thư mục. Bạn có thể sử dụng f-exists?, f-file?, và nhiều vị từ khác. Thư viện này tốt hơn các hàm chuẩn, vì nó là mọi hàm liên quan đến tệp mà bạn sẽ cần dưới một không gian tên.

Các vấn đề liên quan