本站不兼容 8 以前的版本的 Interner Explorer 浏览器(或基于这些版本的 IE 的其他浏览器),并且页面样式不完全兼容 IE 8,我们建议你升级至 IE 9 或改用其他非 IE 浏览器

Mozest™

  • 正在加载用户菜单…

开放、分享、互助

转播到腾讯微博
返回列表 回复 发帖

[交流] 关于绿色化firefox4及pentadactyl路径的问题

本帖最后由 mrfox 于 2012-5-18 10:48 编辑

理论上这个问题高手们已经解决,但我一直没开明白和搞定,故单独提出——而没在交流贴里。

0. aryeah在他的博客www.slimeden.com的试用记http://www.slimeden.com/2011/03/firefox/pentadactyl里首先就说到这个问题,我照做后遇到的问题就是pentadactyl就是不在Firefox的profile下,而是在系统的C盘。比如我用的Win7,WIN+R后用d:\tool\nettool\firefox\firefox.exe -no-remote -P pentadactyl -pentadactyl "++cmd 'js services.environment.set("HOME", services.directory.get("ProfD", Ci.nsIFile).path)'"后系统提示信息如图

:scriptnames后如图
注:这里面有个小插曲,就是最后的单引号和双引号是能互换的,对执行没影响,报错都是一样的,交流贴里两种写法都有,为什么?不明白。

1.为了重新验证不是系统垃圾的问题,我将fox下的pentadactyl目录和_pentadactylrc一并删除。然后运行d:\tool\nettool\firefox\firefox.exe -profilemanager来删除配置文件,奇怪的是我的配置文件有两个

删除时提示目录都一样,一狠心,全删除之。同时怕旧的目录的里的文件有影响,重新在D盘新建了pentadactyl目录来放新配置如图

启动一次后退出。再WIN+R运行d:\tool\nettool\firefox\firefox.exe -profile d:\pentadactyl -pentadactyl "++cmd 'js services.environment.set("HOME", services.directory.get("ProfD", Ci.nsIFile).path)'"来启动Firefox,没有用教程里说的-no-remot -p的原因是它出来的还是配置管理器(在firefox官网查启动参数没找到-no-remote的相关内容都,不知是不是我搜索问题,后来看其他帖子说是多实例运行,那加不加倒也无所谓)。然后安装上最新的pentadactyl(目前是hg6127)。到这为止,教程里的安装部分就完成了。这时C:\Users\foxh目录下出现了pentadactyl的目录,但rc还没有出现。:scriptnames的结果是No sourced scripts found.

2.教程的第二部分是配置,我继续用d:\tool\nettool\firefox\firefox.exe -profile d:\pentadactyl -pentadactyl "++cmd 'js services.environment.set("HOME", services.directory.get("ProfD", Ci.nsIFile).path)'"来启动,这时就出现了报错,
看报错应该是目录多了一个斜杠。

我花了一下午的时间翻完了交流贴,其中相关的楼层是:
206:weide写的启动参数与aryeah是相同的,除了最后的单双引号的先后。
321: harnack写的是init文件,希望用启动命令就能解决,所以没试。
389:tuantuan给出的命令跟教程相同。
392:在本楼教程的作者问了tuantuan不往rc里存的问题,395楼tuantuan回答说他是直接打开编辑rc来弄的。其实按教程配置的第2步应该是用:mkp生成一个rc,但是我现在还没HOME,上哪去弄rc呢。直接:mkp后再度:scriptnames的结果还是No sourced scripts found,但是实际上C:\Users\fox下已经出现了_pentadactylrc,嗯,这时我已经昏倒了~~~
648:yhmybsy在回答我的问题时给出了方法3,还给出了isssue的链接(我没看懂抱歉)。在firefox里按完:号,再把这两行逐行复制进去执行,第一句没反应,第二句报错如前。
653:本楼教程的作者给出了方法1和方法2,其中方法2就是教程里写到的方法。因此要试一下方法1,运行后继续报错如图

请大家帮着看看我哪错了,我应该是按教程走的啊


