나는 vim의 최신 버전을 설치하고 그에 대한 별칭을 설정했으며 해당 버전을 호출하도록 별칭 vim을 설정했습니다.
또한 sudo로 파일을 편집해야 할 때 시스템의 기본 vi를 호출할 수 있도록 sudo에 별칭을 지정했지만 여기에는 두 가지 문제가 있습니다. 주로 vi의 시스템 버전에는 구문 강조 기능이 없습니다. 때로는 파일을 vim하고 파일이 활성화된 동안 몇 가지 작은 테스트를 수행하고 싶지만 vim을 종료하고 vi로 이동해야 하는데 이는 단지 느린 작업 흐름입니다.
내가 찾은이 링크이것은 vim에서 현재 구문 강조를 유지하고 특수 명령을 사용하여 파일을 sudo로 저장할 수 있는 멋진 sudo 핵을 설명합니다.
cnoremap w!! w !sudo /usr/bin/tee > /dev/null %
정말 잘 작동하지만 문제가 발생했습니다.
명령을 실행하면 항상 이 출력이 표시됩니다.
:w !sudo /usr/bin/tee > /dev/null %
W12: Warning: File "../lid.sh" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File:
보기:도움말 W12 내용:
Warning: File "{filename}" has changed and the buffer was changed in Vim as well
Like the above, and the buffer for the file was changed in this Vim as well.
You will have to decide if you want to keep the version in this Vim or the one
on disk. This message is not given when 'buftype' is not empty.
자동 읽기 도움말 내용:
"자동 읽기" '아르' '자동으로 읽지 않음' '노알''autoread' 'ar' 부울(기본값) 전역 또는 로컬 buffer|global-local| 파일이 Vim 외부에서는 변경되었지만 Vim 내부에서는 변경되지 않은 것이 감지되면 자동으로 파일을 다시 읽습니다. 파일이 삭제되면 이 작업이 수행되지 않습니다. |Timestamp| 이 옵션에 로컬 값이 있으면 이 명령을 사용하여 전역 값을 사용하도록 다시 전환하세요: > :set autoread<
내 .vimrc에 있지만 :set autoread
작동하지 않는 것 같습니다. 매번 파일을 다시 로드할 수 있는지 묻는 메시지가 계속 나타납니다.
매번 수동으로 수락하지 않고 파일을 다시 로드하도록 어떻게 선택할 수 있습니까? 타이핑: 와! ! 꼭 필요한 경우가 아니면 하지 않을 만큼 긴 명령입니다.
답변1
이것을 vimrc 파일에 추가하여 문제를 해결했습니다.
cnoremap w!! call SudoSaveFile()
function! SudoSaveFile() abort
execute (has('gui_running') ? '' : 'silent') 'write !env SUDO_EDITOR=tee sudo -e % >/dev/null'
let &modified = v:shell_error
endfunction
답변2
현상금과 함께 허용되는 답변이 잘못되었습니다. 경고 때문에 문제가 전혀 해결되지 않습니다.W12함수가 반환된 후에 발생합니다.
문제는 다음과 같습니다문서질문에 인용됨(내용감한):
autoread' 'ar' 'noautoread' 'noar' 'autoread' 'ar'
부울(기본값 설정) 전역 또는 로컬 버퍼 |global-local|Vim 외부에서 파일이 변경된 것으로 감지되어 해당 파일이 변경된 경우아니요Vim 내부에서 무언가 변경되면 자동으로 다시 읽혀집니다.
이것은 의미한다,자동 읽기옵션 주소만W11경고하다.
이 문제를 해결하기 위해 해결책, 임시 변경 사항 등을 찾으려고 오랜 시간을 보냈지만 buftype
결과는 매우 간단했습니다.
cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!
이는 저장 후 파일을 강제로 다시 로드함을 의미합니다. 이렇게 하면 파일이 이제 버퍼와 동일하므로 경고가 발생하지 않습니다.
- 어떤 방법을
autoread
선택하든 이 솔루션은 효과적입니다. 나는 내 것을 좋아noautoread
하므로 변경 사항을 버릴지 여부를 알고 있습니다.
<CR>
끝에 " "를 추가할 수 있습니다.
cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!<CR>
또는 다음과 같은 기능을 원하는 경우:
cnoremap w!! call SudoWriteBangBang()<CR>
function! SudoWriteBangBang()
execute 'silent! write !sudo tee % >/dev/null' <bar> edit!<CR>
endfunction
하지만 나는 명령을 즉시 완료하는 것을 좋아하지 않습니다. 결정을 내리기 전에 명령을 다시 볼 기회가 없습니다 <CR>
. 또한 설명서 :w
도 기대하기 때문에 및 동작을 더 잘 모방합니다 .:w!
<CR>