Aqui está o meu problema em um servidor rodando CentOS 7 com emacs 24.3.1.:
- Quando executo
sudo emacs <protected_file>
em um arquivo que não tenho permissão de gravação, o emacs não lê meu arquivo .emacs, nem reconhece os comandos definidos em .emacs.d/elpa/. - Quando executo
sudo emacs -u myuserid <protected_file>
nesse arquivo, o emacs lê meu arquivo .emacs, mas ainda não sabe sobre meus pacotes elpa. - Quando executo
emacs <protected_file>
, ele lê .emacs e conhece os pacotes .emacs.d/elpa. (Mas o arquivo é aberto no modo somente leitura, é claro.) - Quando executo
sudo emacs <myfile>
em um arquivo no qual tenho permissão de escrita, o emacs não lê meu arquivo .emacs, nem reconhece os comandos definidos em .emacs.d/elpa/. emacs <myfile>
funciona como esperado.
No entanto, no servidor do qual copiei meu diretório pessoal, que executa o CentOS 6 com o emacs 23.1.1, tudo funciona bem. sudo emacs <protected_file>
lê .emacs e reconhece os comandos dentro de .emacs.d/elpa/.
Verifiquei que as permissões de arquivo e diretório em meu diretório inicial são idênticas em ambos os servidores.
Como o nível do sistema operacional e o nível do emacs são diferentes, parece que pode ser sudo
ou emacs
onde está o problema (ou na maneira como as pessoas do sistema configuraram o novo servidor).
Alguma idéia sobre esse comportamento estranho?
ATUALIZAÇÃO : Post original indicado no item 4 que sudo emacs <myfile>
funcionou como esperado. Isso não era verdade, e eu alterei isso acima.
O problema aqui é que ao executar seu editor via
sudo
, ele usará o ambiente do root ao invés do seu próprio. Você poderia configurar o editor da mesma forma para o root como para o seu usuário normal, mas obviamente isso não se estende bem a sistemas onde mais de uma pessoa temsudo
acesso.A solução mais simples, então, é não executar o editor em
sudo
. Basta copiar o arquivo original, modificar a cópia e copiá-la novamente sobre o original. Aqui, apenas as operações de cópia podem precisar de privilégios escalados. Em muitos sistemas, você pode usar essa abordagem comIsso executará
$SUDO_EDITOR
,$VISUAL
, ou$EDITOR
(marcado nessa ordem) com privilégios padrão em uma cópia temporária do arquivo de destino e confirmará as alterações no original depois que o editor sair.Se o seu editor estiver definido como
emacsclient
em vez de apenasemacs
, e você tiver um emacs aberto no modo de servidor, você só precisa fechar o buffer (não o emacs como um todo) para confirmar as alterações.