Vim 질문입니다

안녕하세요~!!!

리눅스에 대해 차차 알아가고 있습니다~~ 여기있는 고수님들 덕분에~!!

저 그런데… vim에 문제가 있는것은 아니구요… 좀 더 원활한 작업을 위해서 구문강조 파일을 제가 만들어 vim에 적용하고 싶어서 이렇게 질문을 올립니다.

이를테면, 확장자가 .vfl이면… vi [파일이름].vfl 로 파일을 만들면 제가 만든 구문강조가 적용되게 하고 싶습니다.

어디서 어떻게 하면 좋을까요…?

vim에서 설정파일은 $HOME/.vimrc입니다.
문법강조를 위한 선결조건으로 syntax on 명령이 필요한데…
기본적으로 설정되어 있을 것입니다.

이제 문법강조만 만들면 되는데, 문법강조파일을 만드는 방법은
길기 때문에, 생략합니다… 인터넷에서 검색을 해보세요.

일단 문법강조파일을 만드셨다면…
$HOME/.vim/syntax/강조유형.vim로 저장하시면 됩니다.
여기서 강조유형은 보통확장자로 되지만, 예를들어 도스배치파일은
강조유형이 dosbatch입니다.

이런강조유형을 따로 설정하시려면… vimrc에서
au BufRead,BufNewFile *.확장자 set filetype=강조유형
이런식으로 설정하시면 됩니다.

그리고, 해당 문법을 사용하는 새파일 생성시 템플릿 로드는…
$HOME/.vim/skel/tmpl.확장자
이렇게 파일을 만드시면 됩니다.

하지만, 확장자를.sh.cmd 이런식으로 사용하시려면
$HOME/.vimrc에서
au BufNewFile *.확장자 r 템플릿파일위치

문법강조파일을 직접제작 하시려면, 다음 코드를 참조하세요

[code:6xesep05]" Vim syntax file
" Language: MSDOS batch file (with NT command extensions)
" Maintainer: Mike Williams <mrw@eandem.co.uk>
" Filenames: *.bat
" Last Change: 6th September 2009
" Web Page: http://www.eandem.co.uk/mrw/vim
"
" Options Flags:
" dosbatch_cmdextversion - 1 = Windows NT, 2 = Windows 2000 [default]
"

" For version 5.x: Clear all syntax items
" For version 6.x: Quit when a syntax file was already loaded
if version < 600
syntax clear
elseif exists("b:current_syntax")
finish
endif

" Set default highlighting to Win2k
if !exists("dosbatch_cmdextversion")
let dosbatch_cmdextversion = 2
endif

" DOS bat files are case insensitive but case preserving!
syn case ignore

syn keyword dosbatchTodo contained TODO

" Dosbat keywords
syn keyword dosbatchStatement goto call exit
syn keyword dosbatchConditional if else
syn keyword dosbatchRepeat for

" Some operators - first lot are case sensitive!
syn case match
syn keyword dosbatchOperator EQU NEQ LSS LEQ GTR GEQ
syn case ignore
syn match dosbatchOperator "\s[-+*/%!~]\s"
syn match dosbatchOperator "="
syn match dosbatchOperator "[-+*/%]="
syn match dosbatchOperator "\s(&|||^|<<|>>)==\s"
syn match dosbatchIfOperator "if\s+((not)=\s+)=(exist|defined|errorlevel|cmdextversion)="lc=2

" String - using "'s is a convenience rather than a requirement outside of FOR
syn match dosbatchString "&quot;[^"]&quot;" contains=dosbatchVariable,dosBatchArgument,dosbatchSpecialChar,@dosbatchNumber,@Spell
syn match dosbatchString "&lt;echo([^)>|]|^@<=[)>|])
"lc=4 contains=dosbatchVariable,dosbatchArgument,dosbatchSpecialChar,@dosbatchNumber,@Spell
syn match dosbatchEchoOperator "&lt;echo\s+(on|off)\s*$"lc=4

" For embedded commands
syn match dosbatchCmd "(\s*‘[^’]*'"lc=1 contains=dosbatchString,dosbatchVariable,dosBatchArgument,@dosbatchNumber,dosbatchImplicit,dosbatchStatement,dosbatchConditional,dosbatchRepeat,dosbatchOperator

