如何向后视觉选择计算?

2023-12-03

我想直观地向后选择计算 p.e.

200 + 3 This is my text -300 +2 + (9*3)
                        |-------------|*

This is text 0,25 + 2.000 + sqrt(15/1.5)
             |-------------------------|*

原因是我会在插入模式下使用它。 编写计算后,我想选择计算(使用地图)并将计算结果放入文本中。

正则表达式必须做的是:
- 从光标处选择(参见*在上面的例子中)向后到计算的开始
(包括\/-+*:.,^).
- 计算只能从 log/sqrt/abs/round/ceil/floor/sin/cos/tan 或正数或负数开始
- 计算也可以从行的开头开始,但永远不会回到 前一行

我尝试了各种方法但找不到正确的正则表达式。
我注意到向后搜索与向前搜索不同。

有人能帮我吗?

Edit
忘记说了,一定要include如果有一个并且“=”位于光标之前或者光标和“=”之间只有空格,则还有“=”。
它不能包含其他“=”符号。

200 + 3 = 203 -300 +2 + (9*3) =
          |-------------------|<SPACES>*

200 + 3 = 203 -300 +2 + (9*3)
          |-----------------|<SPACES>*

*= 光标所在位置


接近纯 vim 的正则表达式是

\v\c\s*\zs(\s{-}(((sqrt|log|sin|cos|tan|exp)?\(.{-}\))|(-?[0-9,.]+(e-?[0-9]+)?)|([-+*/%^]+)))+(\s*\=?)?\s*

There are limitations: subexpressions (including function arguments) aren't parsed. You'd need to use a proper grammar parser to do that, and I don't recommend doing that in pure vim1

运营商映射

要像文本对象一样使用它,请在 $MYVIMRC 中使用类似的内容:

func! DetectExpr(flag)
    let regex = '\v\c\s*\zs(\s{-}(((sqrt|log|sin|cos|tan|exp)?\(.{-}\))|(-?[0-9,.]+(e-?[0-9]+)?)|([-+*/%^]+)))+(\s*\=?)?\s*' 
    return searchpos(regex, a:flag . 'ncW', line('.'))
endf

func! PositionLessThanEqual(a, b)
    "echo 'a: ' . string(a:a)
    "echo 'b: ' . string(a:b)
    if (a:a[0] == a:b[0])
        return (a:a[1] <= a:b[1]) ? 1 : 0
    else
        return (a:a[0] <= a:b[0]) ? 1 : 0
    endif
endf

func! SelectExpr(mustthrow)
    let cpos  = getpos(".")
    let cpos  = [cpos[1], cpos[2]] " use only [lnum,col] elements
    let begin = DetectExpr('b')
    if ( ((begin[0] == 0) && (begin[1] == 0))
      \ || !PositionLessThanEqual(begin, cpos) )
        if (a:mustthrow)
            throw "Cursor not inside a valid expression"
        else
            "echoerr "not satisfied: " . string(begin) . " < " . string(cpos)
        endif
        return 0
    endif
    "echo "satisfied: " . string(begin) . " < " . string(cpos)

    call setpos('.', [0, begin[0], begin[1], 0])
    let end = DetectExpr('e')
    if ( ((end[0] == 0) || (end[1] == 0))
      \ || !PositionLessThanEqual(cpos,  end) )
        call setpos('.', [0, cpos[0], cpos[1], 0])
        if (a:mustthrow)
            throw "Cursor not inside a valid expression"
        else
            "echoerr "not satisfied: " . string(begin) . " < " . string(cpos) . " < " . string(end) 
        endif
        return 0
    endif
    "echo "satisfied: " . string(begin) . " < " . string(cpos) . " < " . string(end) 

    norm! v
    call setpos('.', [0, end[0],   end[1],   0])
    return 1
endf

silent! unmap X
silent! unmap <M-.>

