상황에 맞는 삽입 모드 매핑 또는 약어


10

수학 입력을 단순화하기 위해 LaTeX 플러그인 에 대한 일부 유틸리티 매핑을 구현할 계획 입니다. 예를 들어 다음과 유사한 약어를 만들고 싶습니다.

`a : \alpha
`b : \beta
-> : \to
=> : \Rightarrow

그리고 비슷합니다. 나는 (일부) 매핑을 수학 환경에서만 사용할 수 있고 외부에서는 사용할 수 없도록하고 싶습니다.

구문 그룹 (예 : texMathZoneE및)을 통해 수학 환경을 인식 할 수 있다는 것을 알고 있습니다 texMathZoneX. 그러나 문맥에 민감한 매핑이나 약어를 만들기 위해 이것을 사용하는 방법을 모르겠습니다.

답변:


5

아마도 이것처럼 :

let s:TeXmaps = {
    \ '`a': '\alpha',
    \ '`b': '\beta',
    \ '->': '\to',
    \ '=>': '\Rightarrow' }

function! <SID>IsTeXMath()
    return &ft ==# 'tex' && match(map( synstack(line('.'), col('.')), 'synIDattr(v:val, "name")' ), '\m^texMathZone[EX]$') >= 0
endfunction

for s:k in keys(s:TeXmaps)
    silent! exec 'inoremap <silent> ' . s:k . ' <C-r>=<SID>IsTeXMath()?' . string(s:TeXmaps[s:k]) . ':' . string(s:k) . '<CR>'
endfor

글로벌 약어 대신 확인하는 tex 파일 형식에 버퍼 로컬 약어를 사용하는 것이 좋습니다 'filetype'.
Peter Rincker

@Peter Rincker : 예, 그것은 단지 개념의 증거 일뿐입니다. 그것은 여러 가지 방법에 대한 숫자 ID를 찾아 Fi를 최적화 할 수 있습니다 texMathZoneEtexMathZoneX사전.
lcd047

3

lh- 괄호Map4TheseContexts()상황을 감지하여 다른 작업을 수행 하는 기능을 제공합니다 .

" To be defined in a tex ftplugin -> ~/.vim/ftplugin/tex/your-shortcuts.vim
:inoremap <buffer> <silent> `a <c-r>=Map4TheseContexts('`a', 'texMathZone', '\\alpha', '`a')<cr>
" or:
:inoremap <buffer> <silent> <expr> `a Map4TheseContexts('`a', 'texMathZone', '\\alpha', '`a')

참고 : 라텍스 슈트를 설치 한 경우 해당 IMAP()함수를 사용하여 새 매핑을 정의해야합니다. 이는 라텍스 슈트가 매핑과 관련하여 상당히 방해가되기 때문입니다.


내 LaTeX 플러그인을 개발 중입니다 (질문의 링크 참조). 라텍스 스위트는 일반적으로 복잡하고 방해가되는 방법이라는 것을 알았습니다. 복잡한 스 니펫에 UltiSnips와 같은 것을 사용하는 것을 선호하지만 IMAP 기능은 그렇게 나쁘지 않습니다.
Karl Yngve Lervåg

1
IMAP()매핑을 정의하는 데 흥미가 있었지만 스 니펫 / 템플릿보다 매핑을 유지 관리하기가 어렵습니다.
Luc Hermitte 11:27에
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.