" Numbers - surround with ws to not include in dir and filenames
syn match dosbatchInteger "[[:space:]=(/:,!~-]\d+"lc=1
syn match dosbatchHex "[[:space:]=(/:,!~-]0x\x+"lc=1
syn match dosbatchBinary "[[:space:]=(/:,!~-]0b[01]+"lc=1
syn match dosbatchOctal "[[:space:]=(/:,!~-]0\o+"lc=1
syn cluster dosbatchNumber contains=dosbatchInteger,dosbatchHex,dosbatchBinary,dosbatchOctal

" Command line switches
syn match dosbatchSwitch "/(\a+|?)"

" Various special escaped char formats
syn match dosbatchSpecialChar "^[&|()<>^]"
syn match dosbatchSpecialChar "$[a-hl-npqstv_$+]"
syn match dosbatchSpecialChar "%%"

" Environment variables
syn match dosbatchIdentifier contained "\s\h\w*&gt;"
syn match dosbatchVariable "%\h\w*%"
syn match dosbatchVariable "%\h\w*:*=[^=]=[^%]%"
syn match dosbatchVariable "%\h\w*:~[-]=\d+(,[-]=\d+)=%" contains=dosbatchInteger
syn match dosbatchVariable "!\h\w*!"
syn match dosbatchVariable "!\h\w*:*=[^=]=[^!]!"
syn match dosbatchVariable "!\h\w*:~[-]=\d+(,[-]=\d+)=!" contains=dosbatchInteger
syn match dosbatchSet "\s\h\w*[±]=={-1}" contains=dosbatchIdentifier,dosbatchOperator

" Args to bat files and for loops, etc
syn match dosbatchArgument "%(\d|*)"
syn match dosbatchArgument "%[a-z]&gt;"
if dosbatch_cmdextversion == 1
syn match dosbatchArgument "%~[fdpnxs]+(($PATH:)=[a-z]|\d)&gt;"
else
syn match dosbatchArgument "%~[fdpnxsatz]+(($PATH:)=[a-z]|\d)&gt;"
endif

" Line labels
syn match dosbatchLabel "^\s*:\s*\h\w*&gt;"
syn match dosbatchLabel "&lt;(goto|call)\s+:\h\w*&gt;"lc=4
syn match dosbatchLabel "&lt;goto\s+\h\w*&gt;"lc=4
syn match dosbatchLabel ":\h\w*&gt;"

" Comments - usual rem but also two colons as first non-space is an idiom
syn match dosbatchComment "^rem($|\s.$)"lc=3 contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
syn match dosbatchComment "^@rem($|\s.
$)"lc=4 contains=dosbatchTodo,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
syn match dosbatchComment "\srem($|\s.$)"lc=4 contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
syn match dosbatchComment "\s@rem($|\s.
$)"lc=5 contains=dosbatchTodo,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
syn match dosbatchComment "\s*:\s*:.*$" contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell

" Comments in ()'s - still to handle spaces before rem
syn match dosbatchComment "(rem([^)]|^@<=))*"lc=4 contains=dosbatchTodo,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell

syn keyword dosbatchImplicit append assoc at attrib break cacls cd chcp chdir
syn keyword dosbatchImplicit chkdsk chkntfs cls cmd color comp compact convert copy
syn keyword dosbatchImplicit date del dir diskcomp diskcopy doskey echo endlocal
syn keyword dosbatchImplicit erase fc find findstr format ftype
syn keyword dosbatchImplicit graftabl help keyb label md mkdir mode more move
syn keyword dosbatchImplicit path pause popd print prompt pushd rd recover rem
syn keyword dosbatchImplicit ren rename replace restore rmdir set setlocal shift
syn keyword dosbatchImplicit sort start subst time title tree type ver verify
syn keyword dosbatchImplicit vol xcopy

" Define the default highlighting.
" For version 5.7 and earlier: only when not done already
" For version 5.8 and later: only when an item doesn’t have highlighting yet
if version >= 508 || !exists("did_dosbatch_syntax_inits")
if version < 508
let did_dosbatch_syntax_inits = 1
command -nargs=+ HiLink hi link <args>
else
command -nargs=+ HiLink hi def link <args>
endif

