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

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.