Làm thế nào để nói với Ido tránh đường khi tôi chỉ có thể dán tên tệp?


14

Tôi đang cố gắng làm cho mình sử dụng chế độ Ido. Đôi khi nó tốt, nhưng lần khác thì cực kỳ ngu ngốc. Đây là nỗi thất vọng lớn nhất của tôi.

Tôi đọc một số nhật ký với tên tệp đầy đủ, sau đó tôi sao chép một tên, thử mở tệp đó.

Cách để làm điều này mà không cần Ido: C-aC-yC-kRET

Với Ido có hai vấn đề chính:

  1. Nếu tôi có toàn bộ tên tệp, không có cách nào để nhập vào đó (tôi phải xóa dấu gạch chéo đầu tiên, thậm chí nhấn //không giúp được gì.

  2. Tôi không thể chỉnh sửa các phần trung gian của tên tệp khiến phần còn lại không được sửa đổi.

Hay tôi có thể?


2
Bạn có thể thả trở lại kho find-filevới C-x C-fvà dán bình thường. Nhưng sau đó, đó là nhiều tổ hợp phím hơn. Hoặc bạn có thể sử dụng Helm nếu bạn muốn một tính năng phong phú find-filevà vẫn đáp ứng trường hợp sử dụng đó của bạn.
Từ Đỗ

1
Ah, cảm ơn, nah, tôi không làm được điều này nên thường xuyên đến nỗi tôi muốn phàn nàn về hai tổ hợp phím phụ. Điều này thực sự sẽ trả lời nhu cầu của tôi bây giờ. Cảm ơn!
wvxvw

@Tu Do Bạn nên đặt nó xuống như một câu trả lời dưới đây. Tôi đã tìm thấy C-x C-fdự phòng hữu ích rất nhiều lần!
Kaushal Modi

Câu trả lời:


17

Trong khi một idolệnh đang hoạt động ( ido-find-filetrong trường hợp này), bạn có thể quay lại phiên bản không phải là ido của cùng một lệnh ( find-filetrong trường hợp này) bằng cách sử dụng liên kết mặc định ido C-x C-fcho ido-fallback-command.

Để trả lời câu hỏi của bạn,

  • Người đầu tiên C-x C-fsẽ gọi ido-find-file.
  • Thứ hai C-x C-fsẽ rơi trở lại find-file.
  • Sau đó, bạn có thể làm C-a C-y C-k RETnhư bạn thường làm để kéo một đường dẫn tệp được sao chép vào bộ thu nhỏ.

Lưu ý: Trong ido, C-x C-f C-x C-fsẽ làm điều tương tự như C-x C-f C-f, tức là rơi trở lại find-file.

Về C-ftrongido Trong ido-mode, C-flà ràng buộc để ido-magic-forward-char. Từ ido.el,

(defun ido-Magic-Forward-char (arg)
  "Tiến về phía trước trong đầu vào của người dùng hoặc thực hiện hành động ma thuật.
Nếu không có đầu vào của người dùng hoặc ở cuối đầu vào, hãy thực hiện các hành động ma thuật:
Cx Cb ... Cf chuyển sang `ido-find-file '.
Cx Cf ... Cf dự phòng thành 'find-file' không Ido.
Cx Cd ... Dự phòng của Cf không phải là Ido ngắn gọn 'dired'.
Cx d ... Cf dự phòng thành 'Ided' không phải Ido. "

2
Đối với tôi nó chỉ là C-fđể trở lại find-file, không C-x C-f. Tôi không thấy rằng tôi đã tùy chỉnh nó (và tôi, giống như những người khác ở đây dựa vào dự phòng rất nhiều. idoGần như là rắc rối không kém, sau khi sử dụng nó một thời gian).
harpo

1
@harpo Mình mới cập nhật câu trả lời ở trên giải thích tại sao C-x C-f C-fcũng hoạt động.
Kaushal Modi

Cảm ơn @kaushalmodi cho hầu hết các công việc. Câu trả lời của tôi ban đầu đơn giản như bình luận. Nó nên là câu trả lời của anh ấy :) Chỉ là một lưu ý cho sự tín nhiệm.
Từ Đỗ

Điều này đã tiết kiệm sự tỉnh táo của tôi, vì ido không chơi độc đáo với người lang thang khi sử dụng các đường dẫn tuyệt đối. Cảm ơn bạn.
Jérémie

6

Nếu bạn đang xử lý tên đường dẫn đầy đủ, các phương thức khác có thể hoạt động:

  • use M-x ffap( find-file-at-point): nó sẽ tự động đọc tên đường dẫn và mở tệp
  • kích hoạt M-x compilation-shell-minor-modesẽ thay đổi phông chữ của các đường dẫn và làm cho chúng "có thể nhấp" (bằng miệng hoặc RET). Nhấp vào nó sẽ đưa bạn đến tập tin đó và dòng cụ thể, và bạn có thể sử dụng next-errorprevious-errorđiều hướng. Tôi thường sử dụng nó, như trong chế độ shell .

5

Vì luôn có nhiều hơn một cách để thực hiện, đây là một biến thể trong ý tưởng của @ abo-abo giúp duy trì hoạt động hoàn thành ido thay vì quay trở lại lệnh tìm kiếm thông thường.

(defun ido-yank ()
  (interactive)
  (let ((path (current-kill 0)))
    (if (file-exists-p path)
        (progn
          (let ((dir (file-name-directory path)))
            (if dir (ido-set-current-directory dir)))
          (setq ido-exit 'refresh)
          (setq ido-text-init (if (file-directory-p path) nil (file-name-nondirectory path)))
          (setq ido-rotate-temp t)
          (exit-minibuffer))
      (yank))))

(define-key ido-file-dir-completion-map (kbd "C-y") 'ido-yank)

Với ràng buộc này:

  • Nếu lệnh giết hiện tại là một đường dẫn thư mục hợp lệ, bạn có thể bắt đầu ido-find-file, nhấn C-yđể chuyển đến thư mục được đánh dấu, sau đó tiếp tục sử dụng hoàn thành ido để chọn tệp.

  • Nếu lệnh giết hiện tại là một đường dẫn tệp hợp lệ, bạn có thể bắt đầu ido-find-file, nhấn C-yđể chuyển đến thư mục được đánh dấu và cung cấp tên tệp được đánh dấu là hoàn thành và nhấn RET để mở tệp đó.

  • Nếu giết hiện tại là bất cứ điều gì khác, nó được kéo mạnh bình thường.


Có thể không tốt hơn để tìm letkiếm các ido-...biến khác nhau hơn là setqchúng? Ngay bây giờ, có vẻ như bạn đang đặt giá trị vĩnh viễn thay vì làm như vậy cho vòng đời của hàm.
Dan

@Dan Tôi đang theo mô hình của các lệnh ido như thế nào ido-next-work-directory. Tôi nghĩ rằng các biến được thiết lập để chúng tồn tại qua cuộc gọi thoát khỏi xe buýt và làm mới sau đó. Nhưng tôi vẫn không hoàn toàn mò mẫm nội bộ ido!
glucas

Vâng, tôi đã tự hỏi nếu sau đó họ được làm mới. Chỉ muốn đặt trong một head-up.
Dân

4

Có lẽ như thế này:

(define-key ido-file-dir-completion-map (kbd "C-y") 'ido-yank)
(defun ido-yank ()
  (interactive)
  (if (file-exists-p (current-kill 0))
      (ido-fallback-command)
    (yank)))

Nếu kill hiện tại là một tập tin tồn tại, thì việc thực hiện C-y C-y có thể sẽ cung cấp cho bạn những gì bạn muốn.

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.