BTW:请问怎么快速定位到指定楼层?我现在是手工算的
BTW2:论坛的编辑功能好奇怪,最大化后贴子内容的区域不最大化?
附件: 您所在的用户组无法下载或查看附件
你直接丢一个_pentadactylrc文件到绿色版firefox的profile目录中去,不就行了吗。
本帖最后由 mrfox 于 2011-5-22 22:20 编辑

2# yhmybsy

这是个间接的解决办法,我试过,放完了:scriptname结果是:

但是还是不明白mkp生成rc文件确定路径的方式,同时三种方法都没成功的原因也没找到
而且看这个教程的人我想同样会卡在这步吧,还是希望有个明白的说法
附件: 您所在的用户组无法下载或查看附件
你还是简单说明一下你想做啥吧。
简单说我想知道报这两个错的原因

1.


2.
附件: 您所在的用户组无法下载或查看附件
简单说我想知道报这两个错的原因

1. 24523


2. 24524
mrfox 发表于 2011-5-22 22:34
1.是因为HOME没有正确设置
从楼主描述,你使用的:-pentadactyl "++cmd 'js services.environment.set("HOME", services.directory.get("ProfD", Ci.nsIFile).path)'"
这种写法我试了下不能得到正确的结果;同时也不像你说得的--最后的单引号和双引号是能互换的,对执行没影响--这个得和前面配对才行
你拷贝下面代码试试:注意包围HOME等变量的是两个单引号,而不是双引号
-pentadactyl "++cmd 'js services.environment.set(''HOME'', services.directory.get(''ProfD'', Ci.nsIFile).path)'"

2.大概是因为如上HOME没有正确设置,导致未找到配置文件,尝试直接把_pentadactylrc文件放到firefox配置文件中,即你新建的d:\pentadactyl
本帖最后由 mrfox 于 2011-5-23 22:48 编辑

6# weide

谢谢答复,我晚上回去试试,互换的事儿是真的,我回去截图,我是试了数次才确认的。然后在本楼更新

update:
这是Weide在交流贴中的206楼的截图

这是aryeah的blog中试用记开头的截图


可以注意到两个结尾是有差异的,weide的是先单后双,aryeah的是先双后单
附件: 您所在的用户组无法下载或查看附件
1.是因为HOME没有正确设置
从楼主描述,你使用的:-pentadactyl "++cmd 'js services.environment.set("HOME", services.directory.get("ProfD", Ci.nsIFile).path)'"
这种写法我试了下不能得到正确的结果;同时也 ...
weide 发表于 2011-5-23 09:55
HOME和ProfD两边应该是分别被两对单引号括起来,不是双引号
我的blog,我写的脚本都在这里更新,欢迎提建议、需求和报告bug
本帖最后由 mrfox 于 2011-5-23 22:42 编辑

8# aryeah

原来是两个单引号,我好奇刚才又回到你的博客用页面自带的复制功能,复制到剪贴板,确认写的是双引号——除非网页复制到系统能自动转换??
1. 点击出来的复制功能
2. 贴到剪贴板后与原文放大对照

3.单独的剪贴板,这个我不知道如何弄(不会录视频),我的办法是用光标向右走,现在是向右一下就过了,说明是双引号,要是两个单引号应该过两次才能过去对不


是不是就是win7的毛病呢,复制的时候它自动把两个单引号转成了一个双引号?
附件: 您所在的用户组无法下载或查看附件
本帖最后由 mrfox 于 2011-5-23 23:27 编辑

在本楼汇报下晚上重新测试的结果

1. 准备工作,删除各种配置并重建profile





2. 按aryeah教程运行命令

得到报错


3. 复制weide在本贴六楼给的新代码运行

没有报错



BTW:
我在顶楼提到

我在COPY命令到”开始——运行“后,把最后的两个引号交换位置再次运行,确实是对执行没有影响,这个没报错的交换后也能运行,还是没报错

综上所述,weide和aryeah说得都对,应该是两个单引号,但由于我目前还不知道的原因,在复制过程中它出了错,造成教程的会报错,直接复制weide的新命令行(就是改好了的引号)就不会报错。

但是,即使是不会报错的这个,安装完pentadactyl后,:scriptnames的回答也是

