Vim의 탭 대 공간 환경 설정


87

Vim은 탭 대와 관련하여 매우 수용 적입니다. 공간 선호도. 내가 알기로 tabstop설정은 탭 문자의 너비를 나타냅니다. shiftwidth설정을 지정 얼마나 많은 열을 증가 / 감소 사용하는 경우 <<>>, 명령을 반면 softtabstop당신이 누를 때 공백의 양을 삽입 할 설정의 영향을 Tab삽입 모드에서 키를 누릅니다. expandtab가 켜져 있으면 탭 키 softtabstop가 공백 문자 수를 삽입 합니다. 와 반면 것은 expandtab압박, 꺼져 Tab키 삽입 탭 + 공백 문자의 가장 작은 수의 일치를 softtabstop. (내가 틀렸다면 정정하십시오.)

이 마지막 요점은 저를 궁금하게 만듭니다. 원하지 않는 실제 사례가 shiftwidth == tabstop && tabstop == softtabstop있습니까? 나는 하나를 생각할 수 없다. 내가 아는 한, 하나의 할당에서이 세 가지 모두를 동일한 값으로 설정할 수 있다면 가장 편리 할 것입니다. 예 : 전화 :

:set stab=4

다음을 실행하는 것과 같습니다.

:set tabstop=4 softtabstop=4 shiftwidth=4 

누구든지 이것이 어떻게 할 수 있는지 제안 할 수 있습니까?


최신 정보

지금까지의 응답을 주셔서 감사합니다 너무 많은 PHP , 홉스kaiser.se . 각각 개별적으로 답변하는 대신 여기에서 질문을 업데이트하겠습니다.

확장 탭이 꺼진 Softtabstop

위에서 확장 탭이 꺼진 상태에서 Tab 키를 누르면 일치하는 탭 + 공백 문자가 가능한 가장 적게 삽입됩니다 softtabstop. 나는 그것을지지하지만 내가 의미하는 바를 설명 할 필요가 있다고 생각한다. 몇 가지 예를 들어 시도해 보겠습니다. 따라하려면 :set list탭 문자를 볼 수 있도록 실행 하십시오.

tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab

삽입 모드에서 Tab 키를 누르면 2 개의 공백 문자가 삽입됩니다. 탭 키를 두 번 누르면 두 개의 공백 문자 (총 4 개의 공백 문자)를 삽입하는 대신 이전 2 개의 공백을 단일 탭 문자로 바꿉니다. Tabstop은 4로 설정되어 있으므로 단일 탭 문자는 4 개의 공백과 동일한 너비를 갖습니다.

tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab

삽입 모드에서 탭 키를 누르면 탭 문자 1 개와 공백 2 개가 삽입됩니다. 탭 문자의 너비는 4이므로 총 너비는 6이며 이는 3 개의 문자를 사용하여 달성됩니다. 탭 키를 두 번 누르면 두 개의 탭 문자가 삽입되고 이전에 삽입 된 두 개의 공백이 제거됩니다. 총 너비는 12이며 이는 3 개의 문자를 사용하여 달성됩니다.

이 두 예제에서 Vim은 softtabstop과 일치하는 최소 가능한 수의 탭 + 공백 문자를 삽입합니다.

expandtab이 꺼진 상태로 작업하는 경우 softtabstop을 tabstop과 다른 값으로 설정하여 얻을 수있는 추가 세부 제어를 원하는 것을 알 수 없습니다. 단일 명령으로 tabstop, softtabstopshiftwidth동일한 값 을 설정할 수 있으면 여전히 유용합니다 .

expandtab을 사용하면 softtabstop이 중복됩니까?

tabstop=4 softtabstop=0 shiftwidth=4 expandtab

삽입 모드에서 Tab 키를 누르면 4 개의 공백이 삽입됩니다. 삭제 키를 누르면 단일 공백이 삭제되므로 실수로 탭 키를 눌렀을 경우 백 스페이스를 4 번해야합니다.

tabstop=4 softtabstop=4 shiftwidth=4 expandtab

삽입 모드에서 Tab 키를 누르면 4 개의 공백이 삽입됩니다. 백 스페이스 키를 누르면 4 개의 공백이 삭제됩니다.

내가 함께 일하고 경우 expandtab스위치, 나는 탭 키 삽입으로 공백의 동일한 금액을 제거하려면 Delete 키를 선호하는 것이다. 따라서이 경우도, 나는 같은 가치 할당 할 수있는 것이 유용 할 수 있다고 생각 tabstop, softtabstop그리고 shiftwidth동시에합니다.

바로 가기는 여전히 유용합니다.

Vim이 너무 많은 유연성을 제공한다는 것은 대단한 일이지만 제 자신이 필요하다고 생각하지 않습니다. 탭의 너비와 탭 문자를 사용하는 '하드'탭인지 공백으로 구성된 '소프트'탭인지를 선택할 수 있기를 원합니다. 하드 탭과 소프트 탭 사이를 전환하는 것은 충분히 쉽지만 ( :set expandtab!), 3 가지 다른 매개 변수를 사용하지 않고 탭 너비를 설정하는 것이 더 간단했으면합니다.

