Đặt tên tệp hiện tại trong bộ thu nhỏ


12

Làm thế nào tôi có thể chèn tên tệp của bộ đệm tệp hoạt động vào một lệnh?

Khi tôi gọi một lệnh cần một tên tệp, tôi thường làm như vậy từ bộ đệm tệp và muốn tên của tệp đó trong khi gõ lệnh vào bộ thu nhỏ.

Tôi đang tìm kiếm một giả thuyết C-xrằng tôi có thể gõ trong khi hình thành một dòng lệnh trong xe buýt nhỏ.

Vì vậy, nếu, trong khi bộ đệm hiện tại là một tệp có tên Lorem Ipsum.txt, tôi gõ này:

M-x grep RET 'foo' SPC C-x … RET

các M-xgrepRETtrình bày một xe buýt nhỏ nhắc nhở cho greplệnh. Để đáp lại, tôi đã gõ đối số mẫu regex ( 'foo') và chèn đối số tên tệp ( C-x). Xe buýt nhỏ đó sẽ kết thúc như sau:

grep -nH -e 'foo' 'Lorem Ipsum.txt'

Lệnh hiện có nào nhận được tên tệp bộ đệm hiện tại như thế này? Ràng buộc khóa mặc định của nó là gì?


3
Tôi ngạc nhiên không ai nhắc đến M-n. Nó không hoạt động ở mọi nơi, nhưng hoạt động ở nhiều nơi. Ngoài ra, vì bạn đang grepping, tôi có thể thích lgrep và rgrep, tương tác nhiều hơn một chút, tôi nghĩ vậy.
Malabarba

Câu trả lời:


18

Lệnh hiện có nào nhận được tên tệp bộ đệm hiện tại như thế này?

Thật không may, không có lệnh sẵn sàng cho việc này, nhưng chúng ta có thể thực hiện một lệnh như sau:

(defun name-of-the-file ()
  "Gets the name of the file the current buffer is based on."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

Phép thuật nằm trong chức năng cửa sổ được chọn nhỏ ; nó thực hiện đúng bằng cách chọn bộ đệm cuối cùng trước khi bộ thu nhỏ được kích hoạt. Nếu không, chỉ sử dụng tên tệp đệm sẽ không đưa chúng ta tên tệp vào bộ thu nhỏ. Thật thú vị, chức năng tương tự có thể được sử dụng trong một bộ đệm thông thường hoặc bộ thu nhỏ để chèn tên tệp. Không cần điều trị đặc biệt.

Ràng buộc khóa mặc định của nó là gì?

Không có gì, nhưng bạn có thể chọn một tiện ích và gán nó như sau:

(global-set-key (kbd "C-c f") 'name-of-the-file)

Đặt các dòng mã lisp ở trên trong tệp init.el của bạn.

Điều này hoạt động trong hầu hết các trường hợp tầm thường, nhưng khó có thể dự đoán những gì nó có thể xảy ra với bất kỳ chế độ nào bạn đã kích hoạt khi gọi chức năng này.

Điều gì xảy ra nếu bộ đệm không truy cập tên tệp hợp lệ, chẳng hạn như bộ đệm đầu? Sau đó, lỗi này được hiển thị trong khu vực tiếng vang:

name-of-the-file: Wrong type argument: char-or-string-p, nil

Chọn một bộ đệm hợp lệ với một tên tệp thích hợp trước khi gọi phím tắt sẽ tránh các lỗi đó.

Có một số giải pháp khác như ở trên, nhưng chúng chủ yếu khác nhau về cách chúng xử lý các trường hợp ngoại lệ hoặc ghi đè cho bất kỳ xung đột nào. Ví dụ, một số móc chế độ sử dụng để làm cho chức năng này chỉ khả dụng trong một số chế độ nhất định.


Để làm việc này tôi nghĩ người ta phải làm enable-recursive-minibuffers.
Dieter.Wilmus

Nếu lệnh chỉ được sử dụng trong bộ thu nhỏ, liên kết sau có thể được sử dụng thay cho (define-key minibuffer-local-map (kbd "C-c f") 'name-of-the-file)'. In addition to this useful function I also created the function tên của bộ đệm` mà tôi ràng buộc để C-c bchèn tên bộ đệm hiện tại.
Dov Grobgeld

2

Khi sử dụng dired-xphím tắt C-x C-jđược ràng buộc với dired-jump. Vì vậy, từ bộ đệm tập tin của bạn, bạn kết thúc ở dòng dired bên phải và có thể sao chép tên tập tin của nó với w. Và sau đó bạn có thể dán nó vào bộ đệm mini.

Một khả năng khác để giảm bớt việc gõ tên tệp là hoàn thành tệp bộ đệm mini Emacs tiêu chuẩn. Chỉ cần gõ các ký tự đầu tiên của tên tệp của bạn và sau đó TAB.


1
Bạn có thể sao chép tên của tệp trên dòng Dired hiện tại chỉ bằng cách sử dụng w(lệnh dired-copy-filename-as-kill).
Drew

-1

Câu hỏi yêu cầu một lệnh Emacs hiện có để làm điều này.

Bắt đầu sớm hơn:

Thật không may, không có lệnh sẵn sàng cho việc này

hóa ra là câu trả lời cho câu hỏi này


Có nhiều cách để giảm bớt trường hợp sử dụng của bạn và những cách khác đề xuất các giải pháp mã hóa bespoke, vì vậy tôi nghĩ rằng tuyên bố của bạn không đúng. Bạn đã không yêu cầu cụ thể đối với một out-of-the-box cách Emacs'!
Dieter.Wilmus

Tôi đã hỏi cụ thể cho một lệnh hiện có cho mục đích, vì vậy, câu trả lời này là chính xác.
bignose
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.