Estou trabalhando em uma configuração personalizada e pequena do Emacs que quero compartilhar com alguns amigos como um repositório git para que eles usem como linha de base para suas próprias configurações futuras.
Para isso, preciso de uma maneira de testar minha configuração e a solução mais simples que posso encontrar é algo como:
$ emacs --eval "(setq user-emacs-directory \"~/Code/my_custom_emacs.d/\")"
Mas não consigo fazê-lo funcionar.
Qualquer ajuda muito apreciada.
.emacs.d
diretório personalizado , a menos que você mude HOME, o que me parece problemático. As pessoas forneceram soluções alternativas abaixo, mas, para mim, isso soa como uma solicitação de recurso bastante razoável para o próprio Emacs.wontfix
e fechada no rastreador de erros.Respostas:
A abordagem básica que eu uso para isso é modificar
$HOME
, executando:Você então usa
/path/to/dir/.emacs.d
Você também pode vincular os arquivos ou diretórios importantes neste diretório inicial falso de volta aos reais, para que o Emacs os veja.
fonte
A maneira que eu uso para manter vários
.emacs.d
diretórios em paralelo é a seguinte.O emacs é iniciado assim:
Cada
init.el
arquivo começa assim, para configurar corretamente as variáveisuser-init-file
euser-emacs-directory
:Descobri que isso funciona de maneira muito confiável nos últimos meses. Aqui estão algumas observações:
quebra
emacs-init-time
, o que apenas informa o tempo necessário para carregar a configuração padrão do sistema, mas não o seu próprio arquivo init. Se você estiver interessado em comparar seu tempo de inicialização, precisará fazê-lo de outra maneira (veja, por exemplo, Como faço para medir o desempenho do código elisp? ).não é equivalente a uma inicialização normal e você precisará cuidar de alguns pontos específicos. Em particular:
after-init-hook
é executado antes do arquivo init ser carregado.*scratch*
buffer é criado antes do carregamento do arquivo init. Você precisará alterar seu modo explicitamente (em vez de usarinitial-major-mode
).package-initialize
; isso não será feito automaticamenteo caminho para
init.el
pode ser escolhido arbitrariamente; em particular, o diretório em queinit.el
reside não precisa ser nomeado.emacs.d
. Eu uso isso para ter, por exemplo,.emacs.d.23
acompanhamento.emacs.d.24
, a fim de poder alternar entre diferentes versões do emacs (o sistema que estou usando no trabalho está ultrapassado, e não consigo instalar o emacs 24 em todas as máquinas que uso).esse fluxo de trabalho não requer modificação do ambiente (e especialmente do
HOME
envvar), o que pode ser desejável se você executar programas no emacs, que podem ser afetados pelo ambiente modificado).fonte
--load
arquivo ed como o arquivo init. Para iniciantes, parece-me que a inicialização normal (padrão) do pacote não ocorrerá eafter-init-hook
será executada antes que o arquivo init (falso) seja avaliado. Com certeza você pode contornar essas coisas, mas lembre-se de que não é exatamente a mesma coisa que o Emacs usando o caminho especificado como o arquivo init.after-init-hook
. Mas tenho que dizer que, embora eu use essa técnica o tempo todo, nunca encontrei nenhum problema comafter-init-hook
(mas não a uso explicitamente, e talvez tenha sorte de ter os pacotes que utilizo não confiam nela) . O que você quer dizer com "inicialização normal (padrão) do pacote não ocorrerá"?command-line
não vai ligarpackage-initialize
nessa situação. Você precisaria chamá-lo manualmente no arquivo init falso.Você pode ligar
~/.emacs.d
, é isso que eu façoTente manter minha configuração do emacs
~/.emacs.d
orientada, ou seja, todos os arquivos de configuração relacionados ao emacs devem residir nessa pastaEntão, eu tenho uma
~/.emacs_configs
pasta onde todas as pastas de configuração (basicamente uma pasta com uminit.el
e o restante da configuração) vivem, então minha pasta de configuração pessoal será~/emacs_configs/iqbal
, uma distribuição de prelúdio estará em~/emacs_configs/prelude
Muito cedo na minha configuração pessoal do emacs, defino o
user-emacs-directory
caminho completo para a minha configuração usando o seguinteEntão, finalmente, faço o link simbólico
~/.emacs.d
para a configuração que realmente quero usar, por exemplo. para usar minha configuração eu vou fazerln -s ~/emacs_configs/iqbal .emacs.d
. Se você quiser experimentar algumas configurações, basta copiar a pasta de configuração~/emacs_configs/whatever_name
e alterar o link simbólicoA vantagem da terceira etapa é que o emacs iniciado com minha configuração pessoal pode ser executado sem afetar, mesmo que eu mude o
.emacs.d
link simbólico enquanto o emacs está em execução.Outra vantagem é que os
HOME
programas externos não alterados com os quais o emacs pode precisar para interagir não são afetadosfonte
(setq user-emacs-directory (file-truename "~/.emacs.d/"))
que elas possam ser executadas sem afetar simultaneamente?~/.emacs.d
invés de usá-louser-emacs-directory
. Encontrei pelo menos uma dessas bibliotecas, mas infelizmente não consigo lembrar o nome.Uma configuração que não muda
HOME
ou funciona com links simbólicos pode ser encontrada na minha resposta https://emacs.stackexchange.com/a/20508/934 . Com esta configuração, você pode alterar auser-emacs-directory
configuração de uma variável de ambiente:e isso ainda funciona com o daemon.
fonte
Encontrei esta solução interessante do EmacsWiki :
(não exatamente usando um diretório personalizado, mas funciona bem porque você provavelmente tem um único arquivo de entrada)
fonte
O patch que permite especificar o local .emacs.d através da variável de ambiente `EMACS_USER_DIRECTORY 'está disponível em https://debbugs.gnu.org/cgi/bugreport.cgi?bug=15539, mas ainda não foi mesclado.
fonte
Defina seu var antes de carregar seu arquivo init:
Então, no seu arquivo init (neste caso
~/.emacs
):fonte
Expandindo a resposta do @phils, criei este pequeno script de shell (chamado
testrun.sh
) para testar minha nova configuração do emacs. Isso também pode fazer sentido em outros casos (por exemplo, ao testar alterações no seu init.el que podem quebrar o emacs).fonte
Aqui está um pequeno script baseado na resposta e no comentário de @ Phil sobre a alteração da
HOME
variável de ambiente e a restauração no Emacs.fonte
Se o caso de uso estiver compartilhando o diretório ".emacs.d" de configuração do emacs único entre todos os usuários de uma máquina Linux, esta solução https://emacs.stackexchange.com/a/4258/5488 funcionaria na maioria dos casos, mas em alguns casos cases O emacs tenta gravar arquivos temporários no diretório user-emacs (como o arquivo .ido.last). Nesses casos, se o diretório de configuração compartilhado tiver permissão de gravação para todos os usuários, ele funcionará, mas pode não ser a solução desejada, pois cada usuário do sistema pode não querer compartilhar o mesmo diretório para armazenar arquivos temporários. Nesse caso, a seguinte solução será a melhor opção.
O arquivo de configuração compartilhado comum .emacs.d / init.el deve começar com
Faça com que a configuração compartilhada .emacs.d tenha permissão de leitura para todos os usuários (não precisa ter permissões de gravação)
Todo usuário terá seu próprio diretório "~ / .emacs.d /", mas apenas será usado para salvar os arquivos temporários, mas os pacotes e outras configurações serão carregadas no diretório de configuração compartilhado.
fonte