VSCode终端小说阅读器:用PowerShell打造沉浸式摸鱼体验
作为一名程序员,我们每天有大量时间面对VSCode终端。有没有想过把这些碎片时间利用起来,在编码间隙享受阅读的乐趣?今天我要分享的不仅是一个简单的文本阅读脚本,而是一套完整的终端阅读解决方案——支持自动翻页、断点续读、阅读速度调节,甚至能伪装成日志输出。
1. 为什么选择终端阅读?
在办公室环境中,传统的阅读方式往往太过显眼。浏览器标签、电子书阅读器都容易被一眼识破。而终端阅读有三大独特优势:
- 隐蔽性:终端输出文字看起来就像程序日志或调试信息
- 低资源占用:不需要额外安装阅读软件或插件
- 可定制性:可以完全控制阅读体验的每个细节
我最初尝试过各种阅读插件,但要么功能臃肿,要么容易被发现。直到用PowerShell脚本实现了这个方案,才真正找到了工作和阅读的完美平衡点。
2. 基础阅读器实现
让我们从最核心的功能开始——逐页显示文本内容。以下是基础版本的PowerShell脚本:
$content = Get-Content -Path "C:\books\novel.txt" -Encoding UTF8 -Raw $length = $content.Length $i = 0 $pageSize = 500 # 每页字符数 while ($i -lt $length) { Clear-Host $content.Substring($i, [Math]::Min($pageSize, $length - $i)) # 等待用户按Enter或自动翻页 $null = Read-Host "按Enter继续(3秒后自动翻页)" Start-Sleep -Seconds 3 $i += $pageSize }这个脚本实现了:
- 读取UTF-8编码的文本文件
- 每次显示500个字符
- 提供3秒阅读时间后自动翻页
- 也可以按Enter立即翻页
3. 增强版功能实现
基础版本虽然能用,但离完美的摸鱼工具还有差距。我们需要增加以下功能:
3.1 断点续读功能
$bookPath = "C:\books\novel.txt" $bookmarkPath = "C:\books\bookmark.txt" # 读取上次阅读位置 if (Test-Path $bookmarkPath) { $lastPosition = Get-Content $bookmarkPath $i = [int]$lastPosition } else { $i = 0 } # 主阅读循环 while ($i -lt $content.Length) { # ...显示内容逻辑... # 保存阅读位置 $i | Out-File $bookmarkPath }3.2 阅读速度调节
# 从配置文件读取设置 $config = Get-Content "config.json" | ConvertFrom-Json $autoScrollDelay = $config.readSpeed # 单位:秒 # 或者在脚本运行时调整 Write-Host "当前速度: $autoScrollDelay秒/页 (1-加速, 2-减速)" $key = [Console]::ReadKey($true) switch ($key.Key) { 'D1' { $autoScrollDelay = [Math]::Max(1, $autoScrollDelay - 1) } 'D2' { $autoScrollDelay = [Math]::Min(10, $autoScrollDelay + 1) } }3.3 伪装模式
为了让阅读看起来更像工作,我们可以添加一些伪装元素:
function ShowFakeLog { param($text) # 添加时间戳 $timestamp = Get-Date -Format "HH:mm:ss" # 随机生成"日志级别" $logLevels = "INFO","DEBUG","WARN","ERROR" $level = $logLevels | Get-Random Write-Host "[$timestamp] [$level] $text" } # 使用示例 ShowFakeLog "正在加载模块..."4. 完整解决方案
将以上功能整合,我们得到完整版的终端阅读器:
<# .SYNOPSIS VSCode终端阅读器 - 摸鱼专用 .DESCRIPTION 这是一个支持断点续读、速度调节的终端文本阅读器, 专为程序员在VSCode中隐蔽阅读设计。 #> # 配置文件路径 $configPath = Join-Path $PSScriptRoot "reader_config.json" # 默认配置 $defaultConfig = @{ BookPath = "C:\books\current.txt" BookmarkPath = "C:\books\bookmark.txt" PageSize = 500 AutoScrollDelay = 3 FakeLogMode = $true } # 加载或创建配置 if (Test-Path $configPath) { $config = Get-Content $configPath | ConvertFrom-Json } else { $config = $defaultConfig $config | ConvertTo-Json | Out-File $configPath } # 主阅读函数 function Start-Reading { param( [string]$BookPath, [string]$BookmarkPath, [int]$PageSize, [int]$AutoScrollDelay, [bool]$FakeLogMode ) # 读取内容 $content = Get-Content -Path $BookPath -Encoding UTF8 -Raw $length = $content.Length # 读取书签 if (Test-Path $BookmarkPath) { $i = [int](Get-Content $BookmarkPath) } else { $i = 0 } # 主循环 while ($i -lt $length) { Clear-Host # 显示内容 $page = $content.Substring($i, [Math]::Min($PageSize, $length - $i)) if ($FakeLogMode) { $page -split "`n" | ForEach-Object { ShowFakeLog $_ } } else { Write-Host $page } # 保存进度 $i += $PageSize $i | Out-File $BookmarkPath -Force # 等待控制 $key = [System.Console]::ReadKey($true) switch ($key.Key) { 'RightArrow' { $AutoScrollDelay = [Math]::Max(1, $AutoScrollDelay - 1) } 'LeftArrow' { $AutoScrollDelay = [Math]::Min(10, $AutoScrollDelay + 1) } 'Escape' { return } default { Start-Sleep -Seconds $AutoScrollDelay } } } Write-Host "已读完本书!" -ForegroundColor Green Remove-Item $BookmarkPath -ErrorAction SilentlyContinue } # 启动阅读 Start-Reading @config5. 高级技巧与优化
要让这个阅读器更加完美,还可以考虑以下优化:
5.1 文本预处理
# 移除多余空行和空格 $content = [System.Text.RegularExpressions.Regex]::Replace($content, "\s+", " ") # 智能分段 - 每500字符尽量在句子结束处分页 $sentences = [System.Text.RegularExpressions.Regex]::Split($content, "(?<=[.!?])\s+") $pages = @() $currentPage = "" foreach ($sentence in $sentences) { if ($currentPage.Length + $sentence.Length -ge $PageSize) { $pages += $currentPage $currentPage = "" } $currentPage += $sentence + " " }5.2 快捷键绑定
在VSCode的keybindings.json中添加:
{ "key": "ctrl+alt+r", "command": "workbench.action.terminal.sendSequence", "args": { "text": "& 'C:\\scripts\\reader.ps1'\u000D" }, "when": "terminalFocus" }这样就能用Ctrl+Alt+R快速启动阅读器了。
5.3 阅读统计
# 记录阅读时长 $startTime = Get-Date # ...阅读循环... $endTime = Get-Date $totalTime = $endTime - $startTime Write-Host "本次阅读时长: $($totalTime.Hours)小时$($totalTime.Minutes)分钟" Write-Host "平均阅读速度: $([math]::Round($i / $totalTime.TotalMinutes)) 字符/分钟"6. 部署与使用建议
为了获得最佳体验,我建议这样设置:
文件组织:
C:\books\ ├── novels\ # 存放小说文本 ├── bookmarks\ # 存放阅读进度 └── reader.ps1 # 主脚本VSCode配置:
- 将终端字体调小一些(10-12px)
- 使用深色主题减少屏幕反光
- 调整终端高度为6-8行,看起来更像在查看日志
日常使用技巧:
- 将小说文件命名为"debug_log.txt"之类的不起眼名字
- 偶尔在阅读中穿插一些真实的命令输出
- 使用Alt+Tab快速切换而不是最小化窗口
这个项目最让我满意的是它的可扩展性。你可以根据自己的需求不断添加新功能,比如:
- 多本书籍管理
- 阅读进度同步(通过安全的云存储)
- 夜间模式(自动调整终端颜色)
- 章节导航功能