Emacs: какова хорошая тактика для навигации по каталогам и открытия файлов?

На прошлой неделе я был взбешен (снова) необходимостью справляться с разными средами разработки для R и Perl, которые мне не нравятся или которые я не использую достаточно, чтобы чувствовать себя комфортно, я решил попробовать Emacs. Это решение не было принято без определенного трепета с моей стороны. Мое основное использование для Perl с cperl и для R с ESS. Моя среда - Windows 7 Ultimate, 64-битная, и я работаю с версией 23.4.1, которая, как мне кажется, установлена ​​пакетом ESS от моего имени.

Прошла почти неделя, и до сих пор она была на удивление безболезненной, не более сложной, чем любая другая важная часть программного обеспечения. Я переназначил свой ключ ctrl на caps-lock, изменил папки по умолчанию, покопался в.emacs и сделал некоторые дополнения, такие как автоустановка, yasnippet, color-theme, icicles и некоторые другие. Очевидно, что есть очень сложные вещи. В дополнение, конечно, некоторые функции базового Emacs сразу становятся очень мощными и полезными, такие как поиск вверх и вниз. В целом я был приятно удивлен и успокоен.

Одна вещь, которая является более грубой, чем я ожидал, - это процесс поиска и открытия файлов. После беглого прочтения различных уроков у меня было изображение квази-магического местоположения файла и автозаполнения имени файла. Основные каталоги в моей настройке имеют пути, такие как g:/roaming/code/perl или g:/roaming/code/R/, но мне часто приходится переходить на совершенно разные пути, такие как g:/pricedata/support files/sector/project01/ и так далее.

В настоящее время я старательно удаляю путь к файлу, когда мне нужно взять другой форк, а затем использую автозаполнение, чтобы углубиться в эту ветку файловой системы. Это как бы возвращает меня к запуску оболочки Amash на Амиге двадцать лет назад.

Чего я ожидал? Что-то вроде (используя приведенный выше пример) ввода 'project01', чтобы сразу перейти в папку внизу пути. По какой-то причине у меня возникла мысль, что Emacs будет предварительно загружать каталоги. Так что, возможно, это было нереально.

Я предполагаю, что мои трудности, вероятно, проистекают из-за моей неосведомленности, а не из-за структурного недостатка в Emacs, и ведут к моим вопросам. Я не могу пожаловаться на то, что не хватает документации; скорее, есть много информации о том, что она разбросана довольно случайно. Сосульки имеют аналогичную проблему - если слишком много.

1) Какова наилучшая тактика для перемещения по разным ветвям дерева файлов при попытке открыть файлы в минибуфере или с помощью какого-либо другого метода? Существуют ли псевдонимы, которые можно использовать для быстрого перехода из одного места в другое, или можно указать каталоги, которые нужно предварительно загрузить? Люди просто много общаются? Или я подхожу к этому с совершенно неправильной точки зрения и мне нужно принять другую стратегию?

2) Можно ли использовать автозаполнение при дополнительной настройке для поиска файлов, скажем, в Project01 непосредственно над префиксом с подстановочными знаками и т. Д.? На чем я должен сосредоточиться, чтобы стать более эффективным здесь? Разве я не использую силу надстроек, таких как сосульки, что-нибудь еще?

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

6 ответов

Решение

Есть разные подходы. Кэш имени файла является встроенным решением. Открытие файлов из последних файлов также очень эффективно, особенно если вы установите большое количество сохраненных файлов (например, 1000). Есть также пакеты для открытия файлов из любой точки файловой системы. Кроме того, существуют мета-решения, например что угодно.el, которые могут отображать дополнения к файлам из нескольких источников (история, файлы проекта и т. Д.) В общем интерфейсе.

Вам следует изучить различные варианты, чтобы выяснить, какой из них наиболее подходит для вас.

helm (ранее известный как anything) может подойти вам. Вы можете установить его вручную или используя auto-install расширение.

Для auto-install способ: скачать его, положить в свой load-path, а затем добавить в .emacs:

(add-to-list 'load-path "~/.emacs.d/site-lisp/auto-install")
(require 'auto-install)
(setq auto-install-directory "~/.emacs.d/site-lisp/auto-install/")

Тогда делай M-x auto-install-batch anything, После этого поместите в.emacs:

(require 'anything)
(require 'anything-match-plugin)
(require 'anything-config)
(require 'anything-show-completion)

Тогда делай M-x anything для всего.

Также попробуйте ECB (расшифровывается как Emacs Code Browser). Если вы работаете в Linux, вы, вероятно, имеете его в стандартном репозитории.

Вы могли бы извлечь выгоду из использования ido-mode, что значительно улучшает автозаполнение почти везде в emacs (особенно при поиске файлов или буферов)

(setq ido-enable-flex-matching t
      ido-auto-merge-work-directories-length -1
      ido-create-new-buffer 'always
      ido-use-filename-at-point 'guess
      ido-everywhere t
      ido-default-buffer-method 'selected-window)
(ido-mode 1)
(put 'ido-exit-minibuffer 'disabled nil)
(when (require 'ido-ubiquitous nil t)
  (ido-ubiquitous-mode 1))

Хотя это может помочь вам быстро найти файлы "недалеко", это, вероятно, не поможет вам найти файлы в совершенно разных местах.

Если вы обнаружите, что одним из способов решения этой проблемы является использование recentf-mode для быстрого перехода к последним местоположениям (если у вас есть только небольшое количество обычных каталогов проектов, это может помочь). recentf может быть связан с ido используя что-то вроде этого (я не уверен, откуда я взял этот фрагмент):

(recentf-mode 1)
(setq recentf-max-saved-items 50)
(defun ido-recentf-open ()
  "Use `ido-completing-read' to \\[find-file] 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-f (ido-find-file) искать файлы рядом с вашим текущим местоположением, и C-x C-r (ido-recentf-open) искать недавно открытые файлы (надеясь, что один из них не слишком далеко от того места, куда вы хотите перейти).

Помимо IDO и recetf вы можете использовать следующие методы:

  1. Откройте каталог рекурсивно.

    (defun op-i:dired (rec)
      "customized dired: will display directory recursively when called with an argument"
      (interactive "P")
      (let ((dir (car (find-file-read-args "Dired: " nil))) 
            (opts (if rec (read-string "options: " "-lhAR") "-lhA")))
        (if (file-directory-p dir) (dired dir opts))))
    
    (define-key (current-global-map) (kbd "C-x C-d") 'op-i:dired)
    

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

  2. Используйте регистры Emacs, чтобы указывать на часто используемые каталоги. Вы можете инициализировать их в вашем.emacs

    (set-register ?0 (cons 'file "c:/path/to/my-project0"))
    (set-register ?1 (cons 'file "c:/path/to/my-project1"))
    

    Затем перейдите к регистрации, используя C-x r j

Другие люди уже упоминали что-нибудь, достаточно сказать, я думаю, что это решает все ваши проблемы.:)

Вызывая одну особенность чего-либо anything-locate, В системах * nix используется база данных, созданная командой locate, для быстрого поиска файлов. Я полагаю, что в Windows это работает со "Все", что должно дать вам почти мгновенные результаты поиска по всем вашим файлам. Я имею в виду все.

Том упомянул file-cache, С этим все работает.

Как примечание, Dired - абсолютный монстр, когда вы к нему привыкнете. Вы должны прочитать связанные с ним страницы emacswiki. Особенно dired-x, который поставляется с Emacs, связывает Cx Cj, переход к текущему буферу в Dired был для меня откровением. Также dired-find, wdired,

Изменить: некоторые подробности о том, почему Cx Cj является удивительным.

Когда вы помещаете текущий буфер в буфер Dired, вы можете изменить его, т.е. переименовать, удалить и т. Д. И Emacs знает о том, что вы сделали, и корректирует его соответствующим образом.

Другие возможности:

  1. Закладки. Если вы используете Bookmark +, то вы также можете:

    • Добавьте в закладки Dired буферы, которые запоминают их вложенные подкаталоги, их маркировки и пропуски в файлах. Вы можете иметь закладку, которая открывает Dired для определенного набора файлов, которые не обязательно должны находиться в том же каталоге или даже в том же дереве каталогов.

    • В Dired вы можете нажать клавишу, чтобы создать отдельную закладку для каждого отмеченного файла или вложенного каталога.

    • Закладка файлов автоматически (автофайлы).

    • Помечать закладки и файлы (закладки автофайлов) произвольными текстовыми метками. (Теги могут быть даже нетекстовыми объектами Lisp). Используйте теги для организации, поиска и т. Д. Различных категорий закладок.

    • Закладка наборов закладок или файлов закладок или рабочих столов Emacs. Перейдите к такой закладке, чтобы восстановить заданное состояние / контекст проекта.

  2. Сосульки

    • Определите временные или постоянные наборы файлов на лету, даже из разных каталогов. Управляйте файлами в наборе различными способами. (Используйте наборы файлов Emacs, менее мощные, таким же образом.) Заполните имена файлов из таких сохраненных наборов во время любой команды завершения, а не только поиска файла.

    • Действовать по-разному на файлы кандидатов во время завершения.

    • Поиск объектов с закладками или сохраненных наборов файлов или буферов.

  3. Dired +.

    • Дополнительная навигация, в том числе i прыжок между списком подкаталога и строкой подкаталога в родительском списке.

Refs:

Другие вопросы по тегам