그래서 제가 제안한 제안은 :set stab=4여전히 좋은 것 같습니다 .


여기에 두 개의 다른 질문이있는 것 같습니다. 아마도 질문을 두 개로 분할해야합니다.
Greg Hewgill

네가 옳아! 두 번째 질문을 자체 주제로 옮겼습니다.
nelstrom

1
이것은 질문 이라기보다는 RFE처럼 보입니다. 따라서 VIM 커뮤니티 ( vim.org/community.php)에 제안 하거나 단순히 패치를 작성해야합니다. 그 외에 VIM에는 새로운 작업을 정의 할 수있는 광범위한 매크로 기능이 있으므로 원하는 작업을 수행하는 매크로를 간단히 만들 수 있습니다.
kdgregory

@nelstrom 귀하의 질문 is there a practical case where you wouldn't want shiftwidth == tabstop && tabstop == softtabstop?과 관련하여 Vim의 자체 소스 코드는 set shiftwidth=4 tabstop=8 noexpandtab. 예, 일반적으로 원 shiftwidth == softtabstop하지만 가치 tabstop가 무엇인지와 는 무관 합니다.
jamessan 2014-08-26

답변:


56

stabVim 자체에서 옵션을 만드는 것은 쉽지 않지만,이 명령 / 함수를 만들어 놓을 수 있습니다 .vimrc(또는 매우 체계적인 경우 플러그인 파일). 사용 :Stab하면 들여 쓰기 수준과 사용 여부를 묻는 메시지가 표시됩니다.expandtab . 새 들여 쓰기 수준을 제공하지 않고 Enter 키를 누르면 현재 설정 만 인쇄됩니다.

"이 모든 것을 .vimrc 또는 플러그인 파일에 넣으십시오.
명령! -nargs = * Stab 호출 Stab ()
함수! 찌르다()
  let l : tabstop = 1 * input ( 'set shiftwidth =')

  l : tabstop> 0 인 경우
    "우리도 expandtab을 원합니까?
    let l : expandtab = confirm ( '확장 탭 설정?', "예 \ n 아니요 \ n 취소")
    l : expandtab == 3 인 경우
      "중단?
      반환
    endif

    let & l : sts = l : tabstop
    & l : ts = l : tabstop
    let & l : sw = l : tabstop

    l : expandtab == 1 인 경우
      setlocal expandtab
    그밖에
      setlocal noexpandtab
    endif
  endif

  "선택한 옵션 표시
  시험
    echohl ModeMsg
    echon 'set tabstop ='
    echohl 질문
    에코 & l : ts
    echohl ModeMsg
    echon 'shiftwidth ='
    echohl 질문
    echon & l : sw
    echohl ModeMsg
    echon 'sts ='
    echohl 질문
    echon & l : sts. ''. (& l : et? '': '아니요')
    echohl ModeMsg
    'expandtab'을 에코
  드디어
    echohl 없음
  endtry
끝 기능

3
스크립트 주셔서 감사합니다! 내가 요청한 것보다 더 많은 기능을 수행합니다. 확장 탭을 유지하고 싶지만 원하는대로 쉽게 사용자 지정할 수 있습니다. Vimscript에서 소규모 단기 집중 강좌를 제공 하셨기 때문에 매우 감사합니다. 100 포인트 현상금은 귀하의 것입니다!
nelstrom

9

이것이 VimScript를 작성하는 첫 번째 시도입니다.

function! Stab(value)
    let &shiftwidth  = a:value
    let &softtabstop = a:value
    let &tabstop     = a:value
endfunc

이것을 .vimrc 파일에 넣으면를 실행하여 호출 할 수 있습니다 :call Stab(X). 여기서 X는 원하는 탭 너비입니다. 이것은 현재로서는 적절한 해결책이지만 누구든지 쉽게 전화 할 수있는 방법을 제안 해 주시면 감사하겠습니다.

또한 ctrl-Tab에 매핑 한 현재 설정을 빠르게 요약하는 함수를 만들었습니다.

nmap <C-Tab> :call TabParams()<CR>
function! TabParams()
    echo "tabstop:     ".&tabstop
    echo "shiftwidth:  ".&shiftwidth
    echo "softtabstop: ".&softtabstop
endfunc

글쎄요, 저는이 답변에 대해 100 점의 현상금을 올렸고, 이제 제가 절반을 직접 해결했습니다. 내 대답을 받아 들일 수 있을지 모르겠습니다 ...


+1 예,하지만 이것이 정말로 원하는 것이라면 여전히 괜찮은 대답입니다.
DaveParillo

2
let & l : shiftwidth 등을 사용하여 로컬 버전을 설정하고 싶을 것입니다.
SystemParadox

7

