Como dizer ao Ido para sair do caminho quando já posso colar o nome do arquivo?

14

Estou tentando me fazer usar o modo Ido. Algumas vezes é legal, mas outras vezes é extremamente estúpido. Aqui está a minha maior decepção.

Eu li alguns registros com nomes completos de arquivos, copiei um nome e tente abrir esse arquivo.

A maneira de fazer isso sem o Ido: C-aC-yC-kRET

Com o Ido, existem dois grandes problemas:

  1. Se eu tiver o nome completo do arquivo, não há como inseri-lo (preciso remover a primeira barra, caso contrário, pressionar //não ajudará.

  2. Não consigo editar partes intermediárias do nome do arquivo, deixando o restante sem modificações.

Ou posso?

wvxvw
fonte
2
Você pode cair de volta para estoque find-filecom C-x C-fe colar normalmente. Mas então, isso é mais pressionamentos de tecla. Ou você pode usar o Helm se desejar um recurso rico find-filee ainda assim satisfazer o seu caso de uso.
Tu Do
1
Ah, obrigado, nah, eu não faço isso com tanta frequência que reclamaria sobre duas teclas extras. Isso realmente responderia às minhas necessidades por enquanto. Obrigado!
Wdxvw
@ Tu Você deve colocar isso como resposta abaixo. Eu achei o C-x C-ffallback útil tantas vezes!
precisa

Respostas:

17

Enquanto um idocomando estiver ativo ( ido-find-fileneste caso), você poderá retornar à versão não-ido do mesmo comando ( find-filenesse caso) usando a ligação ido-default C-x C-fpara ido-fallback-command.

Para responder sua pergunta,

  • O primeiro C-x C-fserá chamado ido-find-file.
  • O segundo C-x C-fvoltará a find-file.
  • Em seguida, você pode fazer C-a C-y C-k RETo que costuma fazer para puxar um caminho de arquivo copiado para o minibuffer.

Nota: Em ido, C-x C-f C-x C-ffará o mesmo que C-x C-f C-f, ou seja, voltará a find-file.

Sobre C-femido In ido-mode, C-festá vinculado a ido-magic-forward-char. De ido.el,

(defun ido-magic-forward-char (arg)
  "Avance na entrada do usuário ou execute uma ação mágica.
Se nenhuma entrada do usuário estiver presente ou no final da entrada, execute ações mágicas:
Cx Cb ... Cf mude para `ido-find-file '.
Cx Cf ... Cf fallback para não-Ido `find-file '.
Cx Cd ... Cf fallback para breve não-Ido `dired '.
Cx d ... Cf fallback para não-Ido `dired '."
Tu Do
fonte
2
Para mim, é só C-fvoltar find-file, não C-x C-f. Não vejo que eu o personalizei (e eu, como outros aqui, confia muito no fallback. idoÉ quase o mesmo problema que vale a pena, depois de usá-lo por um tempo agora).
Harpo
1
@harpo Acabei de atualizar a resposta acima, explicando o porquê C-x C-f C-ftambém funciona.
precisa
Obrigado a @kaushalmodi pela maior parte do trabalho. Minha resposta é inicialmente simples como o comentário. Deve ser a resposta dele :) Apenas uma nota para credibilidade.
Tu Do
Isso salvou minha sanidade, pois o ido não brinca muito com vagabundos ao usar caminhos absolutos. Obrigado.
Jérémie
6

Como você está lidando com nomes de caminhos completos, outros métodos podem funcionar:

  • use M-x ffap( find-file-at-point): lê automaticamente o nome do caminho e abre o arquivo
  • ativar o M-x compilation-shell-minor-modeque mudará a fonte dos caminhos e os tornará "clicáveis" (com a boca ou RET). Clicar nele leva você ao arquivo e à linha específica, e você pode usar next-errore previous-errornavegar. Costumo usá-lo, como no modo shell .
Ehvince
fonte
5

Como sempre há mais de uma maneira de fazer isso, aqui está uma variação da idéia do @ abo-abo que mantém a conclusão do ido ativa, em vez de voltar ao comando normal de busca.

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

Com esta ligação:

  • Se o kill atual for um caminho de diretório válido, você poderá iniciar ido-find-file, pressionar C-ypara pular para o diretório arrancado e continuar a usar a conclusão do ido para escolher um arquivo.

  • Se a interrupção atual for um caminho de arquivo válido, você pode iniciar ido-find-file, pressionar C-ypara pular para o diretório puxado e oferecer o nome do arquivo puxado como conclusão e pressionar RET para abrir esse arquivo.

  • Se a morte atual for qualquer outra coisa, ela é arrancada normalmente.

glucas
fonte
Não seria melhor letligar as várias ido-...variáveis ​​ao invés setqdelas? No momento, parece que você está definindo valores permanentemente, em vez de fazê-lo pela vida útil da função.
Dan
@ Dan Estou seguindo o padrão de comandos ido como ido-next-work-directory. Acho que as variáveis ​​são definidas para que sobrevivam na chamada de saída do minibuffer e na atualização subsequente. Mas eu ainda não entendo completamente as ido-internas!
glucas
Sim, eu queria saber se eles serão atualizados posteriormente de qualquer maneira. Só queria colocar um heads-up.
Dan
4

Talvez assim:

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

Se o kill atual é um arquivo que existe, C-y C-y provavelmente deve dar o que você deseja.

abo-abo
fonte