Atualizar automaticamente o diretório padrão quando o PWD for alterado no modo shell e no modo termo

12

Existem opções ou pacotes que causam default-directorya atualização se o diretório de trabalho é alterado shell-modee term-mode? Ou seja, ao usar cd, mas a solução teria que ser mais robusta do que apenas procurar esse comando em particular e talvez alguns outros - ele deve realmente verificar o valor de $PWDdepois de cada comando, eu acho.

Mais importante ainda, ele também deve funcionar ao conectar-se a uma máquina remota a partir de um buffer shell-modeou term-modeque foi criado com default-directoryo diretório local. Na verdade, esse é o recurso que eu realmente preciso: ser capaz de dizer de forma programática se os comandos que digito nesses terminais são executados em uma máquina remota. Gostaria de obter essas informações na forma de um conjunto default-directorye figura adequados , se houver uma maneira de obtê-los; a ferramenta que fizer isso também funcionaria localmente, conforme descrito acima.

tarso
fonte
Você já olhou dirtrack-mode? Tem um gancho que pode fazer o que você deseja.
J David Smith

Respostas:

12

Acho que a primeira parte da sua pergunta pode ser resolvida dirtrack-mode. Primeiro, você define o prompt do shell para incluir o diretório de trabalho atual. Em seguida, você define dirtrack-listum regex que informa dirtrack-modecomo extraí-lo. Exemplo: eu configurei PS1no Bash para ser este:

export PS1="[\h:\w] $ "

e no Emacs eu coloco dirtrack-liste ligo dirtrack-mode:

(set-variable 'dirtrack-list '("^.*[^ ]+:\\(.*\\)]" 1 nil))
(dirtrack-mode 1)

(Extraído desta excelente postagem no blog .)

Depois disso, sou capaz de alterar os diretórios à vontade e as default-directoryalterações conforme eu for. Isso também funciona se, em um shell, eu SSH em uma máquina remota na qual defini o prompt da mesma maneira - cd /etc/apache2, na máquina remota, mude default-directorypara /etc/apache2. Observe, no entanto, que isso é local - no caso da máquina remota, default-directoryainda será definido /etc/apache2na máquina local .

Se eu entendo a segunda parte da sua pergunta, você deseja default-directorydefinir algo como remote-machine:/etc/apache2quando estiver usando o SSH em outra máquina. Ao usar o ssh-el , você pode executar ssh-directory-tracking-modepara fazer isso funcionar. Por exemplo, se eu executar M-x sshcd para /etc/apache2, e executar C-x C-f, o prompt que vejo é:

Find Files or Url: /scp:aardvark@remote-machine:/etc/apache2

Você pode executar o 'Mx ssh-directory-tracking-mode` manualmente, mas é mais conveniente configurá-lo como um gancho para o modo ssh:

(setq ssh-mode-hook 'ssh-directory-tracking-mode)

Mais Informações:

Saint Aardvark, o Carpete
fonte
2
Excelente resposta, obrigado! Na verdade, estou interessado nisso porque um pacote que eu escrevi desenvolveu recursos que tornarão isso desejável. É o with-editorque será usado no próximo lançamento do Magit. O Magit em si não usa with-editoro suporte a s shell-mode/ term-mode, portanto provavelmente não o integrarei antes do lançamento. Mas as informações que você forneceu tornarão muito mais fácil fazê-lo, assim que terminar o lançamento do Magit e puder focar novamente em outras coisas.
tarsius
Veja como começar with-editorfora do Magit: emacs.stackexchange.com/questions/27/… . E a questão do Magit que me levou a fazer esta pergunta: github.com/magit/magit/issues/1638 .
tarsius