2013-04-06 13 views
15

Czy istnieje sposób na uzyskanie typu składni do zdefiniowania skrótów klawiaturowych lub do ustawienia skrótu klawiaturowego zależnego od typu składni (być może pod ustawieniem "context")?Sublime Text and Clojure: Nie paruj pojedynczych cudzysłowów

Moje cytowane listy '(1 2 3) należy wprowadzić w następujący sposób: '(1 2 3)', ponieważ Sublime stosuje to pomocne (ale nie w tym przypadku) zachowanie.

Oto istotne nieco pliku 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 } 
    ] 
}, 

Odpowiedz

8

powinna być w stanie, choć to rodzaj bólu. Najpierw musisz wyłączyć wbudowane automatyczne parowanie (nie martw się, kiedy skończymy, automatyczne parowanie, aby wszystko inne działało). Aby to zrobić, ustaw następujące ustawienia w ustawieniach użytkownika.

"auto_match_enabled": false 

Następnie dodaj następujące ustawienia do swoich ustawień.

"my_auto_match_enabled": false 

Następnie musimy dodać nowy zestaw skrótów klawiszowych. Zrobiłem tylko jeden z tego, co napisałeś, ale wyjaśnię, co zrobiłem, ponieważ może nie być oczywiste.

{ "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 } 
    ] 
} 

pierwsze, trzeba pamiętać, że przeszedłem pierwszy klucz kontekstowe z setting.auto_match_enabled do setting.my_auto_match_enabled. Następnie dodałem ostatni wpis kontekstu, który ograniczy zakres. Dzięki temu urywek będzie działał tylko wtedy, gdy nie jesteś w zasięgu source.clojure. Być może będziesz musiał zmienić to, ponieważ nie wiem, co to jest nazwa zakresu w clojure, po prostu zgadłem =). Będziesz musiał to zrobić dla wszystkich wpisów w pojedynczym cudzysłowie. Teraz, ponieważ wyłączyliśmy wbudowane automatyczne parowanie, musimy również przeczytać wszystkie te wpisy. W tych wpisach ponownie zmienimy setting.auto_match_enabled na setting.my_auto_match_enabled. Potem wszystko powinno działać. Zauważ, że tak naprawdę nie musi to być my_auto_match_enabled, właśnie to wybrałem. Możesz to zmienić według własnego uznania.

Z tego wszystkiego, nie do końca przetestowałem to wszystko, więc skomentuj, jeśli napotkasz problemy.

Objaśnienie:

Więc teraz może być zadając sobie pytanie, dlaczego muszę wyłączyć wbudowaną w kodzie automatycznego dopasowywania? Cóż, oto odpowiedź. Nawet gdybyśmy zablokowali automatyczne uzupełnianie w naszych ustawieniach użytkownika, stosując podobną regułę ustalania zakresu, nadal będzie to miało wartość domyślną, w ten sposób wstawiając automatycznie sparowane cytaty, niezależnie od tego, co robimy w folderze użytkownika. Teraz możesz myśleć, ale co jeśli zmienimy domyślny plik ustawień. Chociaż moglibyśmy to zrobić, ponownie wstawiając to samo ustawienie kontekstu, musielibyśmy przywrócić ten plik podczas kolejnych aktualizacji. Więc domyślam się, że to zależy od ciebie. Jeśli edytujesz plik domyślny, pamiętaj, że jeśli kiedykolwiek będziesz musiał to zrobić, musisz ponownie zmienić plik.

Sublime Text 3:

W ST3 można wykonać właściwie zmodyfikować plik "default". Jest to spowodowane zmianą sposobu ładowania pakietów w ST3. Zamiast wymagać wyodrębnienia do folderu Packages, wtyczki są uruchamiane bezpośrednio z plików pakietu .sublime (które mają zmienioną nazwę na zip). Ponadto każdy plik w katalogu Packages ma pierwszeństwo przed plikiem .sublime. Tak więc w ST3 stworzysz Packages/Default/Default (your os here).sublime-keymap i dodasz linię kontekstową. Jest bezpieczny od wszelkich kolejnych aktualizacji, ponieważ aktualizacje nie modyfikują katalogu Packages.

+0

Czy nie ma prostszego sposobu? czy mógłbyś umieścić zdanie lub dwa o tym, dlaczego nadal nie używać 'auto_match_enabled'? –

+0

Zabawny Myślałem, że powinienem to wyjaśnić. Tak czy inaczej, zaktualizowałem odpowiedź. Dodałem również opcję alternatywną, w której można edytować domyślny plik. Jedyną rzeczą, na którą należy zwrócić uwagę, jest to, że jeśli kiedykolwiek będziesz musiał przywrócić lub wykonać jakąkolwiek aktualizację, plik może zostać zniszczony. Chociaż ST2 nie wygląda na to, że otrzyma jakiekolwiek aktualizacje, więc może być w porządku. Edycja domyślnego pliku wymagałaby po prostu dodania tego kontekstu selektora do domyślnych wpisów. – skuroda

+0

Cóż, na pewno będę na ST3, ale mogę zrobić trochę pracy na Windowsie w ST2. Powinno być możliwe przesłonięcie domyślnego mapowania na klawiaturze, po prostu redeclaring go w pliku użytkownika. –

14

Zrobiłem tę prostą rzecz:
Put ten:

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

w swoim użytkownika klucze-wiązań.


Step It Up wycięcie:

Jest jeszcze jeden niezwykły przypadek w tym scenariuszu: '|' (rura stanowi daszek), po naciśnięciu klawisza backspace, byłoby jeszcze usunąć obie singlequotes.


Aby rozwiązać ten problem, należy dodać ten do użytkowników-key-skróty klawiszowe:

{ "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"} 
    ] 
}, 

Ważna uwaga:

Jak stwierdził Pickwicka w komentarzach , powinieneś - oczywiście - zmienić

"source.lisp"
do
"source.<lisp-of-your-choice>"
czy raczej
"source.<name-of-syntax-of-your-choice>"
lub nawet a-ER:
"source.<name-of-scope-the-syntax-you're-using-is-using>".


ScopeAlways jest plugin może pokazać prawidłową nazwę zakresu że składnia jest używana. Prawdopodobnie będzie to coś w rodzaju: "source.lisp" dla CL, dla clojure, może "source.scheme" jeśli spędzasz czas z fajnymi dzieciakami, itd ...

+0

Czy możesz wyjaśnić, co to robi? dzięki –

+0

W wysublimowanym tekście, automatowanie odbywa się za pomocą skrótów klawiszowych na '' ',' '', '[', '' i '(', z kilkoma sprytnymi regułami, wstawiając "inline snippets" (nie wiem jak zadzwonić to, jest to fragment zdefiniowany w pliku keybinding) Powyższy fragment nadpisuje wszystkie skrypty na 'singlequote', na wypadek, gdyby wpisałeś je w kontekście' source.lisp' (podświetlanie składni lisp) – enrey

+0

I oczywiście nadpisuje je oryginalnym znaczenie pojedynczego cudzysłowu klucz - "wstawianie pojedynczego cudzysłowu" – enrey

Powiązane problemy