Emacs: какова хорошая тактика для навигации по каталогам и открытия файлов? - PullRequest
27 голосов
/ 22 февраля 2012

На прошлой неделе, снова (как) из-за того, что мне пришлось столкнуться с разными IDE для 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 на Amiga двадцать лет назад.

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

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

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

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

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

Ответы [ 6 ]

12 голосов
/ 22 февраля 2012

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, возможно, он доступен в стандартном хранилище.

9 голосов
/ 22 февраля 2012

Вы могли бы выиграть от использования 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) для поиска недавно открытых файлов (надеясь, что один из них не слишком далеко далеко от того места, куда вы хотите отправиться).

7 голосов
/ 22 февраля 2012

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

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

7 голосов
/ 22 февраля 2012

В дополнение к 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

6 голосов
/ 22 февраля 2012

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

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

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

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

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

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

5 голосов
/ 12 августа 2013

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

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

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

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

    • Автоматически создавать закладки для файлов (автофайлы).

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

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

  2. Сосульки .

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

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

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

  3. Dired + .

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

Ссылка:

...