편집 모드에서를 사용 하여 , 또는 설정에 관계없이에서 설정 한대로 다음 들여 쓰기 수준으로 Ctrl-T들여 쓰기 및 Ctrl-D내어 쓰기 할 수도 있습니다 . Vim은 자동으로 공백이나 탭을 추가 / 제거하여 오른쪽 열로 이동합니다.shiftwidthtabstopsofttabstopexpandtab

Tab/ 대신 이러한 명령을 사용하여 들여 쓰기를 제어 Backspace하면 이러한 모든 탭 설정이 함께 맞춰지는 것에 대해 걱정할 필요가 없으며 항상 올바른 들여 쓰기 수준에 도달합니다.


3

expandtab가 설정 되면 (너무 많은 PHP가 지적한 것처럼) softtabstop중복됩니다. 당신이 shiftwidth다르게 설정할 수있는 유일한 이유 tabstop는 이상한 습관에 맞추는 것입니다. 예를 들어, 4 개의 공백 들여 쓰기를 사용하지만 tab8 개의 공백을 삽입 하는 것을 선호 합니다.

expandtab설정되지 않으면 상황이 더 모호해집니다. catvim 에서와 같이 vim이 아닌 편집기 에서 코드를 동일하게 보이게하려면 tabstop항상 8로 설정해야합니다. 이 경우 softtabstopshiftwidth둘 다 원하는 들여 쓰기 수준으로 설정합니다. 대신 파일의 모든 "물리적 탭"이 하나의 들여 쓰기 수준을 나타내는 것을 선호하는 경우, 선호하는 들여 쓰기 수준을 설정 tabstop하고 0으로 shiftwidth둡니다 softtabstop(다음과 동일하게 설정하는 tabstop것은 변경 tabstop하면 동기화되지 않는다는 점만 제외 하면 동일 합니다. 0은 "무시하십시오"를 의미합니다).


3
softtabstop올바른 값으로 만 설정하면 탭 인 것처럼 공백 들여 쓰기가 삭제 되기 때문에 이것이 잘못되었다고 생각합니다 . 건전한 사용을위한 필수품입니다.
u0b34a0f6ae

2

여러분의 이해 softtabstopexpandtab잘못된합니다 - 그래서 stab당신이 제안하는 옵션이 매우 유용하지 않을 것입니다.

expandtab모든 것에 탭 대신 공백을 사용하려는 경우 입니다. 를 설정하면 expandtab, 다음 빔은 무시 softtabstop옵션을 사용 tabstop하고 shiftwidth삽입하는 방법에 많은 공간을 해결해야합니다.

softtabstop탭과 공백을 혼합 하여 사용하고 싶을 때만 사용할 수 있습니다. 텍스트가 다른 응용 프로그램에 표시되도록 탭 너비를 더 높은 값 (일반적으로 8)으로 유지하면서 미세 제어 (2 또는 4 공백)로 들여 쓰기 할 수 있습니다. . softtabstop=tabstopVim은 항상 들여 쓰기에 탭을 사용하기 때문에 설정 은 아무 것도 수행하지 않습니다.

업데이트 : 마찬가지로 kaizer.se는 지적 아웃이 당신이 사용하는 경우 expandtab, 당신은 여전히 설정해야합니다 softtabstop당신은 그들이 탭있는 것처럼 여러 공간을 백 스페이스 빔을 원하는 경우.


당신이 바로 것을있는 동안 tabstopsofttabstop때 하나 개의 변수가 너무 많은이 될 extpandtab집합입니다, 당신은 우선 순위에있어 잘못된 생각합니다. 시도해보십시오 : 설정 ts=8 sts=4 et하고 탭을 누르십시오. 커서는 5 열에 있고를 설정 한 것처럼 4 개의 공백이 삽입됩니다 ts=4 sts=0 et.
hobbs

5
softtabstop올바른 값으로 만 설정하면 탭 인 것처럼 공백 들여 쓰기가 삭제 되기 때문에 이것이 잘못되었다고 생각합니다 . 건전한 사용을위한 필수품입니다.
u0b34a0f6ae

2

공백 설정을 너무 자주 변경하여 관리하는 기능이 정말로 필요합니까? tabstop을 많이 엉망으로 만들고 expandtab을 설정하는 경우 다른 값이 전달 된 파일을 변경할 때 시간이 지남에 따라 엉망이 될 것 stab입니다. 오늘은 :call stab (4), 내일은 :call stab (2), 지난 주에는 :call stab (8). 글을 써도 곧 사용을 중단 할 것 같네요.

항상 동일한 값을 stab에 전달할 계획이라면 전역 설정을 편집하지 않는 이유는 무엇입니까? Vim에서 :

:e $MYVIMRC

다음을 추가하십시오.

set tabstop=4
set shiftwidth=4  "tabs are 4 spaces wide (default = 8)
set expandtab     "Convert tabs to spaces

이것이 내 .vimrc가 설정되는 방법입니다.


1

한 가지 유용한 옵션은 softtabstop=-1값을로 설정하는 것입니다 shiftwidth. 0으로
설정할 수도 있으며이 shiftwidth경우 tabstop값이 사용됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.