2013-04-06 12 views
15

C'è un modo per ottenere un tipo di sintassi per definire le scorciatoie da tastiera o per impostare una scorciatoia da tastiera per dipendere dal tipo di sintassi (forse sotto l'impostazione "context")?Testo sublime e Clojure: non associare le virgolette singole

Le mie liste quotate '(1 2 3) sono immesse in questo modo: '(1 2 3)' perché Sublime applica questo comportamento utile (ma non in questo caso).

Ecco il bit rilevante del file Default (OSX).sublime-keymap

// Auto-pair single quotes 
{ "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'$0'"}, "context": 
    [ 
     { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, 
     { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, 
     { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true }, 
     { "key": "preceding_text", "operator": "not_regex_contains", "operand": "['a-zA-Z0-9_]$", "match_all": true }, 
     { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single", "match_all": true } 
    ] 
}, 
{ "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'${0:$SELECTION}'"}, "context": 
    [ 
     { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, 
     { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } 
    ] 
}, 
{ "keys": ["'"], "command": "move", "args": {"by": "characters", "forward": true}, "context": 
    [ 
     { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, 
     { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, 
     { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true } 
    ] 
}, 

risposta

8

Si dovrebbe essere in grado di, anche se è una specie di dolore. Innanzitutto, dovrai disabilitare l'accoppiamento automatico integrato (non preoccuparti, al termine, l'accoppiamento automatico per tutto il resto dovrebbe funzionare). Per fare ciò, imposta quanto segue nelle tue impostazioni utente.

"auto_match_enabled": false 

Quindi aggiungere quanto segue alle proprie impostazioni.

"my_auto_match_enabled": false 

Successivamente, è necessario aggiungere un nuovo set di combinazioni di tasti. Ne ho fatto uno solo da quello che hai pubblicato, ma ti spiegherò cosa ho fatto poiché potrebbe non essere ovvio.

{ "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'${0:$SELECTION}'"}, "context": 
    [ 
     { "key": "setting.my_auto_match_enabled", "operator": "equal", "operand": true }, 
     { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }, 
     { "key": "selector", "operator": "not_equal", "operand": "source.clojure", "match_all": true } 
    ] 
} 

In primo luogo, si noti che ho acceso la prima chiave contesto setting.auto_match_enabled-setting.my_auto_match_enabled. Successivamente, ho aggiunto l'ultima voce di contesto che limiterà l'ambito. Con questo, lo snippet verrà eseguito solo quando non si è in un ambito source.clojure. Potrebbe essere necessario modificarlo poiché non so quale sia il nome dell'ambito in clojure, ho appena indovinato =). Dovrai farlo per tutte le tue voci di quota singola. Ora, poiché abbiamo disattivato l'accoppiamento automatico integrato, dobbiamo anche leggere tutte queste voci. In queste voci, cambieremo nuovamente setting.auto_match_enabled a setting.my_auto_match_enabled. Dopodiché, tutto dovrebbe funzionare. Nota che in realtà non deve essere my_auto_match_enabled, è proprio quello che ho scelto. Puoi cambiarlo come meglio credi.

Con tutto ciò che ho detto, non ho provato completamente tutto questo, quindi commentate se vi imbattete in problemi.

Spiegazione:

Così ora si potrebbe chiedere se stessi, perché ho bisogno di disattivare il costruito nel codice di corrispondenza auto? Bene, ecco la risposta. Anche se dovessimo bloccare l'auto completamento nelle nostre impostazioni utente, usando una regola di scoping simile, sarebbe comunque ricadere sul valore predefinito, inserendo quindi le virgolette accoppiate automaticamente indipendentemente da ciò che facciamo nella cartella utente. Ora si potrebbe pensare, ma cosa succede se modifichiamo il file delle impostazioni di default. Anche se potremmo fare questo, inserendo nuovamente la stessa impostazione di contesto, dovremmo assicurarci di ripristinare quel file su eventuali aggiornamenti successivi. Quindi immagino che alla fine spetti a te. Se modifichi il file predefinito, tieni presente che se hai mai bisogno di ripristinare, dovrai cambiare di nuovo il file.

Sublime Text 3:

In ST3, è possibile eseguire la realtà modificare il file "default". Ciò è dovuto a un cambiamento nel modo in cui i pacchetti vengono caricati in ST3. Piuttosto che dover essere estratti nella cartella Packages, i plug-in vengono eseguiti direttamente dai file .sublime-package (che sono semplicemente zips rinominate). Inoltre, qualsiasi file nella directory Packages ha la precedenza sul file .sublime-package. Quindi, in ST3, creeresti Packages/Default/Default (your os here).sublime-keymap e aggiungerai la linea di contesto. È sicuro da eventuali aggiornamenti successivi poiché gli aggiornamenti non modificano più la directory dei pacchetti.

+0

Non c'è un modo più semplice? potresti forse mettere una frase o due sul perché non continuare a usare "auto_match_enabled'? –

+0

Divertente, stavo pensando che dovrei spiegarlo. Ad ogni modo, ho aggiornato la risposta. Ho anche aggiunto un'opzione alternativa, in cui è possibile modificare il file predefinito. L'unica cosa da notare è che se dovessi mai ripristinare o fare qualsiasi tipo di aggiornamento, il file potrebbe essere spazzato via. Sebbene ST2 non sembri, riceverà aggiornamenti, quindi potrebbe andar bene. La modifica del file predefinito comporterebbe semplicemente l'aggiunta del contesto selettore alle voci predefinite. – skuroda

+0

Beh, sicuramente sarò su ST3 ma potrei lavorare su Windows in ST2. Dovrebbe essere possibile sovrascrivere un keymapping predefinito semplicemente riprogettandolo nel file utente. –

14

ho fatto questa cosa semplice:
Metti questo:

// Singlequote for lisp 
{ "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'"}, "context": 
    [ 
     { "key": "selector", "operator": "equal", "operand": "source.lisp"} 
    ] 
}, 

nei vostri user-keys-binding.


passo su una tacca:

C'è ancora un caso insolito in questo scenario: '|' (tubo rappresenta accento circonflesso), dopo aver premuto backspace, sarebbe comunque eliminare sia l'apostrofo.


Per risolvere questo problema, aggiungere questo ai tuoi dall'utente chiave-keybindings:

{ "keys": ["backspace"], "command": "left_delete", "context": 
    [ 
     { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, 
     { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, 
     { "key": "preceding_text", "operator": "regex_contains", "operand": "'$", "match_all": true }, 
     { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true }, 
     { "key": "selector", "operator": "equal", "operand": "source.lisp"} 
    ] 
}, 

NOTA IMPORTANTE:

Come affermato da Pickwick nei commenti , dovresti - ovviamente - cambiare

"source.lisp"
a
"source.<lisp-of-your-choice>"
o piuttosto a
"source.<name-of-syntax-of-your-choice>"
o anche piuttosto-er:
"source.<name-of-scope-the-syntax-you're-using-is-using>".


ScopeAlways è un plugin in grado di mostrare il nome corretto del ambito che la sintassi sta usando. Molto probabilmente sarà qualcosa come "source.lisp" per CL, "source.clojure" per clojure, forse "source.scheme" se esci con i bambini fantastici, ecc ...

+0

potresti spiegare cosa fa? grazie –

+0

Nel testo sublime, l'automatching viene eseguito da combinazioni di tasti in "", "", "[', '{' e '(', con una coppia di regole intelligenti, inserendo "snippet inline" (non so come chiamare è snippet definito all'interno del file di keybinding) Il frammento sopra sovrascrive tutte le associazioni di tasti su 'singlequote', nel caso in cui lo si digiti nel contesto' source.lisp' (evidenziazione della sintassi lisp). – enrey

+0

E, naturalmente, lo sovrascrive con l'originale significato della chiave singlequote - "inserimento di una virgoletta singola" – enrey

Problemi correlati