HiLink dosbatchTodo Todo

HiLink dosbatchStatement Statement
HiLink dosbatchCommands dosbatchStatement
HiLink dosbatchLabel Label
HiLink dosbatchConditional Conditional
HiLink dosbatchRepeat Repeat

HiLink dosbatchOperator Operator
HiLink dosbatchEchoOperator dosbatchOperator
HiLink dosbatchIfOperator dosbatchOperator

HiLink dosbatchArgument Identifier
HiLink dosbatchIdentifier Identifier
HiLink dosbatchVariable dosbatchIdentifier

HiLink dosbatchSpecialChar SpecialChar
HiLink dosbatchString String
HiLink dosbatchNumber Number
HiLink dosbatchInteger dosbatchNumber
HiLink dosbatchHex dosbatchNumber
HiLink dosbatchBinary dosbatchNumber
HiLink dosbatchOctal dosbatchNumber

HiLink dosbatchComment Comment
HiLink dosbatchImplicit Function

HiLink dosbatchSwitch Special

HiLink dosbatchCmd PreProc

delcommand HiLink
endif

syn include @sh syntax/sh.vim
syn region shDosBatchCommentStart start="^@goto\s*'.$" end="^'\s2>\s*/dev/null;.*$"
syn match shDosBatchCommentEnd "^:'\S+$"
hi link shDosBatchCommentStart Comment
hi link shDosBatchCommentEnd Comment

syn region shCode start="^@goto\s+\z('\S+)$" keepend end="^:\z1[^\S]*$" contains=@sh,shDosBatchCommentStart,shDosBatchCommentEnd
let b:current_syntax = "dosbatch"
[/code:6xesep05]

이코드는 /usr/share/vim/vim73/syntax/dosbatch.vim을
$HOME/syntax/dosbatch.vim으로 복사한 후, bourne shell 문법이 삽입되도록 수정한 것입니다.

===========================================================
기본적인 정도만 설명드리자면

키워드 설정
syn keyword 키워드그룹 키워드1 키워드2 …

강조그룹 설정
syn match 그룹 "정규표현식"

강조그룹에 대해 색깔로 강조하기
hi link 그룹 그룹유형
여기서 그룹유형은 Comment, Stement, Operator, Identifier, String, Number, Function, Special 등등이 있습니다.

다른 문법을 중간 삽입하기 위해서는
syn include @새문법그룹명 syntax/강조유형.vim
syn region 새그룹 start="문법강조 삽입 시작 정규표현식" keepend end="문법강조 삽입 종료 정규표현식" contains=@새문법그룹명,새그룹1,새그룹2…
이런식으로 사용하실 수 있습니다.

===========================================================
제가 추가한 부분은 다음과 같습니다.

"쉘스크립트 문법 포함
syn include @sh syntax/sh.vim

"@goto '로 시작하는 줄과
"‘2>/dev/null;로 시작하는 줄
"이 두 줄의 범위를 shDosBatchCommentStart라는 명칭으로 정의
"이것은 쉘스크립트 문법 앞에 위치하는 줄
syn region shDosBatchCommentStart start="^@goto\s*’.$" end="^'\s2>\s*/dev/null;.*$"

":'레이블로 되어 있는 줄을 shDosBatchCommentEnd라는 명칭으로 정의
"이것은 쉘스크립트 문법 뒤에 위치하는 줄
syn match shDosBatchCommentEnd "^:'\S+$"

"위의 두가지에 대해서 주석유형으로 강조
hi link shDosBatchCommentStart Comment
hi link shDosBatchCommentEnd Comment

"@goto '레이블로 되어있는 줄과
":‘레이블로 되어 있는 줄
"이 두 줄의 범위를 shCode라는 명칭으로 정의
"이 범위내에 포함가능요소로 @sh,shDosBatchCommentStart,shDosBatchCommentEnd를 지정
"즉 쉘스크립트 문법과 이 쉘스크립트의 앞뒤에 놓이게 될 줄을 포함함
syn region shCode start="^@goto\s+\z(’\S+)$" keepend end="^:\z1[^\S]*$" contains=@sh,shDosBatchCommentStart,shDosBatchCommentEnd

