Vimscript에서 OS 감지


37

순수 Vimscript (Python 또는 Perl 없음 )를 사용하여 현재 운영 체제 (Windows, Linux, OS X, ..)를 검색 할 수 있습니까 ?

사용 중인 다른 유형의 운영 체제에 대해 (동기화 된) .vimrc 에서 다른 설정을 사용하려고합니다 .


구현하려는 OS 종속 동작의 특정 예를 제공 할 수 있습니까?
200_success

@ 200_success Windows 이외의 환경에서는 쓸모가없는 MS TFS 및 msbuild에 대한 일부 스크립트 및 키 바인딩 이 있지만 Windows의 gVim에서 tmux 지원은 필요하지 않습니다 . 또한 시스템마다 다른 글꼴이 설치되어 있으며 경로도 다를 수 있습니다.
muffel

답변:


42

가장 좋은 방법은을 사용하는 것 has()입니다.이 기능 을 사용 하면 Vim의 기능을 확인할 수 있습니다. OS 별 기능 :help feature-list:

macunix                 Macintosh version of Vim, using Unix files (OS-X).
unix                    Unix version of Vim.
win32                   Win32 version of Vim (MS-Windows 95 and later, 32 or
                        64 bits)
win32unix               Win32 version of Vim, using Unix files (Cygwin)

그리고 더 오래된 (반더 이상 사용되지 않는) 시스템들 :

amiga                   Amiga version of Vim.
os2                     OS/2 version of Vim.
win16                   Win16 version of Vim (MS-Windows 3.1).
win64                   Win64 version of Vim (MS-Windows 64 bit).
win95                   Win32 version for MS-Windows 95/98/ME.

예:

if has('win32')
    echo "Someone please open the Window(s)!"
endif

유연성이 더 높은 대체 방법은 external을 호출하는 것입니다 uname. 이렇게하면 버전 번호 등을 얻을 수도 있습니다.

let uname = system('uname -a')

참고 uname대부분의 Windows 시스템에 존재하지 않습니다.

일반적으로 OS 감지 보다는 기능 감지 를 사용하는 것이 가장 좋습니다 . 예를 들어 기능 중 하나를 사용 하거나 일부 경로가 있는지 확인합니다. 200_success 'post그에 대한 좋은 개요를 제공하므로 여기서는 동일한 내용을 반복하지 않겠습니다.has()


5
그러나 OS X에서 작동하려면 romainl의 답변 을 주목하는 것이 매우 중요합니다 .
Rich

포인터에 +1:h feature-list
JESii

23

has()좋은 아이디어 같은 소리 당신은 맥 OS X에 그것을 시도 때까지 기본에 /usr/bin/vim, has('unix')이다 사실 이지만 모두 has('macunix')하고 has('mac')있는 거짓 일반 MacVim 다운로드에, 세 가지가 있으며, 반면 사실 은 GUI 또는 TUI를 사용하는지 여부.

따라서 최상의 솔루션은 has('winXX')Windows와 uname유닉스 계열 시스템 의 혼합입니다 . 출력은 uname개행 으로 끝나므로 사용하기 전에 청소해야합니다.

다음은 한동안 사용했던 코드입니다 win64.

if !exists("g:os")
    if has("win64") || has("win32") || has("win16")
        let g:os = "Windows"
    else
        let g:os = substitute(system('uname'), '\n', '', '')
    endif
endif

그 후에는 g:os어디서나 변수를 사용할 수 있습니다 vimrc.

if has("gui_running")
    if g:os == "Darwin"
        set guifont=Fira\ Mono:h12
    elseif g:os == "Linux"
        set guifont=Fira\ Mono\ 10
    elseif g:os == "Windows"
        set guifont=Fira_Mono:h12:cANSI
    endif
endif

글쎄, OSX는 UNIX 시스템입니다. 심지어 "인증 된 UNIX"라고 생각합니다. 그래서 has('unix')정확합니다. 그러나 has('macunix')거짓 인 것은 이상하다. 이것은 거의 버그처럼 들립니까?
Martin Tournoij

1
나는 몇 가지 검사를했고, has('macunix')에 따라 달라 보인다 MACOS_X_UNIX경우 세트 인 uname이다 Darwinconfigure... 스크립트
마틴 Tournoij

이상하게도 has ("win32")64 비트 Vim에서도 나를 위해 작동하는 것 같습니다.
Rich

@Rich 그렇습니다. 이것은 정말로 제정신 일입니다. 앱이 32 또는 64 비트인지 걱정하십니까? 난 아니야 그것이 'win32'라고 불리는 이유는 이것이 Microsoft가 Windows NT API로 선택한 이름이기 때문입니다. 이름을 지정하는 것은 Microsoft의 장점이 아닙니다 .
Martin Tournoij

1
has('unix')Windows Git Bash에서도 마찬가지이므로 실제 유닉스를 에뮬레이트 된 것과 구별하는 데별로 유용하지 않습니다.
wisbucky 2016 년

8

환경 변수가 유용 할 것입니다.

감지하려면 또는을 tmux확인할 수 있습니다 .if !empty($TMUX)if $TERM == 'screen'

또한 같은 환경 변수의 운영체제 추론 할 $MACHTYPE( 배시에 의해 설정된다 ) 또는 $PATH.

TFS와 같은 기능이 설치되어 있는지 감지하려면이 기능을 사용할 수 있습니다 executable().


"$ MACHTYPE (Bash에 의해 설정 됨)" . 실제로 변수가 Bash에 의해 설정되면 환경 변수가 아니며 단순히 vim을 사용하여 변수에 액세스 할 수 없습니다 $MACHTYPE. let machtype=system('echo -n $MACHTYPE')먼저 같은 것을해야합니다 .
wisbucky 2016

4

다른 사람들이 이미 지적했듯이 신뢰할만한 탐지는 까다로울 수 있습니다. 내가 언급하고 싶은, 그래서 더 나은, 바퀴를 재발견하지 VIM-기타 라이브러리를 제공하는, xolox#misc#os#is_mac()xolox#misc#os#is_win()기능.


1

나는 시도 has('unix')했지만 모든 Linux, Mac 및 Windows Git Bash가 반환했기 때문에 도움이되지 못했습니다 true.

uname너무 세분화되지 않고 Linux, Mac, Windows를 구별하기 때문에 적합하다는 것을 알았 습니다.

let uname = substitute(system('uname'), '\n', '', '')
" Example values: Linux, Darwin, MINGW64_NT-10.0, MINGW32_NT-6.1

if uname == 'Linux' || uname == 'Darwin'
    " do linux/mac command
else " windows
    " do windows command
endif
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.