Skip to content

Commit 6b36292

Browse files
committed
Clojure-aware clojure_sublimed_toggle_comment command
1 parent 1bb5607 commit 6b36292

File tree

7 files changed

+49
-7
lines changed

7 files changed

+49
-7
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
- Pretty print selection #123
44
- Execute code from inside top-level `; ...` and `#_...` #124
5+
- Clojure-aware `clojure_sublimed_toggle_comment` command
56
- Remove background color on quoted strings inside metadata
67
- Better handle eval of `#_` forms in nREPL JVM
78

Default (Linux).sublime-keymap

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,12 @@
5454
// // Insert New Line
5555
// {"keys": ["enter"],
5656
// "command": "clojure_sublimed_insert_newline",
57-
// "context": [{"key": "selector", "operator": "equal", "operand": "source.edn | source.clojure"},
57+
// "context": [{"key": "selector", "operator": "equal", "operand": "source.clojure"},
5858
// {"key": "auto_complete_visible", "operator": "equal", "operand": false},
5959
// {"key": "panel_has_focus", "operator": "equal", "operand": false}]},
60+
61+
// // Toggle Comment
62+
// {"keys": ["ctrl+/"],
63+
// "command": "clojure_sublimed_toggle_comment",
64+
// "context": [{"key": "selector", "operator": "equal", "operand": "source.clojure"}]},
6065
]

Default (OSX).sublime-keymap

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,12 @@
5454
// // Insert New Line
5555
// {"keys": ["enter"],
5656
// "command": "clojure_sublimed_insert_newline",
57-
// "context": [{"key": "selector", "operator": "equal", "operand": "source.edn | source.clojure"},
57+
// "context": [{"key": "selector", "operator": "equal", "operand": "source.clojure"},
5858
// {"key": "auto_complete_visible", "operator": "equal", "operand": false},
5959
// {"key": "panel_has_focus", "operator": "equal", "operand": false}]},
60+
61+
// // Toggle Comment
62+
// {"keys": ["super+forward_slash"],
63+
// "command": "clojure_sublimed_toggle_comment",
64+
// "context": [{"key": "selector", "operator": "equal", "operand": "source.clojure"}]},
6065
]

Default (Windows).sublime-keymap

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,12 @@
5454
// // Insert New Line
5555
// {"keys": ["enter"],
5656
// "command": "clojure_sublimed_insert_newline",
57-
// "context": [{"key": "selector", "operator": "equal", "operand": "source.edn | source.clojure"},
57+
// "context": [{"key": "selector", "operator": "equal", "operand": "source.clojure"},
5858
// {"key": "auto_complete_visible", "operator": "equal", "operand": false},
5959
// {"key": "panel_has_focus", "operator": "equal", "operand": false}]},
60+
61+
// // Toggle Comment
62+
// {"keys": ["ctrl+/"],
63+
// "command": "clojure_sublimed_toggle_comment",
64+
// "context": [{"key": "selector", "operator": "equal", "operand": "source.clojure"}]},
6065
]

Default.sublime-commands

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@
8080
"caption": "Clojure Sublimed: Pretty-print selection",
8181
"command": "clojure_sublimed_pretty_print"
8282
},
83+
{
84+
"caption": "Clojure Sublimed: Toggle comment",
85+
"command": "clojure_sublimed_toggle_comment"
86+
},
8387
{
8488
"caption": "Clojure Sublimed: Insert Newline",
8589
"command": "clojure_sublimed_insert_newline"

cs_indent.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import re
12
import sublime, sublime_plugin
23
from . import cs_cljfmt, cs_common, cs_parser, cs_printer
34

@@ -158,6 +159,27 @@ def run(self, edit):
158159
formatted = cs_printer.format(form, node, limit = cs_common.wrap_width(view))
159160
view.replace(edit, region, formatted)
160161

162+
class ClojureSublimedToggleCommentCommand(sublime_plugin.TextCommand):
163+
def run(self, edit):
164+
view = self.view
165+
change_id = view.change_id()
166+
for region in [r for r in view.sel()]:
167+
region = view.transform_region_from(region, change_id)
168+
line = view.line(region)
169+
line_text = view.substr(line)
170+
# uncomment ;
171+
if m := re.match(r'^(\s*)(;[;\s]*)(.*)', line_text):
172+
view.replace(edit, line, m[1] + m[3])
173+
continue
174+
parsed = cs_parser.parse_tree(view)
175+
# uncomment #_
176+
if node := cs_parser.search(parsed, region.begin(), pred = lambda node: node.name == "discard"):
177+
view.replace(edit, sublime.Region(node.start, node.body.start), '')
178+
continue
179+
# prepend ;
180+
if m := re.match(r'^(\s*)([^\s].*)', line_text):
181+
view.replace(edit, line, m[1] + '; ' + m[2])
182+
161183
def cljfmt_indent(view, point):
162184
i = None
163185
try:

cs_parser.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -363,17 +363,19 @@ def parse_as_dict(string):
363363
dict[key] = val
364364
return dict
365365

366-
def search(node, pos, pred = lambda x: True, max_depth = 1000):
366+
def search(node, pos, pred = None, max_depth = 1000):
367367
"""
368368
Search inside node what’s the deepest node that includes pos.
369369
Stops at max_depth and if pred evals to true.
370370
If two nodes touch around pos, checks both for pred.
371371
"""
372372
if max_depth <= 0 or not node.children:
373-
if pred(node):
373+
if not pred or pred(node):
374374
return node
375375
else:
376376
return None
377+
if pred and pred(node):
378+
return node
377379
for child in node.children:
378380
if child.start <= pos <= child.end:
379381
if res := search(child, pos, pred = pred, max_depth = max_depth - 1):
@@ -388,7 +390,6 @@ def parse_tree(view, region = None):
388390
"""
389391
Parses current buffer content and return AST
390392
"""
391-
id = view.buffer_id()
392393
text = view.substr(region or sublime.Region(0, view.size()))
393394
return parse(text)
394395

@@ -397,7 +398,6 @@ def symbol_at_point(view, point):
397398
Returns symbol left/right/around cursor
398399
"""
399400
parsed = parse_tree(view)
400-
start = time.time()
401401
if node := search(parsed, point, pred = is_symbol):
402402
return sublime.Region(node.start, node.end)
403403

0 commit comments

Comments
 (0)