결론적으로,

[code:6xesep05]
@goto 'win_batch_part
'2>/dev/null;

#file listing
for f in *;
do
echo "$f"
done
exit

:'win_batch_part
rem some batch script
@for %%f in ( . ) do @echo %%f
[/code:6xesep05]

이런 코드를 작성하여, sample.sh.cmd로 저장하였다고 하고,
*.cmd에 문법강조가 적용되었다고 하면

[code:6xesep05]@goto 'win_batch_part
'2>/dev/null;
[/code:6xesep05]
이 부분은 주석 유형의 색으로 표시

[code:6xesep05]
#file listing
for f in *;
do
echo "$f"
done
exit
[/code:6xesep05]
이 부분은 쉘스크립트 문법에 따라 강조

[code:6xesep05]
:'win_batch_part
[/code:6xesep05]
이 부분도 주석 유형의 색으로 표시

[code:6xesep05]
rem some batch script
@for %%f in ( . ) do @echo %%f
[/code:6xesep05]
이 부분은 기본문법인 도스배치문법에 따라 강조

다시 조금만 쉽게 설명해주실 수 있으신지요…?

들여쓰기는 c/c++로 똑같이 하면 되는데…

그리고 구문강조도… c/c++과 똑같은데 단지 몇가지 추가로 설정해야합니다…

조금만 쉽게 설명해주세여… 죄송해요 ㅠ.ㅠ

답변을 달아주신 것만으로도 정말 감사드립니다.

들여쓰기는 어떻게 해야하는지 좀 알려주시면 정ㅇ말정말 감사하겠습니다…

그 단지 몇가지가 어떤 것인지 말씀하셔야 답변하죠.

[quote="protochaos":3tsm49k1]그 단지 몇가지가 어떤 것인지 말씀하셔야 답변하죠.[/quote:3tsm49k1]

foreach, gather, forpoints 반복문 추가할거구요…

vex라는 언어가 있는데… 거기서 쓰는 내장함수를 구문강조할 예정입니다.
ex) getbbox, abs, exp, import, addattribute 등…

그리고 vex언어가 C언어 기반으로 설계되어있어서 들여쓰기는 똑같습니다. 그래서 추가하는 foreach, gather 등등을
들여쓰기 가능하게 하고싶습니다.

vex언어의 확장자가 *.vfl인데… 그것을 vi *.vfl 로 열면, 들여쓰기와 구문강조되게끔하려구 합니다.

그리고 c.vim 열어서 보니까 난잡한 것이 정말 많은데… 다 지우고 제가 쓸 것만 넣고싶습니다.

제가 사용해야 하는 것들 나열해보겠습니다…

  1. 전처리기: #paragma , #define, #include
  2. vex언어에서 쓰는 전역변수: P, v, V, Of, Af 등등…
  3. vex언어에서 쓰는 내장함수: getbbox, abs, exp, import 등등…
  4. 반복, 제어문: 이건 C언어랑 똑같은데… 단지 몇가지 추가… foreach, gather, illuminance 추가입니다.
  5. 자료형 타입: 이것도 C언어랑 똑같은데… double 없애고, vector, vector4, matrix 추가입니다.

이렇게 5개만 있으면 되는데요… c.vim으로 한번 넣어봤더니 구문강조가 되긴되는데 너무 지저분한 코드가 많아서…

그리고 protochaos 님의 말씀대로 ~/.vimrc 에서 au… 이거 추가해서 했더니 구문강조 잘 되네여…
그런데 if문이나, for… 등등 이런것들이 자동들여쓰기가 안됩니다.

그리고 혹시… 이것이 어떨때 쓰는지좀 알 수 있을까요?
syn region cParen transparent start=‘(’ end=‘)’ end='}'me=s-1 contains=ALLBUT,cBlock,@cParenGroup,cCppParen,cCppString,@Spell 이것이랑…

이것… au! Syntax newlang source $VIM/newlanguage.vim

이것… 6 " Quit when a (custom) syntax file was already loaded
7 if exists("b:current_syntax")
8 finish
9 endif

vex.vim: [url:2pu8ytc5]http://www.sidefx.com/exchange/info.php?fileid=607&versionid=607[/url:2pu8ytc5]