vim 스 니펫 플러그인의 차이점은 무엇입니까?


25

vim을위한 많은 스 니펫 플러그인이 있습니다 : ultisnips , snipmate , xptemplate , neosnippet 그리고 훨씬 더.

그들은 모두 장단점이 있으며 다소 의존성이 있습니다. 지금까지 나는 ultisnips를 사용했지만 완전히 만족하지 못했습니다.

플러그인 관리자 에 대해 매우 흥미롭고 완전한 질문 이 있으므로 스 니펫 플러그인에 대해 동일한 종류의 설명을 갖는 것이 매우 유용하다고 생각합니다.

여기 에는 좋은 출발이 될 수 있는 목록이 있지만 커뮤니티에서 쓸 수있는 완전하고 명확하며 정확한 답변이 꽤 유용 할 것입니다.


1
Marc Weber 위키에서 제공하는 매트릭스 : vim-wiki.mawercer.de/wiki/topic/…
Luc Hermitte

2
IMHO "아무것도 완전히 만족하지 않았다"고 정교하게 설명하는 것이 일반적일까요? 나는 Shougo의 "neosnippet.vim"을 사용합니다.
VanLaser

여기에서 정보로 위키를 업데이트해야합니다. 감사.
Christian Brabandt

@ChristianBrabandt : 며칠이 지나면 바로 업데이트하겠습니다.
statox

답변:


22

나는 몇 주 동안 ultisnips 를 사용하고 있습니다.

이 플러그인의 주요 장점은 다음과 같습니다.

  • 사용 가능한 많은 스 니펫으로도 매우 빠릅니다.
  • 새 스 니펫을 정의하는 기본 구문은 이해하기 쉬우므로 원하는 작업을 수행하여 새 스 니펫을 빠르게 작성할 수 있습니다. (더 복잡한 스 니펫의 경우 추가 작업이 필요할 수 있습니다.)
  • 그것은 상자에서 아주 잘 작동합니다. 기본 구성을 사용하면 스 니펫을 매우 빠르게 사용할 수 있습니다.
  • 실제로 구성 할 수 있습니다. 기본 구성이 제대로 작동하더라도 고급 사용자 인 경우 실제로 미세하게 조정할 수 있습니다.

먼저 모든 ultisnips는 스 니펫 엔진입니다. 즉, 플러그인은 스 니펫을 사용하는 기능을 제공하지만 스 니펫 자체는 제공하지 않습니다. 스 니펫을 얻으려면 저자는 vim-snippets를 권장 합니다.

두 개의 플러그인이 모두 설치되면 스 니펫을 사용할 수 있습니다.

니펫 : '정의는 패턴 다음라는 이름의 파일에 저장됩니다 ft.snippets, ft_*.snippets또는 ft/*여기서 ft현재 문서의 파일 형식'는 것입니다 '하고 *빈 문자열을 포함한 쉘과 같은 와일드 카드 일치하는 문자열입니다. (점으로 구분 된 파일 형식 구문 cuda.cpp이 지원됩니다.)

이 방법으로 파일 유형에 특정한 스 니펫은 버퍼의 파일 유형이 설정된 경우에만 확장됩니다. all모든 버퍼에서 확장 된 스 니펫을 작성하기 위해 특수 파일 유형 을 사용할 수 있습니다.

vim-snippets에서 제공하는 스 니펫 외에도 사용자는 고유 한 스 니펫을 정의 할 수 있습니다. ~/.vim/my-snippets/UltisnipsUltisnips가 추가 구성없이 찾을 수있는 방식으로 디렉토리에 배치하는 것이 좋습니다. 그리고 도트 파일 저장소에서 관리하기가 쉽습니다.

스 니펫을 확장하기 위해 Ultisnips는 g:UltiSnipsExpandTrigger 확장을 트리거 할 매핑을 정의 하는 변수 를 제공합니다 (나 **에게 매우 편리한 것을 선택했습니다 ). 통합은 가능해야하지만 직접 테스트하지는 않았습니다.

고급 사용자를 위해 Ultisnips는 확장 동작을 사용자 정의하거나 다르게 트리거하는 기능도 제공합니다. 만나다:h UltiSnips-trigger-functions


이것은 내가 실제로 광범위하게 사용하는 첫 번째 스 니펫 관리자이며, 이는 기본적으로 간단하고 조정될 가능성으로 시작하기에 좋은 것으로 생각합니다.

마지막으로 플러그인에 대한 좋은 소개를 제공하는 스크린 캐스트 목록이 있습니다.


