Arquivos abertos recentemente no modo ido

12

Eu uso ido-mode, mas uma coisa que odeio é que depois C-x C-fque não consigo usar as up/downteclas para percorrer os arquivos abertos recentemente, como costumava ser, por exemplo, com iswitchb. Como posso idotrabalhar dessa maneira?

WeSenseASoulInSearchOfAnswers
fonte

Respostas:

16

Observando as opções de personalização para ido-mode( M-x customize-group RET ido RET), não vejo opções para ativar o comportamento de ciclismo que você descreve.

Você pode, no entanto, adicionar o seguinte ao seu arquivo 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)

Com isso, você pode pressionar C-x C-rpara concluir o Ido para selecionar arquivos abertos recentemente.

Por padrão, os 20 arquivos mais recentes serão mantidos no histórico. Eu sugiro que você aumente até 150, definindo recentf-max-saved-items:

(setq recentf-max-saved-items 150)

Bônus: Acessando arquivos recentes, edição com esteróides

Eu não vê-lo mencionado em um monte de lugares, mas Ido Buffers Virtuais torná-lo super fácil para acessar arquivos recentes. Habilite-os assim:

(setq ido-use-virtual-buffers t)

O comportamento que você recebe é este:

Se não nil, consulte buffers passados ​​("virtuais") e também existentes.

Basicamente, funciona da seguinte maneira: digamos que você esteja visitando um arquivo e o buffer seja limpo midnight.el. Mais tarde, você deseja alternar para esse buffer, mas descubra que ele não está mais aberto. Com os buffers virtuais ativados, o nome do buffer permanece na lista de buffers (usando a ido-virtualface e sempre no final) e, se você o selecionar, ele abrirá o arquivo novamente. Isso permite que você pense menos se os arquivos abertos recentemente ainda estão abertos ou não. Na maioria das vezes, você pode sair do Emacs, reiniciar e alternar para um buffer de arquivo que estava aberto anteriormente como se ainda estivesse.

itsjeyd
fonte
Até agora eu votei, aceitarei mais tarde quando vou testá-lo e entender como ele funciona. (meu entendimento de lisp é muito ruim).
WeSenseASoulInSearchOfAnswers
@WeSenseASoulInSearchOfAnswers Claro, não tenha pressa. Entre em contato se tiver alguma dúvida específica sobre o código que eu publiquei.
precisa saber é o seguinte
Aceitei, mas, francamente, não gosto, porque com C-x C-risso não é possível abrir um novo arquivo. Também estou surpreso por não ser possível personalizá-lo de maneira simples. A história de C-x C-fé uma característica tão óbvia que não consigo entender por que ainda não foi implementada ido. Por exemplo, M-x up/downalterna entre comandos recentes, M-% up/downalterna entre substituições de consultas recentes, mesmo fora do emacs - todos os shells como bash ou zsh usam cima / baixo para recuperar comandos anteriores. Para mim C-x C-f up/downdeve percorrer os arquivos abertos recentemente. Ponto final.
WeSenseASoulInSearchOfAnswers
@WeSenseASoulInSearchOfAnswers Concordo com você e não tenho idéia de por que isso não está disponível ou personalizável imediatamente. Para mim, pessoalmente, não é grande coisa, porque eu uso o recurso de buffers virtuais que descrevo em minha resposta; portanto, mudar para um arquivo recente é o mesmo que mudar para outro buffer; Muito fácil. Mas entendo que pode ser frustrante se um recurso que você está acostumado a usar não estiver disponível.
itsjeyd
5
+1 para ido-use-virtual-buffers- um ótimo recurso que realmente deve estar ativado por padrão na IMO.
Jon O.
2

Embora as ligações tenham evoluído ao longo do tempo, a partir de hoje, quando você chama ido-find-fileou ido-find-file-read-only, é possível usar as seguintes ligações disponíveis na configuração padrão:

  • M-o invoca ido-prev-work-file
  • C-M-o invoca ido-next-work-file

Para além destes, não sendo tão ergonomicamente agradável como o M-pe M-nligações que eu tinha sido usado para antes de tentar ido , eles também são lentos, ea consequente tagarelice minibuffer é distrair e confundir. ido faz algo mais do que apenas mostrar um nome de arquivo aberto recentemente; ele relata que está "Procurando por ' nome do arquivo ' ...", talvez por relutância em oferecer um nome para um arquivo que não existe mais.

A mensagem "Procurando" vem da função ido-make-merged-file-list. Lendo a fonte , não vejo nenhuma maneira de desativar qualquer mágica que esta função esteja fazendo.

Você pode considerar rebobinar os pares ido-prev-work-filee ido-next-work-filepara algo mais natural como C-M-pe C-M-n, ou trocar as ligações current M-p( ido-prev-work-directory) e M-n( ido-next-work-directory) por elas.

Aqui está o código Emacs Lisp para restaurar M-pe M-nalternar entre arquivos recentes, movendo as ligações focadas em diretório padrão para C-M-pe C-M-nrespectivamente:

(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)))))
seh
fonte
1
Bem-vindo ao Emacs SE! Tente manter suas respostas focadas na pergunta do pôster original. Certamente o seu comentário sobre o "tagarelice do minibuffer" é interessante e relacionado, mas distrai a busca de uma resposta real para a pergunta. Mais importante: tente formular sua resposta na forma de ... bem, uma resposta. O que você escreveu parece mais um comentário, o que não é adequado para um site de perguntas e respostas como esse.
amigos estão
Bem, o primeiro parágrafo e sua lista a seguir respondem à pergunta original, que procurava chaves para percorrer os arquivos abertos recentemente. Essas ligações existem por padrão, mas nenhuma das outras respostas aqui mencionou essas ligações. Estou trabalhando no código de religação e o incluirei na minha resposta assim que estiver satisfeito.
26414
2

O que recorri neste caso é voltar ao comportamento normal do minibuffer digitando Cf no idomode. Então você terá as chaves normais de navegação no histórico. Se você o conhece com antecedência, pode ser rápido: Cxff :-)

seu amigo
fonte
1

A resposta dada por @itsjeyd é bastante completa. Deixe-me apenas sugerir uma função:

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

Cortesia de WikEmacs

Nsukami _
fonte
1

Eu achei que helm-for-filesfunciona melhor do que qualquer uma das respostas acima para fins de preenchimento automático de nome de arquivo e com uma interface de pesquisa agradável. Além disso, você pode configurá-lo para incluir qualquer item de pesquisa que desejar.

user10375
fonte
1
O @Drew helm vem com o próprio modo ido. Na maioria das vezes, quando as pessoas pesquisam neste post, podem estar interessadas em conhecer outras alternativas para resolver o problema.
user10375