vim 편집기 let
와 차이점은 무엇입니까 set
?
나는 항상 왜 둘 다 존재하는지 궁금했습니다.
또한 역사적 배경을 듣고 싶습니다.
답변
:set
설정하기위한 옵션을 , :let
(A)에 값을 할당하는 변수 .
옵션의 값은 앞에 붙은 옵션의 이름에 연결됩니다 &
(이 &option-name
구문은 “일반적인”변수와 매우 유사하게 동작합니다). 따라서 다음은 동일합니다.
:set tw=40
:let &tw=40
그러나 예를 들어 전역 변수 foo ( :let g:foo=50
)에 50을 할당하는 것은 :set
명령 으로 수행 할 수 없습니다 (g : foo는 변수이며 옵션이 아니기 때문).
일부 옵션은 부울과 같습니다. 이들을 설정할 때 값이 필요하지 않습니다 ( :set noic
및 반대 :set ic
).
답변
옵션은 옵션에 특화된보다 사용자 친화적 인 인터페이스입니다
예 :
:verbose set
유효한 모든 옵션을 표시합니다.
:set tw=40
속기의 역할을합니다 set textwidth=40
:set wrap&
옵션 의 기본값을 설정합니다wrap
:set nowrap
옵션을 해제합니다
:set wrap!
윌 전환 옵션을
가장 중요한 것은,
:set
Tab # 탭 완성을 얻으려면!
로 쉽게 위의 몇 가지를 달성 할 수 있습니다 let
.
답변
:set
옵션으로 만 작동하며 sehe의 답변 은 좋은 사용법 예제를 보여줍니다.
:let
반면에 할 수있는 거의 모든 것을 :set
할 수 있습니다. 값을 할당 할 수 있습니다
- 변수, 예를 들어
let vi = 'vim'
- 옵션, 예 :
let &tw = 40
- 레지스터, 예.
let @a = $HOME . '/vimfiles'
- 환경 변수, 예.
let $NOTHING = 'NOTHING'
또 다른 주요 차이점은 오른쪽 :let
이 표현식 이라는 점입니다. 즉, 위의 레지스터 예제에서 볼 수 있듯이 문자열 연결 및 산술 연산 (예 :)과 같은 작업을 수행 할 수 있습니다 let &tw = 40 + 60
. 또한 문자열 인 경우 값을 인용해야합니다. :set
반면에 값을 그대로 읽습니다.
대부분의 작업을 수행 할 수도 :set
있지만 옵션과 함께 사용 하는 것이 더 쉽습니다 :let
. 다음은 sehe의 예제를 사용한 비교입니다 ( “n / a”는이를 수행 할 방법이 없음을 의미합니다 :let
)
:verbose set
vs n / a (모든 옵션을 나열하는 다른 방법이 있다고 생각하지 마십시오):set tw=40
vs:let &tw = 40
(예, 같은 속기를 사용할 수도 있습니다let
):set wrap&
vs 해당 없음:set nowrap
vs:let &wrap = 0
(부울 옵션의 경우 0은 false이고 1은 true):set wrap!
vs:let &wrap = !&wrap
몇 가지 예
- 옵션의 값을 인쇄 :
:set formatoptions?
vs:echo &formatoptions
(let
와 달리 값을 인쇄하지 않습니다set
) -
여러 옵션에 동시에 할당 :
:set et sw=4 sts=4
vs
:let [&et, &sw, &sts] = [0, 4, 4]
-
전역 옵션 설정 :
setglobal et
vslet &g:et = 1
- 로컬 옵션 설정 :
setlocal et
vslet &l:et = 1
자세한 내용 :h :set
및 :h :let
참조
tl; dr
:set
옵션으로 만 작동하지만 구문이 훨씬 간단합니다. :let
옵션뿐만 아니라 변수, 레지스터 및 환경 변수와도 작동합니다. 와 달리 :set
오른쪽 :let
은 표현식입니다.
답변
사람들이 작성한 것에 대해 확장 :let
하면서 변수의 값을 옵션에 할당하는 데 사용할 수 있지만 무언가 :set
할 수 없다는 것을 알았습니다 . 예를 들어,이 기능을 사용하여 let
전역 변수의 값을 할당 orig_tw
받는 textwidth
옵션 :
" Toggle Autowrap
" Default of 72 but can be overridden by tw settings in other vimrc files
let g:orig_tw = 72
function Toggle_autowrap_mode()
if &textwidth == 0
" Must use let instead of set here in order for g:orig_tw to be
" evaluated properly
let &textwidth = g:orig_tw
echo "Autowrap mode on tw=" . &textwidth
else
let g:orig_tw = &textwidth
set textwidth=0
echo "Autowrap mode off tw=" . &textwidth
endif
endfunction
noremap _A :call Toggle_autowrap_mode()<CR>
답변
매우 간단합니다.
사람들이 말했듯 set
이 옵션에 대한 것이며 제한 때문에 더 잘 작동합니다. 또한 set
모든 버전의 vi
옵션을 설정하는 데 사용 되는 기록 명령도 있습니다. 대부분의 (모든?) 다른 버전에는 vi
없습니다 let
.
그러나 아마도 가장 중요한 점이다 set
의 모든 버전에 작품 vim
의 let
명령을 생략 할 수는 컴파일 할 때 vim
. 표준 tiny
및 small
빌드가이를 수행합니다.
누락 된 경우 let
오류가 발생합니다.
E319: Sorry, the command is not available in this version
참고 : if
및 endif
구현되지 vim.tiny
않았지만이 경우 명령에 오류가 발생하지 않고 대신 두 명령 사이의 모든 항목이 건너 뜁니다 else
.
답변