공백이나 a가 앞에 오지 않는 한 트리거 할 때 확장하지 않도록하는 방법을 알고 있습니까 >(HTML의 닫는 중괄호에서와 같이. 옵션 i은 그것이 좋지 않은 단어의 한가운데서도 그것을 확장하도록 만들어줍니다
Tallboy

12

Vim을 사용하기 시작한 이후로 원래 SnipMate를 사용하고 있습니다.

  • 외부 종속성이 없습니다.
  • 매우 간단한 구문을 사용합니다.
  • 설정이 매우 쉽습니다.
  • 2009 년부터 폐지되었습니다.

나는 불평 할 것이 없다.


16
내가 포기를 기능으로 언급 한 사람을 본 것은 이번이 처음입니다. : D
muru

6
버려진 프로젝트는 안정적인 프로젝트입니다. 로컬 인스턴스가 오래되었거나 API 변경으로 워크 플로를 중단하는 업데이트에 대해 걱정할 필요가 없습니다. 설치시 요구 사항을 충족하면 계속 그렇게 할 수 있습니다. 요구 사항이 변경되지 않는 한. 안정성은 모든 도구 에서 찾는 # 1 기능 입니다.
romainl

3
"설치할 때 요구 사항을 충족 시키면 계속 계속 유지됩니다. 요구 사항이 변경되지 않는 한" 또는 버그를 발견 한 시점에서 직접 문제를 해결하거나 다른 사람을 찾아 수정하거나 대안을 찾아보십시오. 아마도 포기되지 않은 것입니다.

1
귀하의 답변에 감사드립니다 @romainl! 당신은 플러그인을 포기했다,하지만에 대한 추가 정보 리디렉션 : 나는 1 개 개의 질문이 최신 버전 보인다 꽤 활성 여러 커밋은 더 나은 새로운 하나를 사용하지 않는 물건을 수정하는 것?
statox

1
UltraSnips에는 몇 가지 버그와 문서 오류가있어 덜 입문적인 경험을 제공합니다. 마침내 실행 후 SnipMate를 확인하기로 결정했으며 안정성에 대한 @romainl의 주장을 이해할 수 있습니다.
chb

7

다음은 mu-template 의 기능 목록입니다 . Discl .: 저는 관리자입니다.

  • 템플릿 파일을 확장 할 수 있습니다 :
    • 새 버퍼를 열 때 자동으로 (.vimrc에서 비활성화되지 않은 경우)
    • 메뉴 나 명령 줄을 통해 명시 적으로
    • 스 니펫과 같은 방식으로 INSERT 모드에서;
    • VISUAL- 모드에서 스 니펫으로 선택을 둘러싸 기 위해-주변은 스 니펫의 다른 영역 (예 : while제어문의 코드 또는 조건 영역)에 적용될 수 있습니다 .
  • 모든 스 니펫은 자체 템플릿 파일에 정의되어 있습니다. 다른 모든 스 니펫 엔진은 파일 유형 당 하나의 파일을 사용하고 모든 스 니펫을 포함합니다.
  • 템플릿 파일은 사용자에 의해 또는 특정 프로젝트의 컨텍스트에서 재정의 될 수 있습니다.
  • 파일 유형별 스 니펫은 INSERT 모드에 대해 정의 될 수 있으며 (예를 들어 C 스 니펫은 C ++, Java 등에서 사용될 수 있음), 일치하는 스 니펫 목록에는 각 스 니펫에 대한 힌트가 표시됩니다.
  • 계산 된 VimL 표현식을 삽입 할 수 있습니다.
  • VimL 명령어는 확장 중에 실행될 수 있습니다.이 명령어를 사용하여 누락 된 include 또는 import 문을 자동으로 추가합니다.
  • 템플릿 파일은 함수와 같은 방식으로 다른 템플릿 파일을 포함 할 수 있습니다 (매개 변수도 지원됨)-AFAIK,이 기능을 구현하는 스 니펫 엔진은 거의 없으며 스 니펫 별칭도 지원할 수 없습니다. 이 기능;
  • 내 자리 표시 자 시스템과 완전히 통합되었습니다.
  • 재 들여 쓰기 (원하는 경우) 및 Python 들여 쓰기를 지원합니다.
  • vim 접기와 잘 작동합니다.
  • 친절한 I18n;
  • 여러 스 니펫이 일치하면 고급 완료 메뉴가 나타납니다 (YouCompleteMe 팝업 메뉴에서 영감을 얻음).
  • 스타일 옵션은 자동으로 적용되며 (괄호를 선호하는 방법은 if (...) {\n}무엇 if (...)\n{\n}입니까??? 다른 것?) 물론 현재 프로젝트 나 현재 파일 형식 또는 둘 다에 따라 미세 조정할 수 있습니다.
  • 플러그인은 100 % VimL입니다. 그래도 템플릿 파일에서 파이썬을 사용할 수 있습니다.
  • mu-template은 두 개의 라이브러리 플러그인 (lh-vim-lib 및 lh-dev)과 플레이스 홀더 시스템 (lh-brackets)에 따라 달라집니다. 의존성;
  • 라이센스는 코드 생성과 호환됩니다. 즉, 다중 템플릿 코드는 GPLv3하에 있지만 스 니펫은 그렇지 않지만 독점 코드로 사용할 수 있습니다. 일부 스 니펫은 부스트 ​​소프트웨어 라이센스하에 있습니다.

  • 확장은 로컬 vimrcs가로드 된 후 확장이 수행되기 전에 프로젝트 특정 변수를 설정하기 위해 발생합니다.

  • Tom Link의 StakeHolders 플러그인 덕분에 µTemplate은 자리 표시자를 묶었습니다 (이름이 지정된 자리 표시자를 수정하면 동일한 이름으로 다른 자리 표시자가 수정 됨). 이해 관계자를 설치하지 않아도 µTemplate을 사용할 수 있습니다.

솔직히 말해서 템플릿 구문은 약간 번거롭고 자리 표시 자 시스템은 첫 번째 자리 표시 자 생성에 속합니다. mu-template은 Vim에서 가장 오래된 템플릿 / 스 니펫 엔진 중 하나입니다.

그러나 스 니펫에 재정의되거나 무시되지 않는 다른 스 니펫 (조건부 및 매개 변수 포함)이 포함되도록하는 것은 매우 중요합니다. 일반적인 응용 분야는

  • C ++ 파일 템플릿

    1. 여기에는 파일 헤더가 포함됩니다 (일반적으로 올바른 저작권 표시를 포함하기 위해 각 프로젝트마다 다르게 조정 됨)
    2. 그런 다음 현재 파일 형식 (.h, .cpp 또는 단위 테스트 파일)에 가장 적합한 템플릿을로드하십시오.
      • 헤더 파일의 경우, 재 반입 방지 가드가 포함됩니다-그들이 계산하는 방식이 재정의 될 수 있습니다 (프로젝트 정책을 따르도록)
      • .cpp 파일의 경우 일치하는 .h 파일이 발견되면 자동으로 포함됩니다
  • lh-cpp에 일반 클래스 스 니펫 / 마법사가 있습니다. 그리고 여러 전문 클래스 종류 이 일반적인 클래스 템플릿을 사용하지만 다른 매개 변수.


답변 주셔서 감사합니다! 질문이 있습니다 : 당신은 All snippets are defined in their own template-file -- all other snippet engines use one file per filetype and put all snippets in it 일반적인 아키텍처와 비교 하여이 아키텍처의 장점이 무엇 이라고 말했 습니까 (예 : 파일 유형별로 하나의 파일)?
statox

@statox 나는 스 니펫 유지 관리 문제라고 말하고 싶습니다. 일부 스 니펫은 지나치게 복잡합니다. internals/class-skeleton예를 들어 lh-cpp 를 살펴보십시오 . 오히려 제어문 스 니펫과 혼합하지 않고 싶습니다. 그러나 모든 제어문을 함께 사용하는 것이 그리 문제가되지는 않는다는 것을 인정해야합니다. 또한이 접근 방식 덕분에 스 니펫을 쉽게 재정의하고, 즉시 업데이트하고, 함수로 사용할 수 있습니다.
Luc Hermitte

실제로 귀하의 링크를 볼 때 일부 스 니펫이 왜 자신의 파일에 더 잘 사는지 이해할 수 있습니다. 설명해 주셔서 감사합니다.
statox

1
@statox 사실, 많은 스 니펫은 복잡한 경향이 있습니다. 가능한 많은 똑똑한 일을 감지하고 추론하고 시도합니다. 대부분의 경우 코드를 자동로드 된 함수로 옮기지 만 때로는 서로를 호출 하는 여러 스 니펫 을 사용하는 것이 더 합리적 입니다 (프로젝트 요구에 맞게 조정할 수있는 변형 지점으로 작동-> 저작권 정보 등)
Luc Hermitte

4

SnipMate 및 UltiSnips는 Vim에서 가장 인기있는 스 니펫 엔진입니다. 둘 다 TextMate의 스 니펫 구문에서 영감을 얻었습니다. UltiSnips는 모든 SnipMate 스 니펫을 실행할 수 있지만 더 강력한 구문을 추가로 사용할 수 있습니다.

경험상 Vim이 파이썬을 지원하는 경우 UltiSnips를 사용하는 것이 좋습니다. 그렇지 않은 경우 SnipMate를 사용하십시오.

내에서는 .vimrc파이썬 가용성에 따라 플러그인 중 하나를 플러그인으로로드합니다.

if (has('python') || has('python3'))
    Plug 'SirVer/ultisnips'
else
    Plug 'garbas/vim-snipmate'
    Plug 'MarcWeber/vim-addon-mw-utils' "required for snipmate
    Plug 'tomtom/tlib_vim' "required for snipmate
endif

UltiSnips는 스 니펫에서 파이썬 코드를 실행하여 멋진 트릭을 수행 할 수 있습니다. 이것은 텍스트 주위에 상자를 그리는 가장 좋아하는 스 니펫 중 하나입니다 ( LaTeX 및 Vim | Gilles Castel을 사용하여 수학 강의에서 메모 를 작성 하는 방법에서 )

snippet box2 "Box"
`!p snip.rv = '┌' + '─' * (len(t[1]) + 2) + '┐'`
│ $1 │
`!p snip.rv = '└' + '─' * (len(t[1]) + 2) + '┘'`
$0
endsnippet

이 스 니펫을 사용하면 다음과 같이 출력 할 수 있습니다.

┌─────────────────────┐
│ this is a cool box! │
└─────────────────────┘
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.