因此只能按照weide在六楼给出的以及yhmybsy说的直接放一个_pentadactylrc文件过去解决

由于不甘心,我map了两个键后mkp!了下,直接:scriptnames还是提示没有rc,但实际上rc已经生成了,重启一次就好了,至此,问题解决
附件: 您所在的用户组无法下载或查看附件
本帖最后由 mrfox 于 2011-5-23 23:36 编辑

总结:
1. 问题的症结是参数中间看似双引号的实际上是两个单引号
2. 参数结尾是一个单引号一个双引号,顺序没关系,不影响运行
3. 正确的命令参数请直接复制6楼的
4. 教程里的复制出来会报错,因此还是看6楼的吧
5. 可以不手工放入rc解决,直接mkp个新的,它会生成在正确的目录里,但想pentadactyl认它,需要重启一次Firefox


谢谢LS各位高手的指导
我已经被楼主的钻研精神弄晕了。
楼主的钻研精神的确在mozest数一数二,不过我也很好奇为啥要用两个单引号呢?

至于mkp以后:scrip显示不出来倒是可以理解,:scrip显示的是"all sourced script names",刚生成的rc还没有被source过,所以得重启才能显示出来。
听老人说,今生做千件好事,来世方能讨生为猫。
@yhmybsy  要是有你一半的水平,我可能就不费劲“钻研”了哈,归根到底还是笨

@harnack  你又解答了一个疑问,看来就剩下这条命令的是怎么写出来的了,要是help里有就好了

BTW:help要是能全文搜索就好了——还是我没发现?比如搜索一下所有$HOME出现的地方看看有没有写
@yhmybsy  要是有你一半的水平,我可能就不费劲“钻研”了哈,归根到底还是笨

@harnack  你又解答了一个疑问,看来就剩下这条命令的是怎么写出来的了,要是help里有就好了

BTW:help要是能全文搜索就好了——还是 ...
mrfox 发表于 2011-5-24 00:32
你高看我了,是坛子里面各位前辈写的插件给了我很多参考。

全文搜索我是用 :helpall 之后,按 / 搜索。
总结:
1. 问题的症结是参数中间看似双引号的实际上是两个单引号
2. 参数结尾是一个单引号一个双引号,顺序没关系,不影响运行
3. 正确的命令参数请直接复制6楼的
4. 教程里的复制出来会报错,因此还是看6楼的吧
5.  ...
mrfox 发表于 2011-5-23 23:32
5. ...

用 :rehash
楼主的钻研精神的确在mozest数一数二,不过我也很好奇为啥要用两个单引号呢?
harnack 发表于 2011-5-24 00:04
-pentadactyl "++cmd 'js services.environment.set(''HOME'', services.directory.get(''ProfD'', Ci.nsIFile).path)'"
最外层的一对双引号所包围的内容是pentadactyl的参数,启动时需要处理的内容
内部的最外层的一对单引号之内的内容是要执行的命令
最终要执行的命令其实是
:js services.environment.set('HOME', services.directory.get('ProfD', Ci.nsIFile).path)
--因为这部分内容被放在了一对单引号之内,所以需要按照javascript的字符串写法处理一下

因为javascript的字符串既可以用单引号也可以用双引号来引用,所以命令可以写成这样(直接在pentadactyl命令行执行,注意两个变量用双引号引用):
:js services.environment.set("HOME", services.directory.get("ProfD", Ci.nsIFile).path)
启动参数也可以写成这样(双引号出现在字符串中也必须变成两个):
-pentadactyl "++cmd 'js services.environment.set(""HOME"", services.directory.get(""ProfD"", Ci.nsIFile).path)'"
-pentadactyl "++cmd ""js services.environment.set('HOME', services.directory.get('ProfD', Ci.nsIFile).path)"""

从原理上说下面写法也应该是可行的,但试了下不行--也许pentadactyl/firefox4不能使用单引号作为字符串参数的最外层符号,只能使用双引号?
-pentadactyl '++cmd "js services.environment.set(""HOME"", services.directory.get(""ProfD"", Ci.nsIFile).path)"'
-pentadactyl '++cmd "js services.environment.set(''HOME'', services.directory.get(''ProfD'', Ci.nsIFile).path)"'

