Como criar aliases de diretório de retorno / encaminhamento para eshell?

9

Por anos, uso um script zsh que faz com que um pushd aconteça implicitamente toda vez que você altera os diretórios. O script também configura os aliases 'b' e 'f', abreviação para trás e para frente, que o movem para cima e para baixo na pilha, semelhante aos botões voltar e avançar em um navegador da web. Sessão de exemplo:

/etc $ cd /tmp
/tmp $ cd /bin
/bin $ b
/tmp $ b
/etc $ f
/tmp $ f
/bin $

Achei incrivelmente útil e fiquei pensando, qual é a melhor maneira de configurar isso no eshell?

Edit: Veja o código com o qual eu fui aqui, pequena modificação abaixo: https://gist.github.com/jgarvin/0627ed76a773ade222f6

Joseph Garvin
fonte

Respostas:

6

O seguinte salva o cdhistórico e fornece comandos eshell be fpara navegar nesse histórico:

;;*--- track cd history ------------------------------------------------*/
(defvar-local eshell-hist-dirs nil)

(add-hook 'eshell-directory-change-hook
          (defun eshell-update-hist-dir ()
            (push (eshell/pwd) eshell-hist-dirs)
            (setq eshell-hist-index 0)))

;;*--- navigate history ------------------------------------------------*/
(defvar-local eshell-hist-index 0)

(defun eshell-forward (n)
  (unless eshell-hist-dirs
    (user-error "eshell-hist-dirs is empty, cd a few times"))
  (let ((dirs eshell-hist-dirs)
        (index (+ eshell-hist-index n)))
    (prog1 (eshell/cd (nth index dirs))
      (setq eshell-hist-dirs dirs
            eshell-hist-index index))))

(defun eshell/b ()
  (eshell-forward 1))

(defun eshell/f ()
  (eshell-forward -1))

BTW, o cdcomando interno do eshell já fornece várias maneiras de pular para os diretórios de histórico, por exemplo, cd -para o último diretório, cd -1para o penúltimo diretório e cd =tmppara o último diretório que contém tmp. Consulte (eshell) Built-ins para obter mais informações.

xuchunyang
fonte
Isso funciona muito bem! A única ressalva que tenho é que, se você 'b' repetidamente ultrapassar o final da pilha, ele empurrará o último diretório para a pilha repetidamente. Portanto, se você 'b' repetidamente até parar de retroceder, pressione-o mais 4 vezes, precisará fazer 'f' 4 vezes antes que ele comece a avançar novamente no histórico de diretórios. Talvez apenas precise de uma verificação para garantir que, no gancho de mudança de diretório, ele realmente tenha sido alterado?
Joseph Garvin
Opa, talvez eu precise redefinir eshell-hist-indexpara zero quando o usuário executar cddo eshell.
precisa saber é o seguinte
Outra sugestão: não seria melhor usar defvar-local? Caso contrário, acho que você está compartilhando o mesmo histórico de cd em todos os shells, o que acho que seria um comportamento bastante surpreendente.
Joseph Garvin
Sim, o uso de variáveis ​​locais de buffer aqui está correto e eu o farei, atualmente o uso setqé para facilitar o desenvolvimento (porque eu as escrevo no *scratch*buffer e preciso examinar seus valores com freqüência).
precisa saber é o seguinte
Aqui está minha tentativa: gist.github.com/jgarvin/0627ed76a773ade222f6 . Eu mudei para usar defvar-local e fiz com que o diretório inicial seja colocado no histórico.
Joseph Garvin