Ich habe für eine Weile an der Entwicklung eines vim-Plugins gearbeitet, bin aber seit einigen Wochen auf einem Roadblock festgefahren. My ist in vimscript geschrieben, und es ist ein einfaches automatisches Paarungsprogramm für die Paare. Ich habe versucht, es über das Recht der schließenden Zeichen ()
, }
,) zu überspringen, wenn es bereits beendet. Mein Fokus ist jetzt, es nur für die )
, ]
, }
Zeichen zu arbeiten.vimscript schließendes Zeichen überspringend
Mein Problem ist, dass ich Probleme habe, die Funktion auszuführen, wenn die schließende Zeicheneingabe eingegeben wird.
Hier ist, was ich bisher versucht habe: ersten Versuch:
inoremap (()
inoremap (h()<LEFT>
inoremap (l();<RETURN>
inoremap (" ("")<LEFT><LEFT>
inoremap (' ('')<LEFT><LEFT>
inoremap (;();<DOWN>
inoremap) call CloseChar()
inoremap [ []
inoremap [h []<LEFT>
inoremap ] call CloseChar()
inoremap { {}
inoremap {h {}<LEFT>
inoremap {<RETURN> {<RETURN><TAB><RETURN><BACKSPACE>}<UP><TAB>
inoremap } call CloseChar()
inoremap " ""
inoremap "h ""<LEFT>
inoremap "l "";<RETURN>
inoremap ' ''
inoremap 'h ''<LEFT>
inoremap 'l '';<RETURN>
function CloseChar()
if matchstr(getline('.'), '\%' . col('.') . 'c.') == '}'
return <RIGHT>
elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ')'
return <RIGHT>
elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ']'
return <RIGHT>
elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == '"'
return <RIGHT>
elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == '''
return <RIGHT>
endif
endfunction
Zweiter Versuch:
inoremap (()
inoremap (h()<LEFT>
inoremap (l();<RETURN>
inoremap (" ("")<LEFT><LEFT>
inoremap (' ('')<LEFT><LEFT>
inoremap (;();<DOWN>
inoremap) :call CloseChar()
inoremap [ []
inoremap [h []<LEFT>
inoremap ] :call CloseChar()
inoremap { {}
inoremap {h {}<LEFT>
inoremap {<RETURN> {<RETURN><TAB><RETURN><BACKSPACE>}<UP><TAB>
inoremap } :call CloseChar()
inoremap " ""
inoremap "h ""<LEFT>
inoremap "l "";<RETURN>
inoremap ' ''
inoremap 'h ''<LEFT>
inoremap 'l '';<RETURN>
function CloseChar()
if matchstr(getline('.'), '\%' . col('.') . 'c.') == '}'
return <RIGHT>
elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ')'
return <RIGHT>
elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ']'
return <RIGHT>
elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == '"'
return <RIGHT>
elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == '''
return <RIGHT>
endif
endfunction
dritter Versuch:
inoremap (()
inoremap (h()<LEFT>
inoremap (l();<RETURN>
inoremap (" ("")<LEFT><LEFT>
inoremap (' ('')<LEFT><LEFT>
inoremap (;();<DOWN>
inoremap <silent>) :call CloseChar()
inoremap [ []
inoremap [h []<LEFT>
inoremap <silent>] :call CloseChar()
inoremap { {}
inoremap {h {}<LEFT>
inoremap {<RETURN> {<RETURN><TAB><RETURN><BACKSPACE>}<UP><TAB>
inoremap <silent>} :call CloseChar()
inoremap " ""
inoremap "h ""<LEFT>
inoremap "l "";<RETURN>
inoremap ' ''
inoremap 'h ''<LEFT>
inoremap 'l '';<RETURN>
function CloseChar()
if matchstr(getline('.'), '\%' . col('.') . 'c.') == '}'
return <RIGHT>
elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ')'
return <RIGHT>
elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ']'
return <RIGHT>
elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == '"'
return <RIGHT>
elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == '''
return <RIGHT>
endif
endfunction
Letzter Versuch:
inoremap (()
inoremap (h()<LEFT>
inoremap (l();<RETURN>
inoremap (" ("")<LEFT><LEFT>
inoremap (' ('')<LEFT><LEFT>
inoremap (;();<DOWN>
inoremap [ []
inoremap [h []<LEFT>
inoremap { {}
inoremap {h {}<LEFT>
inoremap {<RETURN> {<RETURN><TAB><RETURN><BACKSPACE>}<UP><TAB>
inoremap " ""
inoremap "h ""<LEFT>
inoremap "l "";<RETURN>
inoremap ' ''
inoremap 'h ''<LEFT>
inoremap 'l '';<RETURN>
function CloseChar()
if matchstr(getline('.'), '\%' . col('.') . 'c.') == '}'
return <RIGHT>
elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ')'
return <RIGHT>
elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == ']'
return <RIGHT>
elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == '"'
return <RIGHT>
elseif matchstr(getline('.'), '\%' . col('.') . 'c.') == '''
return <RIGHT>
endif
endfunction
call CloseChar()
Anstelle von CloseChar()
wird eine neue )
, , }
eingefügt. Die Quellen für Lösungen, auf die ich Bezug genommen habe, sind learnvimscriptthehardway und Five Minute Vimscript; sowie ein paar Stackoverflow-Beiträge (ich habe nicht genug Reputation, um alle relevanten Foren und Artikel zu verlinken, die ich gefunden habe, tut mir leid).
Also, im Wesentlichen bin ich stecken und bin anfragende Hilfe, um mein Plugin zu beheben, so dass es funktioniert.
Hinweis: Weiß nicht, ob es einen großen Unterschied macht oder nicht, aber ich verwende vim über Windows Subsystem für Linux (WSL).
Vielen Dank für die Hilfe. Das funktioniert perfekt für mich. – CMason8856
Gerne helfen! –