Elimina automaticamente la coppia di chiusura senza causare coppie sbilanciate


8

Sto scrivendo una funzione VimL che, in modalità di inserimento, permette una <BS>attraverso la parte di una coppia (apertura [, {ecc) per eliminare la parte della coppia di chiusura se è il carattere successivo dopo il cursore (molto simile automatici coppie e vim-autoclose ). Questa funzione sarà diversa perché la parte di chiusura della coppia non verrà eliminata se ci sono coppie sbilanciate.

Esempi:

Il formato è <initial> => <result-after-backspace>dove il mio cursore si trova davanti al |.

((|)    =>   (|)

((|))   =>   (|)

(|)     =>   |

(defn   =>   (defn
  (|)          |)

Come posso determinare se le coppie sono sbilanciate o meno prima di andare avanti ed eliminare la coppia di chiusura?

Ho testato sia auto-coppie che vim-autoclose . Con entrambi i plugin la parte di chiusura della coppia viene sempre eliminata.


Potresti chiarire la tua prefazione? Desideri evitare tutti i plugin, o solo quelli simili ai due che menzioni? Se quest'ultimo, che dire di quei due non ti piace?
Tom,

Non voglio usare alcun plugin per questo. Ho aggiornato la prefazione.

1
Ho votato per chiudere questa domanda. Penso che l' argomento di base in quanto tale vada bene, ma le tue restrizioni lo rendono una domanda "per favore, scrivi un po 'di codice per me, per favore, adesso. Non credo che vogliamo permettere questo tipo di domande qui ...
Martin Tournoij,

1
@Carpetsmoker Oltre alla formulazione di questa domanda c'è un problema che deve ancora essere risolto in qualsiasi plugin che ho visto. Mi sembra chiaro che, una volta risolta con successo questa domanda, ogni plug-in a chiusura automatica o accoppiamento automatico sarà in grado di beneficiare della sua soluzione. Come suggeriresti di cambiare il testo per renderlo accettabile?

2
@merb, il plugin paredit fa esattamente quello che vuoi. Se vuoi quella funzionalità senza effettivamente utilizzare il plugin, ti suggerisco di esaminare l'origine su github. Penso che sarebbe più istruttivo di me provare a riprodurne una versione qui. github.com/kovisoft/paredit
Quincy Bowers,

Risposte:


1

Se capisco correttamente la tua domanda, la chiave è determinare se il carattere sul cursore è un delimitatore corrispondente.

Considera i normali comandi in modalità v%"zye v%%"zy.

  • Se il cursore si trova su un delimitatore corrispondente, il primo comando inserirà una stringa di lunghezza di almeno 2 - il delimitatore, la sua coppia e qualsiasi testo nel mezzo - in @z. Il secondo strapperà una stringa di lunghezza esattamente 1 - di nuovo, il delimitatore stesso - in @z.
  • Se il cursore si trova su un delimitatore senza pari, il primo comando inserirà una stringa di lunghezza 1, il delimitatore stesso @z. Abort.
  • Se il cursore non si trova su un delimitatore e nella riga è presente un delimitatore, il secondo comando inserirà una stringa di lunghezza maggiore di 1 in @z. Abort.
  • Se il cursore non si trova su un delimitatore e non vi sono altri delimitatori nella riga, il primo comando inserirà una stringa di lunghezza esattamente 1, il carattere stesso @z. Abort.

Pertanto, abbiamo il seguente risultato:

Il cursore si trova su un delimitatore abbinato se e solo se il comando in modalità normale v%"zyesegue il tiro di una stringa di lunghezza di almeno 2 in @ze il comando di modalità normale v%%"zyesegue il tiro di una stringa di lunghezza esattamente 1 in @z.

Suggerimenti per VimL: :norm ...e strlen(@z)aiuterà qui.


Questo risponde alla tua domanda o mi sto perdendo qualcosa?
mercoledì

Determinare se il carattere sul cursore è abbinato o meno non è esattamente la chiave. La chiave è determinare se una determinata forma è bilanciata o meno. Se il modulo è bilanciato e ci troviamo in questa posizione (|):, premendo <BS>si eliminano entrambi. Tuttavia, se il modulo di livello superiore è sbilanciato, in questo modo (defn (|):, premendo <BS>si elimina solo ciò che verrebbe normalmente eliminato, in questo caso lasciandoci con (defn |).

1

Ok, quindi ho finito con paredit.vim e tirando fuori alcune funzioni per creare questo: vim-pear . Inserisce ed elimina i delimitatori in coppia mantenendo uno stato bilanciato.


Cool :-) Come lo uso? Posso semplicemente installarlo e sarà abilitato di default? È anche possibile abilitare / disabilitare questo solo per tipi di file specifici?
Martin Tournoij,

Abilitato per tutto per impostazione predefinita. Invia un PR se vuoi qualcosa del genere. Potrei farlo da solo a un certo punto.

Il collegamento è (attualmente) interrotto.
Rich
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.