2017-02-08 1 views
0

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).

Antwort

0

Ich erwäge den ersten Versuch in dieser Arbeit wenig Besserung:

inoremap (() 
inoremap (h()<LEFT> 
inoremap (l();<RETURN> 
inoremap (" ("")<LEFT><LEFT> 
inoremap (' ('')<LEFT><LEFT> 
inoremap (;();<DOWN> 
inoremap) <Esc><RIGHT>:call CloseChar()<cr>i 

inoremap [ [] 
inoremap [h []<LEFT> 
inoremap ] <Esc><RIGHT>:call CloseChar()<cr>i 


inoremap { {} 
inoremap {h {}<LEFT> 
inoremap {<RETURN> {<RETURN><TAB><RETURN><BACKSPACE>}<UP><TAB> 
inoremap } <Esc><RIGHT>:call CloseChar()<cr>i 

inoremap " "" 
inoremap "h ""<LEFT> 
inoremap "l "";<RETURN> 

inoremap ' '' 
inoremap 'h ''<LEFT> 
inoremap 'l '';<RETURN> 

function! CloseChar() 
    if matchstr(getline('.'), '\%' . col('.') . 'c.') =~# '\v\)|]|"|''|}' 
     normal! l 
    endif 
endfunction 
+1

Vielen Dank für die Hilfe. Das funktioniert perfekt für mich. – CMason8856

+0

Gerne helfen! –

0

Ihre erste Problem ist, dass Sie versuchen, eine Funktion aus einem Insert-Modus Zuordnung aufrufen, ohne eine gehen in Modus, der den Aufruf dieser Funktion erlaubt. Es kann nicht funktionieren.

Der beste Ansatz wäre, eine inoremap-<expr> zu haben, gibt entweder, was Sie schon getippt oder <right> (eigentlich wollen Sie <c-g>U<right> zurückzukehren, um Redo zu unterstützen), wenn das Zeichen unter dem Cursor der gleiche wie der Schlüssel ist, dass Sie habe gerade getippt.

Beachten Sie, dass das Spielen mit <esc> + i zu viele Nebenwirkungen hat. Bevorzugen Sie <c-o>, oder noch besser hier eine inoremap-<expr> wie ich schon sagte.

Auch wenn Sie ( und (; (IOW, nur ein Schlüssel, UND dieser Schlüssel gefolgt von allem anderen) zuordnen, werden Sie sehen, Mappings, die nicht sofort ausgelöst werden, aber nach einer Zeitüberschreitung.Nach vielen Experimenten zum Thema Klammern (ich habe mappings beibehalten, die sich über fast 20 Jahre entwickelt haben), lautet meine Schlussfolgerung: Habe nur ein Mapping, das mit dem Klammeröffnungszeichen beginnt, und so viele kontextualisierte Mappings wie nötig, um einen Zeilenumbruch einzufügen zwischen den Klammern, oder schließen Sie alle geöffneten Klammern, oder schließen Sie alle geöffneten Klammern und fügen Sie ein Semikolon, und so weiter.

Verwandte Themen