Jak edytować pliki crontab za pomocą Vima (pojawia się błąd: „plik tymczasowy musi być edytowany na miejscu”)

12

Jak edytować crontabpliki we 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

Używanie EDITOR=nvidziała dobrze ... Linux również działa dobrze ...

Martin Tournoij
źródło

Odpowiedzi:

19

Problem polega na tym, jak Vim zapisuje pliki. Domyślnie tworzy kopię pliku i zastępuje oryginalny.

Możesz to zaobserwować za pomocą:

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

# Open file in Vim, :wq

# inode changed!
$ ls -i a
3155322 a

crontabwprawia go to w zakłopotanie (patrz :help crontab)

Trzeba użyć :set backupcopy, aby yesdokonać Vima zastąpienie oryginalnego pliku:

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

Możesz to zrobić automatycznie dla plików crontab za pomocą:

au FileType crontab setlocal bkc=yes
Martin Tournoij
źródło
2

@ Samoodpowiedź Martina jest poprawna. Jednak dla osób takich jak ja, które próbują ograniczyć zapełnianie vimrcplików sporadycznymi wyjątkami - tutaj podczas edycji pliku crontab - jest pewna odmiana. Umożliwia to umieszczenie wyjątków bezpośrednio w pliku docelowym.

Poniżej moja modelka crontab:

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

Ważnym elementem jest tutaj bkc=yesdopasowanie do vimrckonfiguracji @ Martina . Reszta to osobiste ustawienia wygody.

Mówiąc o kompletności i refleksji, początkowa odpowiedź @ Martina jest najbardziej adekwatna w większości przypadków.

JM. Marcastel
źródło
1

Nie ten sam błąd, ale zdarza się również dość często:

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

Ten błąd pojawi się, jeśli użyjesz vizamiast vimcrontab. Musisz ustawić edytor crontab, dodając następujący kod do swojego ~/.bashrcpliku:

export EDITOR=vim
rubo77
źródło
-1

To samo dzieje się w OSX. Po zbadaniu problemu stwierdziłem, że działa on bezproblemowo vi, ale nie działa vim.

Tak więc poprawka może być:

EDITOR=vi crontab -e

Jednak vizwykle jest powiązany z vim(np. W OSX), więc jest to to samo.


Można to rozwiązać za pomocą następującego wiersza w pliku vimrc :

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

Istnieje inne obejście tego problemu poprzez dodanie następujących wierszy do pliku .vimrc :

if $VIM_NOBACKUP
  set nobackup
  set nowritebackup
endif

i uruchom polecenie:

VIM_NOBACKUP=1 crontab -e

Możesz także spróbować zdefiniować następującą zmienną:

EDITOR='VIM_NOBACKUP=1 vim'

Źródło: crontab: plik tymczasowy należy edytować na miejscu


Powodem tego jest sposób vim/ sposób vitraktowania plików kopii zapasowych.

kenorb
źródło
1
Ponieważ crontabzazwyczaj podnosi wartość EDITORlub VISUAL(jeśli jest zdefiniowana), można je ustawić: EDITOR='VIM_NOBACKUP=1 vim'.
muru
@muru Próbowałem, ale nie sądzę, że to działa. crontab -egeneruje crontab: VIM_NOBACKUP=1 vim: No such file or directory.
kenorb
1
Musi to być OSX, ponieważ działa na Arch Linux i Ubuntu, bash i zsh.
muru
2
Całe grzebanie w zmiennych środowiskowych wydaje mi się głupie; Vim ma sposób radzenia sobie z ustawieniami specyficznymi dla plików i nazywa się to autocmds. Wygląda na to, że właśnie skopiowałeś to z linku, ale wydaje się, że autor tego nie jest zbyt dobrze zaznajomiony z Vimem.
Martin Tournoij
2
Po co to w ogóle uwzględniać? To głupi sposób na robienie rzeczy i prawie nigdy nie ma powodu, aby nie używać autocmd. Po usunięciu tego pozostaje nam tylko autocmd, czyli ta sama odpowiedź, która jest dostępna od ponad półtora miesiąca. Ta odpowiedź dodaje tylko hałas.
Martin Tournoij