Làm cách nào để có được tên tệp của bộ đệm hiện tại trong emacs?


19

Một trong những tính năng chính tôi nhớ về Vim, là nó luôn lưu tên tệp của tệp hiện tại trong %bộ đệm ( thông tin thêm ). Điều đó cho phép khởi chạy các lệnh dễ dàng như:

;; compile current file
:! gcc %
;; source current file (useful when I'm editing .vimrc
:source %
;; get the size of current file
:! du -sh %
;; etc, etc...

Tôi muốn có chức năng tương tự theo emacs(phiên bản 24, nếu điều đó tạo ra sự khác biệt), cụ thể là có một cách dễ dàng để chèn tên của tệp được mở trong bộ đệm hiện tại.

Ví dụ về những gì tôi muốn làm

Ở đây tôi mô tả một số trường hợp sử dụng cơ bản như để giải thích rõ hơn khi tôi cảm thấy cần một phím tắt như vậy

  1. Biên dịch: Khi tôi nhập M-x compileemacs yêu cầu tôi cho một lệnh biên dịch. Tôi muốn vào gcc (current-buffer)dễ dàng.

  2. Tải tệp: Khi tôi đang chỉnh sửa tệp .emacs của mình, tôi muốn tải ngay để kiểm tra các thay đổi. Cách tôi làm là M-x load-filevà sau đó tôi luôn đánh vần tên . e m a c s. Tôi muốn có một phím tắt.

  3. Khởi chạy các tiến trình bên ngoài: Tôi đã đưa ra du -shlàm ví dụ, chỉ để minh họa rằng tôi muốn phím tắt cũng khả dụng khi tôi thực hiện các lệnh shell vớiM-!

Những gì tôi tìm thấy cho đến nay

  • Câu hỏi này ở đây trên U & L. Các câu trả lời được đưa ra về cơ bản chỉ ra nơi tìm tên tệp của bộ đệm để người ta có thể thêm nó vào vòng giết. Đó không phải là chính xác những gì tôi đang tìm kiếm, tôi không muốn phải giết tên tập tin theo cách thủ công trước khi tôi muốn sử dụng nó. (Ngoài ra các giải pháp được mô tả trong cả hai câu trả lời dường như không hoạt động trơn tru trong các emac của tôi và yêu cầu thêm các lần nhấn phím khiến chúng hơi đau một chút).

EDIT : Một chút không liên quan, bởi tôi đã tìm ra lý do tại sao các giải pháp này không hoạt động. Tôi đã bật IDO, tốt hơn hoặc xấu hơn.

  • Các (current-buffer)chức năng được mô tả trong cuốn hướng dẫn thực hiện trả lại tên của tập tin trong bộ đệm hiện tại, nhưng không nơi nào trong các ví dụ tôi đưa ở trên, tôi đang đánh giá đang elisp. Có cách nào để chèn kết quả đánh giá của hàm này vào bộ đệm (mini) và liên kết theo cách này với một phím tắt không?

Tôi có sai khi nghĩ theo cách này?

Tôi hiện đang học cách sử dụng emacs (thực tế đã được vài tháng) sau nhiều năm sử dụng Vim. Tôi muốn tránh bẫy sử dụng-emacs-in-a-Vim có thể dự đoán được . Nếu bạn cảm thấy rằng những gì tôi yêu cầu không phải là rất emacs-y , và nên có cách tốt hơn (sạch hơn?) Để làm điều đó, xin vui lòng đề cập đến nó trong câu trả lời của bạn.


Về tên tệp, trong .emacs, đặt (global-set-key (kbd "C-i") buffer-file-name)nếu bạn muốn nó là Ctrl + I. Về .emacs, M-x load-file RETlàm những gì bạn muốn; bạn không cần phải viết bất cứ điều gì.
Emanuel Berg

2
Quy trình công việc này không kết hợp với Emacs rất tốt, bởi vì tất cả các lời nhắc trên dòng dưới cùng của cửa sổ đều nằm trong bộ đệm trong Emacs (được gọi là bộ thu nhỏ). Vì vậy, nếu bạn chạy(buffer-file-name) trong khi bạn đang gõ trong xe buýt nhỏ, bạn sẽ nhận được nil, bởi vì đó (current-buffer)là xe buýt nhỏ. Bạn cũng có thể chuyển đổi bộ đệm khi ở trong bộ đệm, vì vậy thật khó để theo dõi bộ đệm nào là những gì bạn nghĩ về bộ đệm hiện tại vào thời điểm bộ đệm hiện tại, như Emacs nhìn thấy, là bộ đệm.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


11

Bạn có thể đặt một hàm như sau vào .emacs của mình và liên kết nó với bất kỳ khóa nào bạn thích.

(defun insert-file-name ()
  "Insert the full path file name into the current buffer."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

Cũng thấy câu hỏi này , nó có vẻ tương tự.


4

Một biến thể nhỏ trên câu trả lời của @ easyb là sao chép đường dẫn đến vòng khử của bạn thay vì đặt nó vào bộ đệm của bạn (hữu ích cho các tệp chỉ đọc):

(defun filename ()   
    "Copy the full path of the current buffer."  
    (interactive)  
    (kill-new (buffer-file-name (window-buffer (minibuffer-selected-window)))))
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.