Недавно открытые файлы в режиме ido


12

Я использую ido-mode, но одну вещь, которую я ненавижу, это то, что после того, как C-x C-fя не могу использовать up/downключи для циклического перебора недавно открытых файлов, как это было, например, с iswitchb. Как я могу начать idoработать таким образом?

Ответы:


16

Глядя на параметры настройки ido-mode( M-x customize-group RET ido RET), я не вижу никаких вариантов включения описанного вами поведения циклирования.

Однако вы можете добавить следующее в ваш init-файл:

(require 'recentf)

(defun ido-recentf-open ()
  "Use `ido-completing-read' to find a recent file."
  (interactive)
  (if (find-file (ido-completing-read "Find recent file: " recentf-list))
      (message "Opening file...")
    (message "Aborting")))

(global-set-key (kbd "C-x C-r") 'ido-recentf-open)

С этим на месте вы можете нажать, C-x C-rчтобы получить Ido завершение для выбора недавно открытых файлов.

По умолчанию 20 самых последних файлов будут сохранены в истории. Я предлагаю вам увеличить это до 150, установив recentf-max-saved-items:

(setq recentf-max-saved-items 150)

Бонус: доступ к последним файлам, выпуск стероидов

Я не вижу в нем упоминается во многих местах, но идо Virtual Буферы сделать это очень легко для доступа последних файлов. Включите их так:

(setq ido-use-virtual-buffers t)

Поведение, которое вы получаете, таково:

Если не nil, обратитесь к прошлым («виртуальным») буферам, а также к существующим.

По сути, это работает следующим образом: скажем, вы посещаете файл, и буфер очищается midnight.el. Позже вы захотите переключиться на этот буфер, но обнаружите, что он больше не открыт. При включенных виртуальных буферах имя буфера остается в списке буферов (с использованием ido-virtualграни и всегда в конце), и если вы выберете его, он снова откроет файл обратно. Это позволяет вам меньше думать о том, открыты ли недавно открытые файлы или нет. Большую часть времени вы можете выйти из Emacs, перезапустить, а затем переключиться на буфер файлов, который был ранее открыт, как если бы он все еще был.


Пока я проголосовал, я приму позже, когда я проверю это и пойму, как это работает. (мое понимание языка очень плохое).
WeSenseASoulInSearchOfAnswers

@WeSenseASoulInSearchOfAnswers Конечно, не торопитесь. Дайте мне знать, если у вас есть конкретные вопросы по поводу кода, который я разместил.
itjeyd

Я согласился, но, честно говоря, мне это не нравится, потому что с C-x C-rним невозможно открыть новый файл. Я также удивлен, что невозможно настроить его простым способом. История C-x C-fнастолько очевидна, что я не могу понять, почему она еще не реализована ido. Например, M-x up/downциклически повторяет последние команды, M-% up/downциклически повторяет последние запросы на замену, даже вне emacs - все оболочки, такие как bash или zsh, используют вверх / вниз для вызова предыдущих команд. Для меня C-x C-f up/downследует циклически просматривать недавно открытые файлы. Полная остановка.
WeSenseASoulInSearchOfAnswers

@WeSenseASoulInSearchOfAnswers Я согласен с вами, и я понятия не имею, почему это не доступно или настраивается из коробки. Лично для меня это не имеет большого значения, потому что я использую функцию виртуальных буферов, которую я описал в своем ответе, поэтому переключение на последний файл аналогично переключению на другой буфер; действительно легко. Но я понимаю, что может быть неприятно, если функция, к которой вы привыкли, недоступна.
itsjeyd

5
+1 за ido-use-virtual-buffers- отличная функция, которая действительно должна быть включена по умолчанию IMO.
Джон О.

2

Хотя привязки развивались с течением времени, на сегодняшний день, когда вы вызываете ido-find-fileили ido-find-file-read-only, вы можете использовать следующие привязки, доступные в конфигурации по умолчанию:

  • M-o Запускает ido-prev-work-file
  • C-M-o Запускает ido-next-work-file

Помимо того, что они не такие эргономически приятные, как M-pи M-nпривязки, к которым я привык, прежде чем пытаться использовать ido , они также медленные, и последующая болтовня минибуфера отвлекает и сбивает с толку. ido делает нечто большее, чем просто показывает недавно открытое имя файла; он сообщает, что «ищет« имя файла »...», возможно, из-за нежелания предложить имя для файла, который больше не существует.

Сообщение «Поиск» приходит из функции ido-make-merged-file-list. Читая источник , я не вижу способа отключить магию, которую выполняет эта функция.

Вы можете рассмотреть повторно связав ido-prev-work-fileи ido-next-work-fileпару к чему - то более естественным , как C-M-pи C-M-n, или обменивать тока M-p( ido-prev-work-directory) и M-n( ido-next-work-directory) привязок для них.

Вот код Emacs Lisp для восстановления M-pи M-nциклического просмотра последних файлов, перемещая привязки по умолчанию к каталогам C-M-pи C-M-nсоответственно:

(add-hook 'ido-setup-hook
          (lambda ()
            (let ((kmap ido-file-dir-completion-map))
              (let ((key '(meta ?n)))
                (define-key kmap (vector (cons 'control key))
                  (lookup-key kmap (vector key)))
                (define-key kmap (vector key) 'ido-next-work-file))
              (let ((key '(meta ?p)))
                (define-key kmap (vector (cons 'control key))
                  (lookup-key kmap (vector key)))
                (define-key kmap (vector key) 'ido-prev-work-file)))))

1
Добро пожаловать в Emacs SE! Пожалуйста, постарайтесь, чтобы ваши ответы были сосредоточены на оригинальном вопросе автора. Конечно, ваш комментарий о «болтовне минибуфера» интересен и связан, но он отвлекает от поиска реального ответа на вопрос. Что еще более важно: пожалуйста, попробуйте сформулировать свой ответ в виде ... ну, ответ. То, что вы написали, больше похоже на комментарий, который не очень подходит для сайта вопросов и ответов, подобного этому.
паприка

Итак, первый абзац и его следующий список отвечают на первоначальный вопрос, в котором искались ключи для циклического просмотра недавно открытых файлов. Эти привязки существуют по умолчанию, но ни один из других ответов здесь не упоминал эти привязки. Я работаю над кодом повторной привязки и включу его в свой ответ, как только буду удовлетворен.
SEH

2

в этом случае я прибегаю к нормальному поведению минибуфера, набирая Cf в idomode. Тогда у вас будут нормальные истории просмотра ключей. Если вы знаете это заранее, это может быть быстро: Cxff :-)


1

Ответ, данный @itsjeyd, довольно полный. Позвольте мне просто предложить функцию:

(defun ido-choose-from-recentf ()
  "Use ido to select a recently visited file from the `recentf-list'"
  (interactive)
  (find-file (ido-completing-read "Open file: " recentf-list nil t)))

;; bind it to "C-c f"
(global-set-key (kbd "C-c f") 'ido-choose-from-recentf)

Предоставлено WikEmacs


1

Я обнаружил, что helm-for-filesработает лучше, чем любой из приведенных выше ответов с целью автозаполнения имени файла и имеет хороший интерфейс поиска. Кроме того, вы можете настроить его для включения любых элементов поиска, которые вам нравятся.


1
@Drew helm поставляется с самим режимом ido. Большую часть времени, когда люди ищут этот пост, им может быть интересно узнать другие альтернативы для решения проблемы.
user10375
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.