Сохранять биты прав доступа при записи нового файла с VIM

8

В Vim, когда я записываю копию текущего буфера в новый файл, используя :w [filename], кажется, что Vim использует права доступа к файлу по умолчанию (т.е. устанавливаемые с помощью umask или чего-либо еще) для нового файла. Если текущий буфер был загружен из существующего файла, то не должно ли «правильное» поведение дублировать разрешения из этого файла? Например, если я редактирую исполняемый файл и пишу новую копию файла, почему Vim не пишет новый исполняемый файл ? Есть ли способ заставить Vim вести себя так, как я описываю, кроме как делать что-то вроде ! chmod --reference % [newfilename]после написания нового файла?

Кайл Стрэнд
источник
Возможно связано: unix.stackexchange.com/q/58880/22703
allquixotic
Я думаю, что ответ уже в вопросе - вы должны сделать макрос или связывание клавиш, которое сделает это chmodза вас. AFAIK, vim не имеет этого встроенного.
Кевин Панко

Ответы:

3

Вы могли бы сделать что-то вроде этого. Во-первых, запишите имя исходного файла.

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

Затем при сохранении нового файла измените его разрешения так же, как и у исходного файла.

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

Просто поместите обе эти автокоманды в ваш ~ / .vimrc.

garyjohn
источник
Этот ответ потрясающий, но у меня есть одно предложение: изменить и echo system(т. silent echo system(Д. На т. Д. Это позволяет избежать зависания «нажмите ENTER для продолжения».
Кайл Стрэнд
@KyleStrand: Я мог бы и раньше call system(...ничего не печатать на дисплей, но я пытался избежать проблемы с тем, что команда молча не работает. Если вы не думаете, что он когда-нибудь потерпит неудачу или скорее будет жить со случайной неудачей, чем с досадой Press ENTER..., то я согласен с вашим предложением. Тем не менее, я думаю, что лучшим решением было бы написать функцию, которая фиксирует выходные данные system () и отображает их только в том случае, если она не пустая. Я сделал это в плагинах, и это работает довольно хорошо.
garyjohn
Справедливо. Я не очень хорошо понимаю vimscript, поэтому я просто застрял в «молчании», чтобы посмотреть, сработает ли он, и когда все прошло нормально, я просто так и оставил свой .vimrc. Я определенно предпочел бы случайный отказ постоянному Press ENTER,, поэтому я думаю, что я буду либо придерживаться, silentлибо использовать call. Еще раз спасибо за предложения!
Кайл Стрэнд
0

Убедитесь, что в файле нет несохраненных изменений, а затем используйте его cpдля создания копии. Это приведет к копии с теми же разрешениями, что и оригинал.

Ролан Смит
источник