Phím tắt thư mục trong bộ đệm emacs


8

Vì vậy, tôi đã hỏi câu hỏi này về các phím tắt thư mục trong một vỏ. Ý tưởng là tôi muốn có thể mở một tập tin /home/Documents/foobằng cách gõ C-x C-f ~foo/file.

Vì vậy, có cách nào để mô phỏng "thư mục được đặt tên" của zsh trong bộ đệm emacs không?

Ngẫu nhiên, các định nghĩa phím tắt tôi muốn sử dụng đã có trong .zshrc của tôi, nếu có một giải pháp đọc chúng trực tiếp, sẽ nhận được điểm thưởng.


Có lẽ đây không phải là một câu hỏi SE unix và tôi nên thử vận ​​may của mình trên SU?
Seamus

câu hỏi này không cụ thể (thậm chí đến phần zsh: có cổng zsh cho Windows, hoặc ít nhất là cho Cygwin), vì vậy nó nên có trên SU. Nhưng, tốt, nó ở đây bây giờ, vì vậy tôi đã trả lời nó ở đây.
Gilles 'SO- ngừng trở thành ác quỷ'

Câu trả lời:


8

Thành phần Emacs chịu trách nhiệm mở rộng ~tên tệp là expand-file-name. Thật không may, nó được viết bằng C và sâu bên trong ruột của nó là mã giả định rằng cái đến sau ~là tên người dùng. May mắn thay, Emacs có một cách chung để thêm một trình bao bọc xung quanh các hàm, vì vậy bạn có thể làm những gì bạn muốn nếu bạn không lặp lại một số logic trong hàm dựng sẵn.

Đây là một số mã hoàn toàn chưa được kiểm tra sẽ giúp bạn đi. Tra cứu Chức năng Tư vấn Emacs Lisp Chức năng Hướng dẫn sử dụng Emacs Lisp để biết thêm thông tin; ý tưởng cơ bản là defadvicethêm một số mã để chạy trước mã thực tế của expand-file-name. Vui lòng báo hiệu những lỗi tôi chắc chắn đã đưa ra trong các nhận xét (cho dù bạn có biết cách khắc phục hay không).

(defvar expand-file-name-custom-tilde-alist
  '(("foo" . "/home/Documents/foo")))

(defadvice expand-file-name (before expand-file-name-custom-tilde
                             (name &optional default-directory)
                             activate compile)
  "User-defined expansions for ~NAME in file names."
  (save-match-data
    (when (string-match "\\`\\(\\(.*/\\)?~\\([^:/]+\\)\\)/" name)
      (let ((replacement (assoc (match-string 3 name) expand-file-name-custom-tilde-alist)))
        (when replacement
          (setq name (replace-match (cdr replacement) t t name 1)))))))

Tôi sẽ để phân tích cú pháp các phím tắt .zshrcđể điền expand-file-name-custom-tilde-alist(hoặc bất kỳ kỹ thuật nào bạn chọn để giữ bí danh đồng bộ) như một bài tập.


Giải pháp tập thể dục của tôi:(defun my/add-to-tilde-alist (hash) (let* ((tilde:dir (split-string hash "=")) (tilde (car tilde:dir)) (dir (cadr tilde:dir))) (push (cons tilde dir) expand-file-name-custom-tilde-alist))) (mapc #'my/add-to-tilde-alist (split-string (with-output-to-string (call-process "zsh" nil standard-output nil "-ic" "hash -d")) "\n" t))
Michaël

4

Đơn giản chỉ cần sử dụng $foothay vì ~footrong xe buýt nhỏ. Emacs sẽ coi foolà tên của một biến môi trường và sử dụng giá trị của nó.


Thật là một tính năng ẩn sát thủ! (nhận xét: xuất biến cho chúng khả dụng)
AdrieanKhisbe
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.