Làm cách nào để lưu tệp mà tôi không có quyền ghi?


26

Đôi khi, tôi mở một tệp và thực hiện một số sửa đổi với tư cách là người dùng của mình mà không nhận thấy hoặc "quên" để nhận thấy [read-only]cảnh báo trong dòng trạng thái (ví dụ: một số /etctệp cấu hình ngẫu nhiên như /etc/resolv.conf).

:w!rõ ràng là thất bại trong trường hợp này bởi vì người dùng của tôi không có quyền ghi. Vì vậy, tôi phải :w /home/filename, thoát ra và sudo mv ..., rất khó chịu.

Có cách nào để tôi leo thang tạm thời vào root để có thể lưu tệp hiện đang mở không? (cho tôi đang ở sudoershoặc / và tôi có thể sutrực tiếp)?

Câu trả lời:


24

Mẹo nhỏ là sử dụng một cuộc gọi bên ngoài để sudo:

:w !sudo tee %

Cách thức hoạt động:

  • :w !<command>thực thi <command>với nội dung của bộ đệm là stdin.
  • teesao chép stdin vào một tệp & stdout; %mở rộng thành tên tệp hiện tại ..
  • Bạn tiền tố này sudocho quyền root.

Bạn không thực sự lưu tệp bằng Vim, thay vào đó, bạn đang gọi một chương trình bên ngoài để ghi đè lên nội dung của tệp bạn đang chỉnh sửa. Đây là lý do tại sao bạn sẽ nhận được cảnh báo từ Vim:

W12: Warning: File "xxx" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File: 

Bạn có thể biến điều này thành một chức năng:

fun! SuperWrite()
        write !sudo tee %
        " Or with :silent (but that doesn't seem to work for everyone)
        "silent write !sudo tee %
        edit!
endfun

Và keybind:

nnoremap <Leader>w! :call SuperWrite()<CR>

Với su, chỉ người dùng root mới có thể sử dụng -cđể thực thi ngay lập tức một lệnh. Tôi không nghĩ bạn có thể sử dụng suđể làm điều này, nhưng có lẽ có một mẹo mà tôi không biết ...


SuperWritehoạt động, nhưng nó lặp lại các tập tin trở lại với bạn. Chạy nó :silently có bạn nhập mật khẩu của bạn vô hình.
TankorSmash 23/2/2015

@TankorSmash Cảm ơn; cập nhật câu trả lời. Tuy nhiên, không chắc chắn ý của bạn với "nhập mật khẩu của bạn vô hình"? Thêm silentdường như để làm việc tốt?
Martin Tournoij 23/2/2015

Tôi không chạy vim với sudo, vì vậy có thể đang chơi ở đây, nhưng khi tôi vào sudo tee tệp, nó sẽ nhắc tôi nhập mật khẩu sudo. Nếu nó im lặng, tôi không thấy lời nhắc, nhưng vẫn cần nhập mật khẩu.
TankorSmash

1
Những gì bạn đang thấy là chức năng tiêu chuẩn của tee về tiếng vang đến thiết bị xuất chuẩn cũng như tệp được cung cấp. Một giải pháp là chuyển hướng stdout sang / dev / null, a la: w ! tee % > /dev/null Điều này sẽ vẫn lặp lại kết quả của lệnh (một dòng đơn), nhưng không phải toàn bộ nội dung bộ đệm.
Jon Carter

Thay vì sử dụng teesau đó vứt bỏ đầu ra của nó, bạn cũng sẽ không catlàm việc nếu bạn không muốn tệp được in ra?
Lie Ryan

12

Tôi sử dụng ánh xạ sau trong .vimrc, cái mà tôi thấy hữu ích:

cnoremap w!! w !sudo tee %

Thật dễ nhớ, bởi vì w"write", w!là "force write" và w!!là "super-duper-force write". : P


1
Tôi đã lập bản đồ từ lâu W, nhưng w!!có ý nghĩa hơn nhiều, sẽ cập nhật .vimrc của tôi. Cảm ơn
jalanb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.