我理解这个是字符串的三层嵌套,但作者是怎么处理的,得看了源码才能知道了。比如:
下面这个写法,我认为也应该是可行的,但是不行:
-pentadactyl "++cmd ""js services.environment.set(""""HOME"""", services.directory.get(""""ProfD"""", Ci.nsIFile).path)"""

还有楼主多次提到的”2. 参数结尾是一个单引号一个双引号,顺序没关系,不影响运行“,我想当然认为这是不可能的,但试了一下之后,果然不影响运行,这让我感觉很惊奇……
本帖最后由 yhmybsy 于 2011-5-24 18:16 编辑

在给三种写法
  1. -pentadactyl "++cmd 'js services.environment.set(\"HOME\", services.directory.get(\"ProfD\", Ci.nsIFile).path)'"
  2. -pentadactyl '++cmd "js services.environment.set(\"HOME\", services.directory.get(\"ProfD\", Ci.nsIFile).path)"'
  3. -pentadactyl '++cmd js\ services.environment.set(\"HOME\",services.directory.get(\"ProfD\",Ci.nsIFile).path)'
复制代码
本帖最后由 yhmybsy 于 2011-5-24 18:22 编辑
从原理上说下面写法也应该是可行的,但试了下不行--也许pentadactyl/firefox4不能使用单引号作为字符串参数的最外层符号,只能使用双引号?
-pentadactyl '++cmd "js services.environment.set(""HOME"", services.directory.get(""ProfD"", Ci.nsIFile).path)"'
-pentadactyl '++cmd "js services.environment.set(''HOME'', services.directory.get(''ProfD'', Ci.nsIFile).path)"'
关于
  1. -pentadactyl '++cmd "js services.environment.set(""HOME"", services.directory.get(""ProfD"", Ci.nsIFile).path)"'
复制代码
第一步经过-pentadactyl处理出来的字串是:
  1. ++cmd "js services.environment.set(""HOME"", services.directory.get(""ProfD"", Ci.nsIFile).path)"
复制代码
之后++cmd处理,

     *     '-quoted strings   - only ' and \ itself are escaped
     *     "-quoted strings   - also ", \n and \t are translated
     *     non-quoted strings - everything is taken literally apart from "\
     *                          " and "\\"
我不太喜欢双(单/双)引号的这种诡计(其实是我不知道js的这个特性,-_-)。
8# aryeah

原来是两个单引号,我好奇刚才又回到你的博客用页面自带的复制功能,复制到剪贴板,确认写的是双引号——除非网页复制到系统能自动转换??
1. 点击出来的复制功能24538
2. 贴到剪贴板后与原文放大对照2 ...
mrfox 发表于 2011-5-23 21:45
呵呵,辛苦你了,我写错了,回头我改
我的blog,我写的脚本都在这里更新,欢迎提建议、需求和报告bug
-pentadactyl "++cmd 'js services.environment.set(''HOME'', services.directory.get(''ProfD'', Ci.nsIFile).path)'"
最外层的一对双引号所包围的内容是pentadactyl的参数,启动时需要处理的内容
内部的最外层 ...
weide 发表于 2011-5-24 11:00
非常感谢weide的详细解释,我大概搞明白了,原来这里引号多重嵌套所以必须转义。以前只知道可以用yhmybsy所说的\"进行转义,没想到还能这样两个放在一起实现转义。
听老人说,今生做千件好事,来世方能讨生为猫。
-pentadactyl "++cmd 'js services.environment.set(""HOME"", services.directory.get(""ProfD"", Ci.nsIFile).path)'"
-pentadactyl "++cmd ""js services.environment.set('HOME', services.directory.get('ProfD', Ci.nsIFile).path)"""
这两个为什么会生效呢?我觉得好奇怪。
-pentadactyl怎么知道它的参数值应该断在哪呢,为什么不是
  1. -pentadactyl "++cmd 'js services.environment.set("
复制代码
  1. -pentadactyl "++cmd "