xnoremap <silent>X :<C-u>call SelectExpr(0)<CR>
onoremap <silent>X :<C-u>call SelectExpr(0)<CR>

现在您可以对光标位置周围(或之后)最近的表达式进行操作:

  • vX - [v]isually select e[X]pression
  • dX - [d]elete current e[X]pression
  • yX - [y]ank current e[X]pression
  • "ayX - id. to register a

作为一个技巧,使用以下方法从 OP 中获得准确的 ASCII 艺术(使用虚拟编辑出于演示目的):

插入模式映射

回复聊天:

" if you want trailing spaces/equal sign to be eaten:
imap <M-.> <C-o>:let @e=""<CR><C-o>"edX<C-r>=substitute(@e, '^\v(.{-})(\s*\=?)?\s*$', '\=string(eval(submatch(1)))', '')<CR>

" but I'm assuming you wanted them preserved:
imap <M-.> <C-o>:let @e=""<CR><C-o>"edX<C-r>=substitute(@e, '^\v(.{-})(\s*\=?\s*)?$', '\=string(eval(submatch(1))) . submatch(2)', '')<CR>

allows you to hit Alt-. during insert mode and the current expression gets replaced with it's evaluation. The cursor ends up at the end of the result in insert mode.

200 + 3 This is my text -300 +2 + (9*3)

This is text 0.25 + 2.000 + sqrt(15/1.5)

Tested by pressing Alt-. in insert 3 times:

203 This is my text -271

This is text 5.412278

娱乐:ascii 艺术

vXoyoEsc`<jPvXr-r|e.

自己轻松测试一下:

:let @q="vXoyo\x1b`<jPvXr-r|e.a*\x1b"
:set virtualedit=all

Now you can @q anywhere and it will ascii-decorate the nearest expression :)

200 + 3 = 203 -300 +2 + (9*3) =
|-------|*
          |-------------------|*

200 + 3 = 203 -300 +2 + (9*3)
          |-----------------|*
|-------|*

This is text 0,25 + 2.000 + sqrt(15/1.5)
             |-------------------------|*

