Emacs: отключить завершение Ido в режиме Tramp

Я часто использую ido для автозаполнения и tramp для доступа к удаленному серверу через ssh. Мой .emacs включает следующие строки:

(require 'tramp)
(setq tramp-default-method "ssh")
(ido-mode 1)
(setq ido-enable-flex-matching t)
(setq ido-everywhere t)

Я хочу отключить завершение Ido, когда просматриваю содержимое удаленного сервера. Обратите внимание, что переменная ido-enable-tramp-completion не имеет ничего общего с моей проблемой. Рассмотрим строку /[email protected]#1234:/var/www/file.txt. Мне нужен Ido не, чтобы вычесть часть после двоеточия (путь удаленного файла), меня не волнует часть до двоеточия. Я использую ssh, и Ido заставляет Emacs задерживаться на несколько секунд каждый раз, когда я запускаю ido-find-file, а когда время ожидания ssh истекло, Tramp пытается повторно подключиться, запрашивает у меня пароль и так далее. Такое поведение нежелательно.

Версия Emacs - 24.0.94.1

Изменить (20.03.12): после контакта с автором Идо я попытался изменить ido-file-name-all-completions-1 на следующее:

(defun ido-file-name-all-completions-1 (dir)
  (cond
   ((ido-nonreadable-directory-p dir) '())
   ;; do not check (ido-directory-too-big-p dir) here.
   ;; Caller must have done that if necessary.

   ((and ido-enable-tramp-completion
     (or (fboundp 'tramp-completion-mode-p)
         (require 'tramp nil t))
     (string-match "\\`/[^/]+[:@]\\'" dir))
    ;; TRAMP RELATED CODE DELETED
    nil)
   (t
    (file-name-all-completions "" dir))))

Безуспешно. Затем я изменил регулярное выражение на

"\\`/[^/]+[:@]"

и это сработало - Идо был отключен, когда минибуфер содержал это совпадение. Однако, поскольку Ido не мог видеть файлы на удаленном сервере, он начал вызывать ido-make-merged-file-list для поиска файлов в других каталогах каждый раз, когда я что-то ввожу. Это сделало работу с Ido на удаленных серверах еще более сложной.

Я также пробовал настроить переменные ido-slow-ftp-hosts и ido-slow-ftp-host-regexps на /[email protected]#1234, не помогло.


person Mirzhan Irkegulov    schedule 12.03.2012    source источник
comment
Этот вопрос кажется связанным с этим другим вопросом .   -  person user1735594    schedule 03.07.2018


Ответы (1)


Если вы снова введете C-x C-f, вы временно отключите ido-find и вернетесь к файлу поиска по умолчанию.

Для получения дополнительной информации C-h f ido-find-file RET

Чтобы делать это каждый раз, когда ido находит двоеточие, я думаю, вам нужно написать для этого свою собственную функцию.

person mathk    schedule 13.03.2012
comment
Если я сделаю ido-find-file дважды, эта ошибка будет выброшена в буфер *Backtrace* - Debugger entered--Lisp error: (error "Command attempted to use minibuffer while in minibuffer")Debugger entered--Lisp error: (error "Command attempted to use minibuffer while in minibuffer"). А где мне написать эту функцию? - person Mirzhan Irkegulov; 13.03.2012
comment
Вы не можете запустить ido-find-file дважды. Команда C-x C-f не запустит ido-find-file, она просто вернется к find-file. Не вводите M-x ido-find-file RET снова. Введите C-x C-f. - person mathk; 13.03.2012
comment
Я понимаю. Где мне написать функцию, чтобы ido видела двоеточие? - person Mirzhan Irkegulov; 13.03.2012
comment
Я не думаю, что в этом случае есть зацепка. Я предлагаю вам переписать свой собственный метод find-file и скопировать большую часть поведения ido-find-file, кроме случаев, когда вы видите двоеточие. - person mathk; 16.03.2012
comment
два года спустя, и я считаю этот пост полезным! - person Husain; 13.09.2014