复制代码
我的blog,我写的脚本都在这里更新,欢迎提建议、需求和报告bug
-pentadactyl "++cmd 'js services.environment.set(''HOME'', services.directory.get(''ProfD'', Ci.nsIFile).path)'"
最外层的一对双引号所包围的内容是pentadactyl的参数,启动时需要处理的内容
内部的最外层 ...
weide 发表于 2011-5-24 11:00
javascript里面好像没有用两个单引号/双引号来转义的吧
我感觉这个“两个单引号”是window快捷方式里面参数传递时对引号有特殊处理
我的blog,我写的脚本都在这里更新,欢迎提建议、需求和报告bug
本帖最后由 harnack 于 2011-5-24 23:50 编辑

看到aryeah的回复,查了下果真有人说windows对引号转义的办法就是直接把它写上两次,我自己试了下似乎的确如此:



这下大概能明白weide的代码了。按我的理解,weide的写法用的是用windows的转义方法,yhmybsy给出的则是用JS的转义方法。不过yhmybsy给出的第三种写法仍然无法理解,js\是啥意思呢?
附件: 您所在的用户组无法下载或查看附件
听老人说,今生做千件好事,来世方能讨生为猫。
本帖最后由 yhmybsy 于 2011-5-25 00:12 编辑
看到aryeah的回复,查了下果真有人说windows对引号转义的办法就是直接把它写上两次,我自己试了下似乎的确如此:

24563

这下大概能明白weide的代码了。按我的理解,weide的写法用的是用windows的转义方法,yhmybsy ...
harnack 发表于 2011-5-24 23:48
^_^ echo '++cmd js\ services.environment.set(\"HOME\",services.directory.get(\"ProfD\",Ci.nsIFile).path)'
++cmd js\ services.environment.set(\"HOME\",services.directory.get(\"ProfD\",Ci.nsIFile).path)



以dict -e 为例,假如有一个引擎是"a b"
dict -e a\ b
dict -e "a b"
dict -e 'a b' 这三种写法都合法。

其实++cmd是类似于-e的,一个选项(参数?)

比如 :rehash ++cmd js\ alert(\"hello\ world\")
:rehash ++cmd 'js alert("hello world")'
:rehash ++cmd "js alert('hello world')"


     *     '-quoted strings   - only ' and \ itself are escaped
     *     "-quoted strings   - also ", \n and \t are translated
     *     non-quoted strings - everything is taken literally apart from "\
     *                          " and "\\"
本帖最后由 yhmybsy 于 2011-5-25 00:13 编辑

我还以为双引号转义是js特性呢。用双(单/双)引号处理可能不同平台会有些区别。
这个问题,我一直也想知道的,主要用途是带去网吧玩。
怪自己悟性差 囧  收藏下,有空慢慢看看,慢慢消化下。
本帖最后由 harnack 于 2011-5-25 02:20 编辑
^_^ echo '++cmd js\ services.environment.set(\"HOME\",services.directory.get(\"ProfD\",Ci.nsIFile).path)'
++cmd js\ services.environment.set(\"HOME\",services.directory.get(\"ProfD\",Ci.nsIFile).path ...
yhmybsy 发表于 2011-5-25 00:05
多谢解释,终于有点明白了。说实话真想不到a\ b和"a b"居然是一个效果,原来js\ 里面的\是在对后面的空格进行转义(如果我没理解错的话)。另外最后的那段说明我遍寻不着,原来是在commands.jsm里,这几句倒是比帮助里写的明白,帮助里罗哩罗嗦写了几段倒把人给看晕了。

对这种加载配置文件的方式我还有个疑惑:假定我用这种方法启动Pentadactyl,然后用:res重启Firefox,这时还能正确加载配置文件吗?
听老人说,今生做千件好事,来世方能讨生为猫。
多谢解释,终于有点明白了。说实话真想不到a\ b和"a b"居然是一个效果,原来js\ 里面的\是在对后面的空格进行转义(如果我没理解错的话)。另外最后的那段说明我遍寻不着,原来是在commands.jsm里,这几句倒是比帮 ...
harnack 发表于 2011-5-25 02:19
:rest后也可以正确加载
我的blog,我写的脚本都在这里更新,欢迎提建议、需求和报告bug