[vim] Vim : let과 set의 차이점은 무엇입니까?

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!

전환 옵션을

가장 중요한 것은,

:setTab # 탭 완성을 얻으려면!

로 쉽게 위의 몇 가지를 달성 할 수 있습니다 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=40vs :let &tw = 40(예, 같은 속기를 사용할 수도 있습니다 let)
  • :set wrap& vs 해당 없음
  • :set nowrapvs :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 etvslet &g:et = 1

  • 로컬 옵션 설정 : setlocal etvslet &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의 모든 버전에 작품 vimlet명령을 생략 할 수는 컴파일 할 때 vim. 표준 tinysmall빌드가이를 수행합니다.

누락 된 경우 let오류가 발생합니다.
E319: Sorry, the command is not available in this version

참고 : ifendif구현되지 vim.tiny않았지만이 경우 명령에 오류가 발생하지 않고 대신 두 명령 사이의 모든 항목이 건너 뜁니다 else.


답변