Skip to content
This repository has been archived by the owner on Feb 3, 2020. It is now read-only.

Commit

Permalink
hash comment plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
baverman committed Oct 1, 2010
1 parent 19a74c7 commit de419b0
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 3 deletions.
5 changes: 3 additions & 2 deletions README.rst
Expand Up @@ -43,9 +43,10 @@ I use Snaked for all my python development tasks. Following features are impleme
- Storing last edit position for every file.
- Python smart indent.
- Saving quick open project history and switch between them on ``<alt>Up``/``<alt>Down``.
- Tabs. Switching on ``<alt>Left/<alt>Right``
- Python outline navigator on ``<ctrl>o``
- Tabs. Switching on ``<alt>Left/<alt>Right``.
- Python outline navigator on ``<ctrl>o``.
- Feedback messages api. For example syntax errors on python autocomplete and so on.
- Hash comment plugin for commenting python, ruby, etc... code. Activated on ``<ctrl>slash``.

Current progress may be seen in `@a_bobrov <http://twitter.com/a_bobrov>`_.

Expand Down
2 changes: 1 addition & 1 deletion setup.py
Expand Up @@ -2,7 +2,7 @@

setup(
name = 'snaked',
version = '0.3.dev3',
version = '0.3.dev4',
author = 'Anton Bobrov',
author_email = 'bobrov@vl.ru',
description = 'Very light and minimalist editor inspired by Scribes',
Expand Down
73 changes: 73 additions & 0 deletions snaked/plugins/hash_comment/__init__.py
@@ -0,0 +1,73 @@
import gtk

langs = ['python', 'sh', 'ruby', 'perl']

def init(manager):
manager.add_shortcut('comment-code', '<ctrl>slash', 'Edit',
'Comments/uncomments current line or selection', comment)

#Action
def comment(editor):
r = get_bounds(editor)
traversor = make_line_traversor(editor.buffer, r)

if all(line_is_hashed(l) for l in traversor()):
uncomment_range(editor, traversor)
else:
comment_range(editor, traversor)

def make_line_traversor(buffer, r):
start, end = r
start, stop = start.get_line(), end.get_line() + 1
def inner():
for i in xrange(start, stop):
yield buffer.get_iter_at_line(i)

return inner

def get_bounds(editor):
if editor.buffer.get_has_selection():
start, end = editor.buffer.get_selection_bounds()
if start.ends_line():
start.set_line(start.get_line() + 1)

if end.starts_line():
end.set_line(end.get_line() - 1)

return start, end
else:
cursor = editor.cursor
return cursor, cursor.copy()

def line_is_hashed(iter):
text = get_line_text(iter).strip()
return not text or text[0] == u'#'

def get_line_text(iter):
if not iter.starts_line():
iter = iter.copy()
iter.set_line(iter.get_line())

end = iter.copy()
if not end.ends_line():
end.forward_to_line_end()

return iter.get_text(end)

def line_is_empty(iter):
return get_line_text(iter).strip() == u''

def comment_range(editor, traversor):
editor.buffer.begin_user_action()
for iter in traversor():
editor.buffer.insert(iter, u'#')

editor.buffer.end_user_action()

def uncomment_range(editor, traversor):
editor.buffer.begin_user_action()
for iter in traversor():
if not line_is_empty(iter):
editor.buffer.delete(*iter.forward_search(u'#', gtk.TEXT_SEARCH_VISIBLE_ONLY))

editor.buffer.end_user_action()

0 comments on commit de419b0

Please sign in to comment.