找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 195|回复: 8

[AHK 脚本] 实现 F2 短按复制文件名,长按触发重命名操作

[复制链接]

8

主题

7237

回帖

2万

积分

超级版主

(^^ゞ

积分
20451
发表于 2024-7-8 21:14:20 | 显示全部楼层 |阅读模式
本帖最后由 S8F8ry 于 2024-7-9 13:39 编辑

实现 F2 短按复制文件名,长按触发重命名操作。

AHK v2 版本:
  1. ; 实现 F2 短按复制文件名,长按触发重命名操作
  2. ; 2024-07-09
  3. #Requires AutoHotkey v2
  4. #SingleInstance Force
  5. Persistent

  6. #HotIf WinActive("ahk_exe explorer.exe")

  7. $F2:: {
  8.   if KeyWait("F2", "T0.3") { ; 300ms
  9.     F2Handler()
  10.   } else {
  11.     SendInput "{F2}"
  12.     KeyWait "F2"
  13.   }
  14.   return
  15. }

  16. F2Handler() {
  17.   oldClip := ClipboardAll()
  18.   A_Clipboard := ""
  19.   SendInput "^{Ins}"
  20.   if !ClipWait(1) {
  21.     ; clipboard wait timeout
  22.     A_Clipboard := oldClip
  23.     return
  24.   }
  25.   SplitPath A_Clipboard, &outFilename, , , &outNameNoExt
  26.   if outFilename {
  27.     A_Clipboard := outFilename
  28.     ; 或者注释掉上面一行并移除下面一行的注释,则复制时不带文件扩展名
  29.     ; A_Clipboard := outNameNoExt
  30.   } else {
  31.     ; cannot find filename
  32.     A_Clipboard := oldClip
  33.   }
  34. }

  35. #HotIf
复制代码

AHK v1 版本:
  1. ; 实现 F2 短按复制文件名,长按触发重命名操作
  2. ; 2024-07-09
  3. #Requires AutoHotkey >=1.1 <1.2
  4. #SingleInstance Force
  5. #Persistent

  6. #IfWinActive ahk_exe explorer.exe

  7. $F2::
  8. {
  9.   KeyWait F2, T0.3 ; 300ms
  10.   if ErrorLevel
  11.   {
  12.     SendInput {F2}
  13.     KeyWait F2
  14.   }
  15.   else
  16.   {
  17.     F2Handler()
  18.   }
  19.   return
  20. }

  21. F2Handler()
  22. {
  23.   oldClip := ClipboardAll
  24.   Clipboard := ""
  25.   SendInput "^{Ins}"
  26.   ClipWait 1
  27.   if ErrorLevel
  28.   {
  29.     ; clipboard wait timeout
  30.     Clipboard := oldClip
  31.     return
  32.   }
  33.   SplitPath Clipboard, outFilename, , , outNameNoExt
  34.   if outFilename
  35.   {
  36.     Clipboard := outFilename
  37.     ; 或者注释掉上面一行并移除下面一行的注释,则复制时不带文件扩展名
  38.     ; Clipboard := outNameNoExt
  39.   }
  40.   else
  41.   {
  42.     ; cannot find filename
  43.     Clipboard := oldClip
  44.   }
  45. }

  46. #IfWinActive
复制代码
¯\(°_o)/¯
回复

使用道具 举报

40

主题

339

回帖

2277

积分

金牌会员

积分
2277
发表于 2024-7-9 19:33:26 | 显示全部楼层
  赞一个!

问下 $F2 前面的 $ 是什么意思,加和不加有什么区别?
另外ctrl+{Ins}第一次见啊,为什么不用常见的ctrl+c呢,实际上第22行替换成 SendInput "^c" 也没发现问题。
回复

使用道具 举报

11

主题

31

回帖

243

积分

中级会员

积分
243
发表于 2024-7-9 20:22:51 | 显示全部楼层
同问,顺便再问问最后#IfWinActive可以删除吗,最后不用加return吗
回复

使用道具 举报

8

主题

7237

回帖

2万

积分

超级版主

(^^ゞ

积分
20451
 楼主| 发表于 2024-7-9 22:09:13 | 显示全部楼层
coult3 发表于 2024-7-9 19:33
赞一个!

问下 $F2 前面的 $ 是什么意思,加和不加有什么区别?

加 $ 是由于后续可能会用 SendInput 发送 F2 按键自身,这可以避免触发它自身。Ctrl+Ins / Shift+Ins 是在终端里常用的复制/粘贴操作,只是我单纯用习惯了而已,在这里用 Ctrl+C 应该不会有区别。
¯\(°_o)/¯
回复

使用道具 举报

8

主题

7237

回帖

2万

积分

超级版主

(^^ゞ

积分
20451
 楼主| 发表于 2024-7-9 22:19:25 | 显示全部楼层
cb112 发表于 2024-7-9 20:22
同问,顺便再问问最后#IfWinActive可以删除吗,最后不用加return吗

"#IfWinActive/#HotIf" 等是用来关闭热键的上下文的,如果你脚本里只有这些代码,那删掉也不会有影响。但是如果你还整合了其他代码,尤其将它们放置此代码之后的话,若没有关闭热键上下文,那它们也只会在 explorer.exe 中才能生效,这通常就不会是预期中的想要的效果了。至于 return,热键的处理块中已经有 retrun 了呀。
¯\(°_o)/¯
回复

使用道具 举报

11

主题

31

回帖

243

积分

中级会员

积分
243
发表于 2024-7-10 00:33:26 | 显示全部楼层
S8F8ry 发表于 2024-7-9 22:19
"#IfWinActive/#HotIf" 等是用来关闭热键的上下文的,如果你脚本里只有这些代码,那删掉也不会有影响。但 ...

v1开头345行的作用是什么,如果把第7行提前作为多段代码大前提,还需要345行吗,位置也不用变吗
回复

使用道具 举报

8

主题

7237

回帖

2万

积分

超级版主

(^^ゞ

积分
20451
 楼主| 发表于 2024-7-10 13:04:28 | 显示全部楼层
cb112 发表于 2024-7-10 00:33
v1开头345行的作用是什么,如果把第7行提前作为多段代码大前提,还需要345行吗,位置也不用变吗 ...

- "#Requires AutoHotkey >=1.1 <1.2" 是声明脚本仅在 AHK v1 下工作,如果你的电脑上仅安装了 AHK v1 版本,那可以不需要。
- "#SingleInstance Force" 是只允许运行单个脚本实例,如果你再运行一次此脚本则会替换旧实例(只针对此脚本,其他不同脚本是否允许多实例也由它们的内部指令决定),一般的 AHK 脚本都会加这一行。
- "#Persistent" 是让脚本持续运行,一般的 AHK 脚本也都会加这一行。

这些指令都是放置脚本头部的,如果有整合其他代码的话,除非有特殊需求,例如需要允许运行同一个脚本的多个实例,否则保留即可。或者将 "#IfWinActive ahk_exe explorer.exe ... #IfWinActive" 这部分内容丢到其他脚本尾部也行。
¯\(°_o)/¯
回复

使用道具 举报

40

主题

339

回帖

2277

积分

金牌会员

积分
2277
发表于 2024-7-10 15:46:46 | 显示全部楼层
S8F8ry 发表于 2024-7-9 22:09
加 $ 是由于后续可能会用 SendInput 发送 F2 按键自身,这可以避免触发它自身。Ctrl+Ins / Shift+Ins 是 ...

明白了,感谢超版,我也试着写了一个。

F2说:SplitPath是个好函数,但我用原生ctrl+c和ctrl+a,缺点是会有一闪而过的蓝色。
  1. ; 实现 F2 短按复制文件名,长按触发重命名操作
  2. #Requires AutoHotkey v2.0
  3. #SingleInstance

  4. #HotIf WinActive("ahk_exe explorer.exe")

  5. $F2:: {
  6.   if KeyWait("F2", "T0.3") { ;300ms
  7.     Send "{F2}"
  8.         send "^a"
  9.         send "^c"
  10.         send "{ESC}"
  11.   } else {
  12.     SendInput "{F2}"
  13.     KeyWait "F2"
  14.   }
  15.   return
  16. }

  17. #HotIf
复制代码
回复

使用道具 举报

40

主题

339

回帖

2277

积分

金牌会员

积分
2277
发表于 2024-7-10 16:16:24 | 显示全部楼层
F2说:SplitPath是个好函数,但我选择 StrSplit

  1. ; 实现 F2 短按复制文件名,长按触发重命名操作
  2. #Requires AutoHotkey v2.0
  3. #SingleInstance

  4. #HotIf WinActive("ahk_exe explorer.exe")

  5. $F2:: {
  6.   if KeyWait("F2", "T0.3") { ;300ms
  7.         A_Clipboard := ""
  8.         send "^c"
  9.         ClipWait
  10.         Filename := StrSplit(A_Clipboard, "")  
  11.         A_Clipboard := Filename[-1]
  12.         ;MsgBox Filename[-1]
  13.   } else {
  14.     SendInput "{F2}"
  15.     KeyWait "F2"
  16.   }
  17.   return
  18. }

  19. #HotIf

  20. ;用 ([^\\]+)$ 匹配末尾的文件名
  21. ;https://stackoverflow.com/a/2655902
  22. ;https://wyagd001.github.io/v2/docs/lib/RegExMatch.htm#ExOutputVar
  23. ;https://wyagd001.github.io/v2/docs/lib/Array.htm
复制代码


F2说:SplitPath是个好函数,但我选择 正则 RegExMatch
  1. ; 实现 F2 短按复制文件名,长按触发重命名操作
  2. #Requires AutoHotkey v2.0
  3. #SingleInstance

  4. #HotIf WinActive("ahk_exe explorer.exe")

  5. $F2:: {
  6.   if KeyWait("F2", "T0.3") { ;300ms
  7.         A_Clipboard := ""
  8.         send "^c"
  9.         ClipWait
  10.         regex := "([^\\]+)$"
  11.         RegExMatch(A_Clipboard, regex, &Filename)
  12.         A_Clipboard := Filename[1]
  13.   } else {
  14.     SendInput "{F2}"
  15.     KeyWait "F2"
  16.   }
  17.   return
  18. }

  19. #HotIf

  20. ;用 ([^\\]+)$ 匹配末尾的文件名
  21. ;https://stackoverflow.com/a/2655902
  22. ;https://wyagd001.github.io/v2/docs/lib/RegExMatch.htm#ExOutputVar
复制代码


最后贴一个 F2 复制选中文件的路径:
  1. #Requires AutoHotkey v2.0
  2. #SingleInstance

  3. F2::
  4. {
  5.         Send "^c"
  6.         Sleep 200
  7.         ;将任何复制的文件, HTML 或其他格式的文本转换为纯文本.
  8.         ;https://wyagd001.github.io/v2/docs/lib/A_Clipboard.htm
  9.         A_Clipboard := A_Clipboard
  10.         return
  11. }
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|百分浏览器论坛

GMT+8, 2024-9-8 11:18 , Processed in 0.021424 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表