Как сказать Ido убраться с дороги, когда я уже могу просто вставить имя файла?

14

Я пытаюсь заставить себя использовать режим Ido. Иногда это приятно, а иногда - очень глупо. Вот мое самое большое разочарование.

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

Способ сделать это без Идо: C-aC-yC-kRET

С Идо есть две основные проблемы:

  1. Если у меня есть полное имя файла, я не могу его ввести (я должен удалить первую косую черту, иначе даже нажатие //не поможет.

  2. Я не могу редактировать промежуточные части имени файла, оставляя остальные без изменений.

Или я могу?

wvxvw
источник
2
Вы можете вернуться на склад find-fileс C-x C-fи вставить в обычном режиме. Но тогда это больше нажатий клавиш. Или вы можете использовать Helm, если вы хотите иметь богатые функциональные возможности find-fileи при этом удовлетворить свой вариант использования.
Ту До
1
Ах, спасибо, нет, я делаю это не так часто, чтобы жаловаться на два дополнительных нажатия клавиш. Это на самом деле отвечает моим потребностям на данный момент. Благодарность!
wvxvw
@Tu Do Вы должны записать это как ответ ниже. Я нашел этот C-x C-fрезерв полезным много раз!
Каушал Моди

Ответы:

17

Пока idoкоманда активна ( ido-find-fileв этом случае), вы можете вернуться к не-ido версии той же команды ( find-fileв этом случае), используя привязку ido-default C-x C-fдля ido-fallback-command.

Чтобы ответить на ваш вопрос,

  • Первый C-x C-fпозвонит ido-find-file.
  • Второй C-x C-fотступит find-file.
  • Затем вы можете сделать, C-a C-y C-k RETкак обычно, чтобы скопировать путь скопированного файла в минибуфер.

Примечание: In ido, C-x C-f C-x C-fбудет делать то же самое, что C-x C-f C-f, например, отступать find-file.

О C-fвido In ido-mode, C-fнеизбежно ido-magic-forward-char. От ido.el,

(defun ido-magic-forward-char (arg)
  "Переместиться вперед при вводе пользователем или выполнить магическое действие.
Если пользовательский ввод отсутствует или в конце ввода выполните магические действия:
Cx Cb ... Cf переключиться на `ido-find-file '.
Cx Cf ... Cf откат к не-Ido `find-file '.
Cx Cd ... Cf откат к не-идо краткому "dired".
Cx d ... Cf отступление к не-Ido "dired". "
Ту До
источник
2
Для меня это просто C-f вернуться find-file, а не C-x C-f. Я не вижу, что я настроил его (и я, как и другие здесь, очень полагаюсь на запасной вариант. idoЭто почти столько же проблем, сколько стоит, если использовать его некоторое время).
Harpo
1
@harpo Я только что обновил ответ выше, объясняя, почему C-x C-f C-f также работает.
Каушал Моди
Спасибо @kaushalmodi за большую часть работы. Мой ответ изначально прост, как комментарий. Это должен быть его ответ :) Просто записка для достоверности.
Ту До
Это спасло мое здравомыслие, так как ido не очень хорошо играет с бродягой, когда использует абсолютные пути. Спасибо.
Жереми
6

Учитывая, что вы имеете дело с полными путями, другие методы могут работать:

  • use M-x ffap( find-file-at-point): он автоматически прочитает имя пути и откроет файл
  • Активизировать M-x compilation-shell-minor-mode который изменит шрифт путей и сделает их «кликабельными» (с помощью кнопки или RET). Нажав на него, вы попадете в этот файл и в конкретную строку, и вы можете использовать next-errorи previous-errorдля навигации. Я часто использую его, как в режиме оболочки .
Ehvince
источник
5

Так как всегда есть несколько способов сделать это, вот вариант идеи @ abo-abo, который поддерживает активное завершение ido, а не возвращается к обычной команде поиска.

(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)

С этим обязательным:

  • Если текущее уничтожение является допустимым путем к каталогу, вы можете запустить ido-find-file , нажать, C-yчтобы перейти к каталогу yanked, а затем продолжить использовать ido завершение, чтобы выбрать файл.

  • Если текущее уничтожение является допустимым путем к файлу, вы можете запустить ido-find-file , нажать, C-yчтобы перейти в каталог восстановления и предложить имя файла восстановления в качестве завершения, и нажать RET, чтобы открыть этот файл.

  • Если текущее уничтожение - это что-то еще, его обычно дергают.

glucas
источник
Не лучше ли letсвязать различные ido-...переменные, а не setqих? Прямо сейчас, похоже, что вы постоянно устанавливаете значения, а не делаете это для жизни функции.
Дан
@Dan Я следую примеру команд ido вроде ido-next-work-directory. Я думаю, что переменные установлены так, что они выживают при вызове exit-минибуфера и последующем обновлении. Но я до сих пор не в восторге от внутренних органов Идо!
glucas
Да, мне было интересно, обновятся ли они впоследствии в любом случае. Просто хотел поставить в хедз-ап.
Дан
4

Может быть так:

(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)))

Если текущее уничтожение - это файл, который существует, выполнение, C-y C-y вероятно, должно дать вам то, что вы хотите.

Або-або
источник