Отображения переключения Vim

0

Я настроил свои отображения следующим образом:

"Set up mappings for LaTeX files 
let b:myEngine=0
let g:myEngineList=["pdflatex","texexec"] "pdflatex or context
function! ToggleEngine()
  if b:myEngine == "pdflatex"
        let b:myEngine = "context"
        execute "imap <F5> :! pdflatex %;<CR>"
        execute "map ;new \begin{document}<CR><CR>\end{document}"
  else
        let b:myEngine = "pdflatex"
        execute "imap <F5> :! context %;<CR>"
        execute "map ;new \starttext<CR><CR>\stoptext"
  fi
  echo "compilation engine:" g:myEngineList[b:myEngine]
endfunction

Однако это не ведет себя так, как я ожидаю; он отказывается переназначать ключи. Изначально ключи не сопоставлены, а после сопоставления они остаются сопоставленными. Как это исправить?

Я вызываю ToggleEngine () следующим образом: nmap <silent> <F7> :call ToggleSpell()<CR>

EricR
источник

Ответы:

1

когда ты call ToggleEngine()?

Предложение:

"Set up mappings for LaTeX files 
let g:myEngineList=["pdflatex","texexec"] "pdflatex or context
function! ToggleEngine()
  if b:myEngine == "pdflatex"
     let b:myEngine = "context"
  else
     let b:myEngine = "pdflatex"
  fi
  execute 'inoremap <F5> :!' . b:myEngine . ' %<cr>'
  echo "spell checking language: " . b:myEngine
endfunction
Benoit
источник
Это хорошее решение, за исключением части вопроса, который мне не удалось добавить, это то, что это не единственное сопоставление, существуют другие сопоставления, которые не зависят от имени, которое не может быть изменено. Я пробую inoremap вместо imap. Посмотрим.
EricR
Оказывается, это была разница между imap и inoremap. Спасибо!
EricR
1

Основанное на lh-vim-lib , вот еще одно решение, которое определяет меню и команду (добавление сопоставления становится таким же простым, как вызов команды из сопоставления).

В вашем случае это будет выглядеть так:

function! s:getSNR()
  if !exists("s:SNR")
    let s:SNR=matchstr(expand("<sfile>"), "<SNR>\\d\\+_\\zegetSNR$")
  endif
  return s:SNR 
endfunction


function! s:UsePdfLaTeX()
  set makeprg=pdflatex\ $*
  inoremap <buffer> <localleader>new \begin{document}<CR><CR>\end{document}
endfunction

function! s:UseContext()
  set makeprg=context\ $*
  inoremap <buffer> <localleader>new \startext<CR><CR>\stoptext
endfunction

let s:Data = {
      \ "variable": "myengine",
      \ "values": [ 'pdflatex', 'context' ],
      \ "actions": [ function(s:getSNR()."UsePdfLaTeX"), function(s:getSNR()."UseContext") ],
      \ "menu": { "priority": '42.42', "name": '&LaTeX.&Engine'}
      \}
call lh#menu#def_toggle_item(s:Data)
nnoremap <silent> <F7> :Toggle LaTeXEngine<cr>

Примечание. Его можно расширить для поддержки любого количества альтернатив.

Люк Эрмитт
источник