我有一个形式的结构:
>>> items
[([[0, 1], [2, 20]], 'zz', ''), ([[1, 3], [5, 29], [50, 500]], 'a', 'b')]
Run Code Online (Sandbox Code Playgroud)
每个元组中的第一项是范围列表,我想创建一个生成器,它根据起始索引按升序提供范围.
由于范围列表已按其起始索引排序,因此此操作很简单:它只是一个排序合并.我希望以良好的计算效率来做到这一点,所以我认为隐式跟踪合并状态的一个好方法是简单地弹出具有最小起始索引的元组列表的前面.范围清单.
我可以min()用来获取[0, 1]我想要的第一个,但我如何得到它的索引?
我有这个:
[ min (items[i][0]) for i in range(len(items)) ]
Run Code Online (Sandbox Code Playgroud)
这给了我每个列表中的第一个项目,然后我可以min()通过某种方式,但是一旦任何列表变为空,它就会失败,并且还不清楚如何使用索引pop()而不在列表中查找它.
总结一下:想要构建为我返回的生成器:
([0,1], 'zz', '')
([1,3], 'a', 'b')
([2,20], 'zz', '')
([5,29], 'a', 'b')
([50,500], 'a', 'b')
Run Code Online (Sandbox Code Playgroud)
或者甚至更有效率,我只需要这些数据:
[0, 1, 0, 1, 1]
Run Code Online (Sandbox Code Playgroud)
(我想要采取前面项目的元组的索引)
我试图覆盖插件中的突出显示集.该插件执行此操作:
highlight! link WordUnderTheCursor Underlined
Run Code Online (Sandbox Code Playgroud)
首先,我不知道!添加highlight任何东西.但这无关紧要.
在vimrc中做这样的事情
highlight clear WordUnderTheCursor
highlight WordUnderTheCursor cterm=bold ctermfg=254 ctermbg=160
Run Code Online (Sandbox Code Playgroud)
似乎不会影响行为.
只有当我直接修改Underlinedvimrc中的样式(感觉不对)时,才会应用更改.
是否证明插件是在vimrc 运行后运行的?
我怎么能取消这种风格?我无法确定这是否只是插件做了创意和不支持的事情,或者这是否是正常的Vim行为.这是vimscript本身.
相关主题:requestAnimationFrame垃圾回收
我一直在努力为我正在为触摸设备构建的小部件中的平滑动画,我发现帮助我的一个工具是Chrome内存时间轴屏幕.
这对我在rAF循环中评估我的内存消耗有所帮助,但是我对此时在Chrome 30中观察到的行为的一些方面感到困扰.
当最初进入我的页面,其中rAF循环正在运行时,我看到了这一点. 
看起来没问题.如果我完成了我的工作并且在内循环中消除了对象分配,那么就不应该有锯齿.这是与链接主题一致的行为,也就是说,无论何时使用rAF,Chrome都会内置泄漏.(哎呀!)
当我开始在页面中执行各种操作时,它会变得更有趣.

我实际上并没有做任何不同的事情,只是暂时添加了两个元素,这些元素将CSS3 3D变换样式应用于几帧,然后我停止与它们进行交互.
我们在这里看到的是Chrome报告,突然间每个rAF发射(16ms)都会导致Animation Frame Fired x 3.
这种重复,以及它的速率,单调增加直到页面刷新.
你已经可以看到在第二撷取画面锯齿斜率从最初的跳跃之后已经大幅提升Animation Frame Fired至Animation Frame Fired x 3.
不久之后,它跳到了x 21:

似乎我的代码正在运行一大堆额外的时间,但所有额外的多次运行只是浪费热量,丢弃计算.
当我拿第三个屏幕时,我的Macbook发热非常糟糕.不久之后,在我能够将时间线擦洗到结束位(大约8分钟)以查看x数字增加到什么之前,检查员窗口变得完全没有响应,并且我被提示我的页面变得没有响应并且必须是终止.
这是页面中运行的全部代码:
// ============================================================================
// Copyright (c) 2013 Steven Lu
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without …Run Code Online (Sandbox Code Playgroud) 我一直在调试一个特别阴险的错误,我现在认为这是由于包含(或不包含)不同标头时的不同行为引起的意外更改引起的.
这不完全是我的代码结构,但让我们来看看这个场景:
#include "Newly_created_header_which_accidentally_undefines_SOME_DEFINE.h"
// ...
#ifdef SOME_DEFINE
code_which_i_believe_i_am_always_running();
#else
code_which_fails_which_i_have_forgotten_about(); // runtime error stack traces back here, but I don't know this... or maybe it's some strange linker error
#endif
Run Code Online (Sandbox Code Playgroud)
我搜索了我的git提交并缩小了bug的原因,无数次地编译和运行我的代码,只是在几个小时之后发现导致bug的唯一区别是包含看起来完全是良性的不相关的标题.
也许这是一个很好的论据,为什么预处理器基本上只是糟透了.
但我喜欢它.预处理器很酷,因为它可以让我们制作快捷方式.只是这些快捷方式中的一些,如果不小心使用,会让我们陷入困境.
所以在这个时刻,如果我可以使用一个指令#echo "Running old crashy code",这将有助于我在编译期间能够看到这一点,所以我可以立即提示我开始调查为什么没有定义SOME_DEFINE.
据我所知,确定SOME_DEFINE是否定义的直接方法是做类似的事情
#ifndef SOME_DEFINE
printf("SOME_DEFINE not defined!!\n");
Run Code Online (Sandbox Code Playgroud)
这肯定会完成工作,但没有充分的理由在运行时执行此任务,因为它完全在编译时确定.这只是我想在编译时看到的东西.
话虽这么说,在这种情况下,使用打印(或记录或甚至抛出异常)可能是可以接受的事情,因为我不会真正关心减慢或混乱可疑代码.但是,如果我有两个代码路径,这两个代码路径都很重要,那就不适用了.我只想在编译时知道哪一个被激活.我不得不担心在程序开始时运行执行预处理器条件打印的代码.
这实际上只是一个冗长的方式来问一个问题,"我可以使用预处理器指令在编译期间将字符串回显到输出吗?"
假设我有一个带有一些文本的div
<div id='page' style='width: 600px'>
<h1 style='border:2px black solid; font-size:42px;'>Title</h1>
</div>
Run Code Online (Sandbox Code Playgroud)
标题的边框将扩展页面上的所有600个像素,但我希望单词"Title"紧密贴合在里面.但是,我不知道这个词的宽度是多少像素,所以我不能将"标题"放在div中并明确设置其宽度.
有没有一种简单的方法可以使文本边框适合不完全水平延伸到某个区域?
今天早上我遇到了一个似乎是一个神秘的小虫,我觉得非常幸运,很快就偶然发现了一个解决方案.
我正在用计数器除以产生片段着色器的平均值,当然当计数器为零时,得到的颜色值变为NaN.
在混合期间,NVidia优雅地将NaN视为0值,但英特尔不会并且似乎级联NaN,从而导致黑色碎片.
所以这个bug一直存在,直到我在Intel机器上测试代码.
我想知道我能做些什么来"捕获"无效的值.看起来,就像在常规编程中一样,唯一可靠的(即使那时它也感觉不到防范)处理这种情况的方法是在划分数字时仔细考虑所有可能的情况.
检测NaN的标准方法是查看数字是否与自身不相等.我是否可以构建一个调试着色器来检查每个片段以查看它是否与自身不相等,如果满足该条件,设置一个闪烁的,显眼的颜色?GLSL是否允许我以这种方式检测NaN,或者只要值无效,我是否会遇到未定义的行为?
我有一个渲染系统,我用一个多重采样渲染缓冲区绘制到FBO,然后将其blit到另一个带有纹理的FBO,以便解析样本,以便在绘制到后缓冲区时读取纹理以执行后处理着色( FBO指数0).
现在我想获得一些正确的sRGB输出......问题是当我在OS X和Windows上运行时,程序的行为相当不一致,这也会因机器而异:在带有Intel HD的Windows上3000它不会应用sRGB非线性,但在我的其他机器上使用Nvidia GTX 670.在OS X中的Intel HD 3000上,它也将应用它.
所以这可能意味着我没有GL_FRAMEBUFFER_SRGB在程序的正确位置设置启用状态.然而,我似乎无法找到任何实际告诉我何时应该启用它的教程,他们只提到它很容易并且没有性能成本.
我目前没有加载任何纹理,所以我还没有需要处理线性化他们的颜色.
为了强制程序不要简单地吐出线性颜色值,我试过的只是注释掉我的glDisable(GL_FRAMEBUFFER_SRGB)线,这实际上意味着为整个管道启用了这个设置,我实际上是在每一帧上冗余地强制它.
我不知道这是否正确.它肯定会对颜色应用非线性化,但我不知道这是否会被应用两次(这将是不好的).当我渲染给我的第一个FBO时,它可以应用伽玛.当我把第一个FBO送到第二个FBO时,它可以做到这一点.为什么不?
我已经走到了最后一帧的屏幕截图,并将原始像素颜色值与我在程序中设置的颜色进行比较:
我将输入颜色设置为RGB(1,2,3),输出为RGB(13,22,28).
这似乎是低端的相当多的色彩压缩,并让我质疑伽玛是否被多次应用.
我刚刚通过了sRGB方程式,我可以验证转换似乎只应用一次,因为线性1/255,2/255和3/255确实映射到sRGB 13/255,22/255, 28/255使用等式1.055*C^(1/2.4)+0.055.鉴于这些低颜色值的扩展是如此之大,如果sRGB颜色变换被多次应用,那么它应该是显而易见的.
所以,我还没有确定正确的做法是什么.它glEnable(GL_FRAMEBUFFER_SRGB)仅适用于最终的帧缓冲值,在这种情况下,我只是我的GL初始化程序中设置该忘掉它以下简称?
有没有办法获得语法类型来定义键盘快捷键,或设置键盘快捷键以依赖于语法类型(可能在"context")设置?
我引用的列表'(1 2 3)就像这样输入:'(1 2 3)'因为Sublime应用了这个有用的(但不是在这种情况下)行为.
这是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 }
] …Run Code Online (Sandbox Code Playgroud) 这可能吗?
从概念上讲,解决方案应该适用于许多可能的配置,范围从在tmux窗口的窗格中的单独虚拟终端中运行的两个vim实例,到位于不同地理区域中的单独机器上的单独终端,一个或两个通过网络连接(换句话说,vims由两个独立的shell进程托管,无论如何它们已经在tmux下了.
这个案例促使我思考这个问题:
我有两个tmux面板,vim打开,我想使用Vim yank/paste来复制文件.
但它只有在我让它们都在Vim的同一个实例中运行时才有效,所以我不得不:
这有点像PITA,如果我有远见切换到已经运行vim的合适终端来打开我的文件,但是工作流程和习惯的命运很少与本来很方便的相匹配,这一切都可以避免.
所以问题是,是否存在一个命令或者是一个直接构造(shell)脚本的可能性,它允许我在独立运行的vim实例之间加入缓冲区?我很难让Google充分回答这个问题.
如果没有足够的答案(或者如果确定Vim不具备在其实例中完成缓冲区转移的特征),则可以接受上述方法3的良好实施(可与键密接).
与此同时,我将继续进一步自定义我的vim配置,并强迫自己尽可能少地使用vim实例.
我正在尝试提高Vim中粘贴功能的可用性,因为太多不同的删除操作(事实上我确实认为它们都是它们)也会被移动到粘贴缓冲区.
这意味着我不再能够删除某些文本,我想要粘贴到某个地方,清理一些东西,然后再粘贴.我不知道为什么这是我喜欢做的顺序,但我不打算改变它.
在返回清理之前,我必须"原子地"进行移动,否则我会得到令人沮丧的逗号或括号或空格.哦,我知道我之所以按照其他顺序这样做的原因.它只是更有效率.我不必移动到目的地,然后返回清理,然后再回去.
如何改善这个?我的建议是一个插件,可用于在事后增加粘贴操作.点击p,看到它粘贴了一个无用的短暂删除的字符,并且此时(粘贴操作后立即)我们的插件将允许一个键循环通过以前删除已经删除的寄存器,就地更新我们的粘贴.
通过这种方式,我可以删除我想要的所有内容,而且我实际上能够快速提取任何最近删除的项目,只要它是一个连续的段.当然,使用视觉选择和删除进行设置很容易.这使易用性具有特异性,因为我不再需要记住指定一些特定的命名寄存器来用于特定的粘贴.
特别是,应该有一个堆栈,yanks和deletes都会累积进去,后来在使用单个绑定进行粘贴时会快速遍历.
那里有插件吗?
vim ×3
html ×2
opengl ×2
c++ ×1
clojure ×1
colors ×1
css ×1
framebuffer ×1
glsl ×1
javascript ×1
layout ×1
lisp ×1
nan ×1
python ×1
quotes ×1
srgb ×1
sublimetext ×1
sublimetext2 ×1
unix ×1