Zachowaj bity uprawnień podczas pisania nowego pliku za pomocą VIM

8

W Vimie, kiedy piszę kopię bieżącego bufora do nowego pliku za pomocą :w [filename], wydaje się, że Vim używa domyślnych (tj. Ustawionych przez umask lub cokolwiek) uprawnień do nowego pliku. Jeśli jednak bieżący bufor został załadowany z istniejącego pliku, czy „właściwym” zachowaniem nie powinno być powielanie uprawnień z tego pliku? Na przykład, jeśli edytuję plik wykonywalny i piszę nową kopię pliku, dlaczego Vim nie pisze nowego pliku wykonywalnego ? Czy jest jakiś sposób, aby zmusić Vima do zachowywania się tak, jak to opisuję, oprócz robienia czegoś takiego jak ! chmod --reference % [newfilename]po zapisaniu nowego pliku?

Kyle Strand
źródło
Możliwe powiązanie: unix.stackexchange.com/q/58880/22703
allquixotic
Myślę, że odpowiedź jest już w pytaniu - powinieneś zrobić makro lub skrót klawiszowy, który zrobi to chmodza ciebie. AFAIK, vim nie ma tego wbudowanego.
Kevin Panko

Odpowiedzi:

3

Możesz zrobić coś takiego. Najpierw przechwyć nazwę oryginalnego pliku.

au BufRead * let b:oldfile = expand("<afile>")

Następnie, kiedy zapisujesz nowy plik, zmień jego uprawnienia, aby były takie same jak uprawnienia do oryginalnego pliku.

au BufWritePost * if exists("b:oldfile") | let b:newfile = expand("<afile>") | if b:newfile != b:oldfile | echo system("chmod --reference=".b:oldfile." ".b:newfile) | endif |endif

Wystarczy umieścić oba te polecenia automatyczne w swoim ~ / .vimrc.

garyjohn
źródło
Ta odpowiedź jest niesamowita, ale mam jedną sugestię: zmień echo system(etc na silent echo system(itd. Pozwala to uniknąć zawieszenia się „naciśnij ENTER, aby kontynuować”.
Kyle Strand
@KyleStrand: Mógłbym również call system(...uniknąć drukowania czegokolwiek na wyświetlaczu, ale starałem się uniknąć problemu z cichym wykonywaniem polecenia. Jeśli nie sądzisz, że to kiedykolwiek zawiedzie lub wolisz żyć z okazjonalnymi niepowodzeniami niż z nieznośnymi Press ENTER..., to zgadzam się z twoją sugestią. Myślę jednak, że lepszym rozwiązaniem byłoby napisanie funkcji, która przechwytuje dane wyjściowe system () i wyświetla je tylko wtedy, gdy nie jest puste. Zrobiłem to we wtyczkach i działa całkiem dobrze.
garyjohn,
Słusznie. W ogóle nie rozumiem dobrze vimscript, więc po prostu utknąłem w „milczeniu”, aby zobaczyć, czy to zadziała, a kiedy wydawało się, że jest w porządku, po prostu zostawiłem mój .vimrc w ten sposób. Zdecydowanie wolę sporadyczne awarię na utrzymujący się Press ENTER,jednak, więc myślę, że będę albo trzymać się silentlub wykorzystanie call. Jeszcze raz dziękuję za sugestie!
Kyle Strand
0

Upewnij się, że w pliku nie ma niezapisanych zmian, a następnie użyj go cpdo wykonania kopii. Spowoduje to utworzenie kopii z takimi samymi uprawnieniami jak oryginał.

Roland Smith
źródło