Блокировка изменений только для чтения файла

14

При использовании Vim для редактирования файла только для чтения он просто выдаст предупреждение при первом редактировании, но разрешит любые изменения. Я понимаю, что такое поведение может быть полезно для кого-то, намеревающегося сохранить файл под другим именем; но я иногда открываю файлы, к которым у меня нет прав на запись, затем забываю и делаю изменения.

Можно ли войти в режим, в котором Vim разрешит просмотр файла, но заблокирует любой параметр, который вносит изменения?

ZeroKelvinKeyboard
источник

Ответы:

13

Я нашел решение. Настройка nomodifiableпредотвращает редактирование файла (как используется в окнах справки). Я создал простую функцию для установки или сброса в modifiableзависимости от того, установлен ли readonlyон, и прикрепил ее к autocmd.

" Don't allow editing of read only files
autocmd BufRead * call RONoEdit()

function! RONoEdit()
  if &readonly == 1
    set nomodifiable
  else
    set modifiable
  endif
endfunction
ZeroKelvinKeyboard
источник
4
Вы можете сделать его короче, сделав:let &modifiable = !&readonly
Мартин Турной
@Carpetsmoker Гораздо лучше, как один лайнер, спасибо! Однако это все равно должно быть: autocmd BufRead * let &modifiable = !&readonly
ZeroKelvinKeyboard
При этом после открытия readonlyфайла и создания нового буфера новый буфер заканчивается nomodifiable.
Праксеолит
Спасибо за указание на это, я не заметил. Я не уверен, как проверить новый буфер.
ZeroKelvinKeyboard
1
@Praxeolitic: Я только что опубликовал ответ, который должен решить эту проблему, дайте мне знать, если он работает.
s4y
7

Добавьте это к вашему .vimrc:

autocmd BufRead * let &l:modifiable = !&readonly
s4y
источник
Это основано на ответе @ ZeroKelvinKeyboard и влияет только на текущий буфер.
s4y
0

Поскольку приведенные выше ответы верны, необходимо принять во внимание еще одну вещь: пока файл «только для чтения», не должно быть никакого способа изменить содержимое файла, если вы не являетесь владельцем файла или имеют право сделать этот файл доступным для записи. И даже тогда vim не записывает изменения в файл, если вы явно не переопределите состояние «только для чтения» с помощью «: w!».

Если вы на самом деле можете редактировать файл, который должен быть только для чтения, вы можете перепроверить права, возможно, неверная конфигурация безопасности. Если вы только сделаете vim неспособным отредактировать файл, другие способы редактирования все еще будут на месте, поэтому, если файл не должен быть изменен, у него должны быть правильно установлены права. В Windows вы можете заставить файл быть доступным только для чтения, явно отказав всем в праве на изменение, в Linux вы можете использовать расширенный атрибут «неизменный» (chattr + i).

Mikky
источник
2
Извините, если мне было не очень понятно. Этот вопрос был не о случайном изменении файла только для чтения; Я хотел помешать себе редактировать буфер файла, для которого у меня не было прав на запись. Иногда я случайно открываю файлы конфигурации системы как обычный пользователь, а не как пользователь root. В этом случае у меня нет прав на запись в файл, поэтому буфер отображается только для чтения, но Vim все еще позволяет мне редактировать буфер. Когда я пытаюсь сохранить, я не могу, потому что у меня нет прав на запись. В этом случае я хотел, чтобы Vim блокировал изменения в буфере.
ZeroKelvinKeyboard
Ах я вижу. Мне пришла в голову мысль, что вы хотели это как отказоустойчивый. Не
обращайте
OP означает, что когда кто-то открывает в ОС файл, недоступный только для чтения, но он / она в настоящее время не хочет (или считает целесообразным) внести изменения и хочет ограничиться этим, он этого не делает. Я думаю точно так же, поэтому собираюсь сюда от Google!
Виолаптерин