Como edito arquivos crontab com o Vim (recebo o erro: 'o arquivo temporário deve ser editado no local')

12

Como edito crontabarquivos no FreeBSD?

$ crontab -e
# ... I do my thing in vim & :wq

"crontab.9ZcXiFaawt" 6L, 203C written
crontab: temp file must be edited in place
Exit 1

Usar EDITOR=nvifunciona bem ... O Linux também parece funcionar bem ...

Martin Tournoij
fonte

Respostas:

19

O problema é como o Vim grava arquivos. Por padrão, ele faz uma cópia do arquivo e substitui o original.

Você pode observar isso com:

# Show the file's inode
$ ls -i a
3156153 a

# Open file in Vim, :wq

# inode changed!
$ ls -i a
3155322 a

crontabfica confuso com isso (veja :help crontab)

Você precisa usar o :set backupcopypara yesfazer com que o Vim substitua o arquivo original:

"yes"   make a copy of the file and overwrite the original one

Você pode fazer isso automaticamente para arquivos crontab com:

au FileType crontab setlocal bkc=yes
Martin Tournoij
fonte
2

A resposta automática de Martin está correta. Uma variação, no entanto, para pessoas como eu que tentam limitar o preenchimento de seus vimrcarquivos com exceções ocasionais - aqui, editando um crontab, é usar modelines. Isso permite colocar as exceções diretamente no arquivo de destino.

Abaixo está minha modelagem do crontab:

# vim: nu et tw=130 ts=8 sts=4 sw=4 ff=unix fo-=l fo+=tcroq2 bkc=yes

O ponto importante aqui é o bkc=yesque corresponde à vimrcconfiguração do @ Martin . O restante são configurações de conveniência pessoal.

Dito isto, para ser completo e motivador, a resposta inicial de @ Martin é a mais adequada na maioria dos casos.

JM. Marcastel
fonte
1

Não é o mesmo erro, mas também acontece com bastante frequência:

Error detected while processing /root/.vimrc:
line    2:
E319: Sorry, the command is not available in this version: syntax enable
line    7:
...

Este erro será exibido, se você usar em vivez do vimcrontab. Você precisa definir o editor do crontab adicionando o seguinte código ao seu ~/.bashrcarquivo:

export EDITOR=vim
rubo77
fonte
-1

O mesmo acontece no OSX. Depois de investigar o problema, descobri que ele funciona de maneira simples vi, mas não funciona vim.

Portanto, a correção pode ser:

EDITOR=vi crontab -e

No entanto, vigeralmente está vinculado a vim(por exemplo, no OSX), por isso é a mesma coisa.


Isso pode ser resolvido pela seguinte linha no seu arquivo vimrc :

au BufNewFile,BufRead crontab.* set nobackup | set nowritebackup

Há outra solução alternativa para isso, adicionando as seguintes linhas ao arquivo .vimrc :

if $VIM_NOBACKUP
  set nobackup
  set nowritebackup
endif

e execute o comando:

VIM_NOBACKUP=1 crontab -e

Você também pode tentar definir a seguinte variável:

EDITOR='VIM_NOBACKUP=1 vim'

Fonte: crontab: o arquivo temporário deve ser editado no local


A razão que isso está acontecendo tem a ver com a maneira como as vim/ vitrata os arquivos de backup.

kenorb
fonte
1
Desde crontabnormalmente eleva o valor EDITORou VISUAL(se estiver definido), você pode configurá-los: EDITOR='VIM_NOBACKUP=1 vim'.
Muru
@uru Eu tentei, mas não acho que funcione. crontab -egera crontab: VIM_NOBACKUP=1 vim: No such file or directory.
kenorb
1
Deve ser uma coisa do OSX, porque funciona no Arch Linux e Ubuntu, bash e zsh.
Muru
2
Toda a bagunça nas variáveis ​​de ambiente parece bobagem para mim; O Vim tem uma maneira de lidar com configurações específicas de arquivos, e é chamado de autocmds. Parece que você acabou de copiar isso do link, mas parece que o autor não está muito familiarizado com o Vim.
Martin Tournoij 26/03
2
Por que incluí-lo? É uma maneira boba de fazer as coisas, e quase nunca há um motivo para não usar um autocmd. Quando removemos isso, ficamos apenas com o autocmd, que é a mesma resposta que está aqui há mais de um mês e meio. Essa resposta não acrescenta nada além de ruído.
Martin Tournoij 26/03