Комментарии 16
А vim вроде и так это умеет…
+8
Именно так не умеет, но решается одной строкой в конфиге.
+1
Insert mode:
Ctrl+r
=
100500 + 1
Ctrl+r
=
100500 + 1
<enter>
0
А задача немного другая…
— выделяем арифметическое выражение
— нажимаем что-то
— на месте выделенного выражения видим результат вычисления
— выделяем арифметическое выражение
— нажимаем что-то
— на месте выделенного выражения видим результат вычисления
0
Emacs тоже. Правда писать придется в префиксной нотации :)
+1
Перевесил на другой хоткей — все вставляется нормально 5+5=10.
0
Плагин для Sublime Text:
import sublime, sublime_plugin
class EvalCommand(sublime_plugin.TextCommand):
def run(self, edit):
for region in self.view.sel():
if not region.empty():
s = self.view.substr(region)
self.view.replace(edit, region, str(eval(s)))
+4
Да, чтобы повесить хоткей, идём в Preferences -> Key Bindings — User и добавляем
[
...
,{
"keys": ["ctrl+shift+c"], "command": "eval", "args": {}
}
]
0
eval? Серьезно?
Если ядурак выделю строку
import os;os.system(«rm -rf ~»);
А затем нажму ctrl+shift+c?
Если я
import os;os.system(«rm -rf ~»);
А затем нажму ctrl+shift+c?
0
Ну если вы так просите
import sublime_plugin
import ast, operator as op
# supported operators
operators = {ast.Add: op.add, ast.Sub: op.sub, ast.Mult: op.mul,
ast.Div: op.truediv, ast.Pow: op.pow, ast.BitXor: op.xor}
def eval_expr(expr):
return eval_(ast.parse(expr).body[0].value)
def eval_(node):
if isinstance(node, ast.Num):
return node.n
if isinstance(node, ast.operator):
return operators[type(node)]
if isinstance(node, ast.BinOp):
return eval_(node.op)(eval_(node.left), eval_(node.right))
raise TypeError(node)
class EvalCommand(sublime_plugin.TextCommand):
def run(self, edit):
for r, s in [(r, self.view.substr(r)) for r in self.view.sel() if not r.empty()]:
self.view.replace(edit, r, str(eval_expr(s)))
+2
Хотя я бы предпочёл не терять мощь питона и делать хотя бы что-то вроде
Делаем доступными функции из модуля math. Вариант тоже немного греховный (подробнее), но совсем немного :-)
"Hello!" * 50
. Поэтому вот вариант получше:import sublime_plugin
ns = {}
ns.update(vars(__import__('math')).copy())
ns['__builtins__'] = None
class EvalCommand(sublime_plugin.TextCommand):
def run(self, edit):
for r, s in [(r, self.view.substr(r)) for r in self.view.sel() if not r.empty()]:
self.view.replace(edit, r, str(eval(s, ns)))
Делаем доступными функции из модуля math. Вариант тоже немного греховный (подробнее), но совсем немного :-)
0
$BOOFER — это круто
+6
Спасибо, исправил. В начале заметки я написал, что воспользовался частями кода из статьи imitsuran, не внося коррективы в названия переменных (да чего уже греха таить — внимания не обратил), отсюда и BOOFER.
0
Вот вам вычисление арифметических выражений в текстовом редакторе:
_12546|82 82 |---- _434 |153 410 _246 246 0
+23
Сделал аналогично средствами текстового редактора Geany, в котором работаю, правда использовал wcalc (от bc отказался по разным причинам). Хотя конечно гораздо лучше, чтобы работало везде.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Вычисление арифметических выражений в текстовом редакторе