1 consider using Vim's python integration to do such parsing

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何向后视觉选择计算? 的相关文章

  • Vim + tmux + WSL 在导航文档时显示方块和奇怪的字符

    我可以在 Windows Ubuntu 子系统中使用 vim 没有任何问题 然后 当在 tmux 中运行 Vim 并输入文本时 大多数字符都会显示为奇怪的方块 里面有引号而不是实际的字母 这是 vim 文本的屏幕截图 1 在 tmux 中突
  • 什么时候在“strsplit”中设置“perl=TRUE”不起作用(按预期或根本不起作用)?

    我只是在尝试优化一些代码时做了一些基准测试并观察到strsplit with perl TRUE is faster比跑步strsplit with perl FALSE 例如 set seed 1 ff lt function paste
  • Vim - 在插入模式下删除行

    我可以在插入模式下删除一行吗 因为目前我必须按
  • 删除emacs中多余的空行

    M x flush lines 删除缓冲区中的所有空白行 但是我只想删除多余的空白行 也就是说 如果有n个连续的空白行我想删除n 1并保留一个 我知道删除空白行可以完成该点下的空白行的工作 但是我想要一个适用于整个缓冲区的简单解决方案 有什
  • 请解释*贪婪量词的工作原理

    Pattern ptn Pattern compile a Matcher mtch ptn matcher bbaac if mtch find System out println mtch group 输出 不打印任何内容 Patte
  • Java 中查看 ArrayList 是否包含对象的最有效方法

    我有一个 Java 对象的 ArrayList 这些对象有四个字段 我用其中两个字段来将对象视为与另一个对象相等 我正在寻找最有效的方法 给定这两个字段 以查看数组是否包含该对象 问题在于这些类是基于 XSD 对象生成的 因此我无法修改类本
  • 如何在Python字符串中替换括号及其中的文本

    我有两个这样的字符串 string1 Today I went to the market to pick up some fruit string2 Today I went to school to learn algebra and
  • 正则表达式,提取不在两个括号之间的字符串

    好的正则表达式问题 如何提取不在两个字符之间的字符 在本例中是括号 我有一个字符串 例如 字1 字2 字3 字 4 我只想获取第一个和最后一个 管道 而不是括号之间的第二个 管道 我已经尝试了无数次负克拉和负分组的尝试 但似乎无法使其发挥作
  • Vim 自动缩进换行

    我如何让vim将光标放在大括号内以新行开始 即用 表示光标位置 class 现在我的设置只能做到这一点 class 我在 vimrc 文件中得到了这个 设置自动缩进 shiftwidth 2 tabstop 2 noexpandtab 基本
  • 如何使用正则表达式验证带有可选百分比符号的小数?

    正如问题的标题 我需要使用以下值验证正则表达式 最多 2 个小数位和 9 个整数 带有可选的百分比符号 Valid 10 0 1111111 12 15 2 10 2 3 Invalid 12 02 123456789123 123 I t
  • Spark SQL 中的 SQL LIKE

    我正在尝试使用 LIKE 条件在 Spark SQL 中实现联接 我正在执行连接的行看起来像这样 称为 修订 Table A 8NXDPVAE Table B 4 8 NXD V 在 SQL Server 上执行联接 A revision
  • 与有效正则表达式匹配的正则表达式

    是否存在与有效正则表达式匹配的正则表达式 我知道正则表达式有多种风格 其中一种就可以了 是否存在与有效正则表达式匹配的正则表达式 根据定义 它非常简单 No 所有正则表达式的语言是no regular语言 只需查看嵌套括号 因此不可能有re
  • 使用正则表达式提取两个短语之间的所有单词[重复]

    这个问题在这里已经有答案了 我正在尝试使用以下正则表达式提取两个短语之间的所有单词 b item W w W 0 2 1 one W w W 0 3 business b b item W w W 0 2 3 three W w W 0 3
  • Android:如何从网络异步获取搜索建议?

    我创建了一个可搜索的活动 现在 我想添加从网络服务获取的搜索建议 我想异步获取这些建议 根据添加自定义建议 http developer android com guide topics search adding custom sugge
  • 忽略正则表达式匹配的空格

    我需要匹配 8 个或更多数字 其序列可以包含空格 例如 以下所有内容都是有效匹配 12345678 1 2345678 12 3 45678 1234 5678 12 34567 8 1 2 3 4 5 6 7 8 此刻我有 d 8 但这只
  • Javascript正则表达式单引号

    我的正则表达式是 var re a z A Z 1 15 我想允许这样 单引号 我怎样才能做到这一点 例如 您可以使用以下正则表达式来允许类似的字符串abcd dfgh A Za z A Za z
  • 提取部分字符串值,创建新的列名称,并使数据框宽

    我想提取字符串列的最后一部分 始终用方括号括起来 将它们作为新列的名称 然后将数据从长调整为宽 并用这些值填充新列 例如 如果我有这个数据框 whatihave lt data frame v1 c abc effort def effor
  • 使用 URL 参数 ID 编号范围进行 HTACCESS 重定向

    我希望有人可以提供帮助 因为事实证明这很难弄清楚 我试图通过 HTACCESS 和 mod rewrite 重定向许多 URL 参数 ID 值在特定范围内 从 1 到 7603 的页面 这是我到目前为止所拥有的
  • 是否存在永远不会匹配任何字符串的正则表达式? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 捕获 XSS(跨站脚本)攻击的最佳正则表达式(Java 中)?

    杰夫实际上在净化 HTML http refactormycode com codes 333 sanitize html 但他的示例是用 C 编写的 而我实际上对 Java 版本更感兴趣 有人有更好的 Java 版本吗 他的示例是否足以直

随机推荐