ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

LF:用 Go 编写的轻量级终端文件管理器 — 安装、配置与扩展实战指南

LF:用 Go 编写的轻量级终端文件管理器 — 安装、配置与扩展实战指南 开发工具CLI【免费下载链接】lfTerminal file manager项目地址https://gitcode.com/gh_mirrors/lf/lf点击查看免费下载导读lflist files是一款使用 Go 编写的终端文件管理器其设计深受经典终端文件管理器ranger的影响但它将「单二进制、无运行时依赖、极快启动」作为核心追求。本篇指南以仓库根目录的 README.md 为骨架结合 doc.md 与源码展开带你完成从源码安装、基础使用到按键定制、Shell 集成、颜色图标配置乃至远程命令等完整能力的上手与进阶读完即可将 lf 无缝嵌入自己的工作流。LF 是什么lf在官方文档中被定义为「terminal file manager」终端文件管理器。它不是一个简单的ls增强工具而是一个完整的、可交互的双栏/多栏文件浏览界面左侧展示当前目录文件列表右侧提供文件预览支持选择、复制、移动、删除、搜索、书签等文件管理操作。它的定位从 README 的 Features 中即可窥见一斑跨平台支持 Linux、macOS、BSD 以及 Windows单二进制文件没有任何运行时依赖拷贝一个可执行文件即可使用启动快、内存占用低原生代码 静态二进制带来的天然优势异步 IO文件复制/移动等操作不会锁住界面UIServer/Client 架构与远程命令可以管理多个同时运行的实例Shell 命令可扩展、可配置几乎所有行为都可以用你熟悉的 shell 脚本来定制可自定义按键绑定默认提供 vi 与 readline 两套风格的按键其余特性详见 doc.md。值得一提的是README 还专门列出了Non-Features刻意不做的事这体现了 lf 的设计哲学——只做文件管理器本身该做的事把其他问题交给更专业的工具不提供 Tabs 或多窗口交给窗口管理器或终端复用器如 tmux不内置 pager/编辑器交给你自己选择的less、vim等不提供内建的文件操作命令交给底层 shell 工具如mkdir、touch、chmod、chown、chgrp、ln等。从源码结构看这一理念贯穿始终仓库根目录的 main.go 是程序入口client.go 与 server.go 支撑远程架构eval.go 负责执行配置与命令opts.go 集中管理全部配置选项而文件操作复制、移动、删除则在 copy.go 中实现为异步过程。安装 LFREADME 提供了三种安装途径社区维护的发行包、预编译二进制、源码编译。发行包与预编译二进制需前往官方发布渠道获取这里重点给出源码编译的完整步骤编译需要先安装 Go 工具链。Unix 系统env CGO_ENABLED0 go install -trimpath -ldflags-s -w github.com/gokcehan/lflatest几个参数的含义值得说明CGO_ENABLED0禁用 CGO保证产出纯静态二进制这正是「无运行时依赖」的来源-trimpath去除编译路径信息缩小体积并提升可复现性-ldflags-s -w剥离符号表与调试信息进一步压缩二进制大小。Windows cmdset CGO_ENABLED0 go install -trimpath -ldflags-s -w github.com/gokcehan/lflatestWindows PowerShell$env:CGO_ENABLED 0 go install -trimpath -ldflags-s -w github.com/gokcehan/lflatest安装完成后在任意目录直接执行lf即可启动默认进入当前目录。快速上手与命令行选项启动与查看帮助lf在当前目录启动lf -help查看全部命令行选项与 doc.md 中的 OPTIONS 章节内容一致lf -doc在终端中直接阅读官方文档全文在 lf 内部按f-1默认可调用help命令通过 pager 查看同一份文档。关键命令行选项按照 doc.md 的 OPTIONS 章节命令行选项可以分为四类启动与配置-command command在客户端初始化阶段即读取配置之后、执行on-init之前执行指定命令。需要执行多条命令时可多次使用该参数或用;串联例如lf -command set nohidden -command set hiddenfiles *mp4:*pdf:*txt -print-selection-config path用指定配置文件代替默认搜索位置仅影响启动时读取的lfrc。Shell 集成-print-last-dir退出时把最后所在目录打印到 stdout用于让 lf 改变你 shell 的工作目录-last-dir-path path同上但把目录写入指定文件而非 stdout-print-selection在 lf 内打开文件时把选中的文件打印到 stdout把 lf 当作「打开文件」对话框使用提前退出会丢弃选择-selection-path path同上但写入文件。服务器模式-remote command向正在运行的服务器发送命令send、query、list、quit、quit!等-server显式以前台模式启动无头服务器日志写向 stderr或用-log指定文件。客户端在检测到无服务器运行时会自动拉起一个除非使用了-single-single以独立客户端模式启动不使用服务器同时禁用远程控制。诊断-log path把运行日志追加写入指定文件-cpuprofile path/-memprofile path分别写出 CPU / 内存性能剖析文件供go tool pprof分析使用。文档中的实用示例目的命令用 lf 选择文件并隐藏某些类型lf -command set nohidden -command set hiddenfiles *mp4:*pdf:*txt -print-selection纯设计的「打开文件」对话框lf -command set nopreview; set ratios 1; set drawbox; set promptfmt Select files [%w] %S q: cancel, l: confirm -print-selection打开 Downloads 并按创建时间排序/显示lf -command set sortby btime; set info btime ~/Downloads临时禁止修改命令历史lf -command set nohistory使用默认配置并记录会话日志lf -config /dev/null -log /tmp/lf.log强制退出服务器lf -remote quit!在 shell 中继承 lf 的工作目录cd $(lf -print-last-dir)另外位置参数path可以指定启动位置传目录则在其中启动传文件则在其父目录启动并选中该文件不传则使用当前目录且只接受一个参数。配置文件位置与优先级lf 的配置文件位于以下位置系统级 / 用户级文档 doc.md 给出了完整的对照表文件Unix 系统级Unix 用户级Windows 系统级Windows 用户级主配置lfrc/etc/lf/lfrc~/.config/lf/lfrcC:\ProgramData\lf\lfrcC:\Users\user\AppData\Roaming\lf\lfrc颜色colors/etc/lf/colors~/.config/lf/colorsC:\ProgramData\lf\colorsC:\Users\user\AppData\Roaming\lf\colors图标icons/etc/lf/icons~/.config/lf/iconsC:\ProgramData\lf\iconsC:\Users\user\AppData\Roaming\lf\icons数据类文件选择列表、书签、标签、历史默认位置Unix~/.local/share/lf/files、~/.local/share/lf/marks、~/.local/share/lf/tags、~/.local/share/lf/historyWindowsC:\Users\user\AppData\Local\lf\下的同名文件。这些位置可以通过环境变量按优先级覆盖。Unix 下配置目录依次检查$LF_CONFIG_HOME→$XDG_CONFIG_HOME→~/.config数据目录依次检查$LF_DATA_HOME→$XDG_DATA_HOME→~/.local/shareWindows 对应为%LF_CONFIG_HOME%→%XDG_CONFIG_HOME%→%APPDATA%以及%LF_DATA_HOME%→%XDG_DATA_HOME%→%LOCALAPPDATA%。仓库的 etc 目录提供了开箱即用的参考配置lfrc.example 是主配置样例colors.example、icons.example、icons_colored.example 分别是颜色与图标样例ruler.default 是状态栏模板的默认实现。Windows 的 PowerShell 用户还可以参考 lfrc.ps1.example而 lfrc.cmd.example 对应 cmd 语法。配置语法速览配置文件的语法由 eval.go 解析执行与命令行一致核心命令包括set、setlocal、map、nmap、vmap、cmap和cmd。#到行尾为注释。set用于设置选项支持布尔、整数、字符串三种类型set hidden # 布尔启用 set hidden true # 布尔启用 set nohidden # 布尔禁用 set hidden! # 布尔切换 set scrolloff 10 # 整数 set sortby time # 字符串无引号 set sortby time # 字符串单引号含空白时 set sortby time # 字符串双引号支持反斜杠转义setlocal可为指定目录设置局部选项支持dircounts、dirfirst、dironly、hidden、info、reverse、sortby、sortignorecase、sortignorediasetlocal /foo/bar hidden setlocal /foo/bar sortby timemap/nmap/vmap/cmap分别用于普通可视、仅普通、仅可视、命令行模式下的按键绑定cmd用于定义自定义命令表达式留空即删除既有定义map gh cd ~ # 内置命令 cmd usage $du -h -d1 | less map st :set sortby time; set info time # 用 : 分组多语句需要多行时可以用{{与}}包裹map st :{{ set sortby time set info time }}按键与模式一份可查的完整参考lf 默认提供一套接近 Vim 的按键布局完整清单在 doc.md 的 QUICK REFERENCE 一节中。核心的默认按键包括功能默认键退出q上/下移动k/j含up/down半页/整页翻动c-u/c-b、c-d/c-f进入上级目录hleft打开文件/目录lright顶部/底部gg/G复制/剪切/粘贴y/d/p重命名/命令/搜索r、:、/反向?下一/上一个n/N书签保存/加载/删除m、、标记切换t反向选择/取消选择v/u可视模式V重新加载c-rREADME 中所说的「vi and readline defaults」正体现在此处普通/可视模式用 vi 风格而命令行的编辑则全面兼容 readline 按键c-a行首、c-e行尾、c-w删词、a-f/a-b词间移动等详见 doc 中 COMMAND-LINE MODE COMMANDS 一节。按键映射语法上lf 与 Vim 相似但并非完全一致特殊键必须用小写包裹在尖括号内enter、f-1、c-a、a-a不支持CtrlShiftSpace这类多修饰符组合。一个快速验证键名的办法在 lf 中按下某组合键若无法识别状态栏会以unknown mapping错误直接告诉你该键的规范名称。push命令可以模拟按键序列从而把「带计数的命令」或「带参数的命令」绑到单个键上例如map c-j push 10j map r push :renamespace注意push处理的是按键而非命令若绑定的按键序列与自身递归如map j push 2j会造成死锁。四种 Shell 命令类型与自定义命令lf 的扩展能力几乎全部建立在 shell 命令之上。根据前缀的不同shell 命令有四种类型前缀类型行为$shell常规执行会短暂切换到终端%shell-pipe把 stdin/stdout/stderr 接到底部状态栏statlineUI 不中断!shell-wait执行完毕后等待按键再恢复 UIshell-async后台异步执行不连接任何 I/O以「移动文件到回收站」为例理解命令编写doc.md 用一段经典的「trash」命令逐步展示了编写技巧。最初版本需要手动判断是否有多选cmd trash ${{ mkdir -p ~/.trash if [ -z $fs ]; then mv $f ~/.trash else IFS$(printf \n\t); mv $fs ~/.trash fi }}由于「没有选中时就退回到当前文件」是高频需求lf 专门提供了$fx变量直接简化cmd trash ${{ IFS$(printf \n\t); mv $fx ~/.trash }}再配合ifs选项全局设置IFS\n单行命令即可写成cmd trash $IFS$(printf \n\t); mv $fx ~/.trash$fx的语义在 doc.md 的 ENVIRONMENT VARIABLES 一节中有精确定义有选中文件时为选中列表fs从不取fv否则为当前文件f。同节还定义了$fs按filesep分隔的选中文件、$fv可视选中、$id当前客户端 ID、$LF_LEVEL嵌套层级可用于在提示符中显示lf level: N、$lf_width/$lf_height、$lf_mode当前模式等完整变量清单可直接在文档中查阅。特殊 Shell 命令钩子lf 允许在配置中定义一系列「特殊命令」来注入自定义行为分别是open、paste、rename、delete覆盖默认操作以及pre-cd、on-cd、on-load、on-focus-gained、on-focus-lost、on-init、on-select、on-redraw、on-quit生命周期钩子。例如定义自定义open命令按 MIME 类型分流cmd open ${{ case $(file --mime-type -Lb $f) in text/*) vi $fx;; *) for f in $fx; do xdg-open $f /dev/null 2 /dev/null done;; esac }}其中%shell-pipe类型特别适合编写「成功时无输出、失败时在状态栏报错」的命令比如带覆盖确认的改名cmd rename %[ -e $1 ] printf file exists || mv $f $1另外在 lfrc.example 中还提供了extract按扩展名调用 tar/unzip/7z 解压、zip/tar压缩选中文件、trash等可直接参考的完整例子以及通过cmd open {{ ... }}使用异步类型 lf -remote send $id \$EDITOR \$fx的方式兼顾「编辑器要终端、打开器要后台」两种需求的范本。远程命令与多实例协作Server/Client 架构是 README 强调的核心特性之一。所有客户端启动时都会连接到一个服务器因此可以跨实例发送命令。在 server.go 与 client.go 中可以看到这套架构的具体实现客户端自动拉起服务器除非-single服务器在所有客户端断开后自动退出autoquit选项默认开启。文档 doc.md 推荐的用法是直接使用自带的命令行入口无需关心 Unix socket 路径lf -remote send echo hello world # 发送给所有客户端 lf -remote send 1234 echo hello world # 按 ID 发送给指定客户端 lf -remote list # 列出所有连接的客户端 ID lf -remote quit / quit! # 退出服务器 / 强制退出 lf -remote query $id maps # 查询某个实例的内部状态query支持的类型包括maps、nmaps、vmaps、cmaps、cmds、jumps、history、files。一个经典应用是利用它配合 fzf 实现「历史命令检索执行」map a-h ${{ clear cmd$( lf -remote query $id history | awk -F\t NR 1 { print $NF} | sort -u | fzf --reverse --promptExecute command: ) lf -remote send $id $cmd }}由于 lf 没有控制流语法远程命令也是实现条件逻辑的标准手段例如根据终端宽度动态调整分栏比例set ratios 1:2/1:2:3/1:2:3:5。文件操作的内建实现与自定义默认情况下 lf 使用自建的异步复制与移动操作进度显示在底部状态栏具体实现在 copy.go。这些内建操作有几个明确行为doc.md不覆盖同名文件/目录而是按 GNU cp 的--backupnumbered语义追加后缀可用dupfilefmt自定义命名格式默认%f.~%n~仅保留mode与部分时间戳见preserve选项所有权、xattr 等属性不保留跳过字符设备、块设备、命名管道、socket 等特殊文件且不跟随符号链接移动操作优先走操作系统 rename跨设备时回退为「复制 删除源文件」操作错误会同时显示在消息行与日志文件且不会中断后续文件的操作。注意「复制」只是把路径记录到剪贴板文件默认~/.local/share/lf/files真正的拷贝发生在「粘贴」时。README 中「Async IO」的价值在这里体现大文件复制期间界面不会被锁死你仍然可以浏览其他目录。如果你想完全接管复制/移动行为可以定义特殊命令paste文档给出了基于cp -R/mv的参考实现cmd paste %{{ load$(cat ~/.local/share/lf/files) mode$(echo $load | sed -n 1p) list$(echo $load | sed 1d) if [ $mode copy ]; then cp -R $list . elif [ $mode move ]; then mv $list . rm ~/.local/share/lf/files lf -remote send clear fi }}另外默认情况下 lf不把delete命令绑定到任何键以避免新手误删你可以定义自己的delete命令并自行绑键。搜索与预览搜索与查找搜索/、?、n、N与查找f、F、;、,是两套不同的定位机制搜索移动选中项到匹配给定模式的条目查找则以尽可能少的按键完成定位。影响它们的关键选项包括searchmethod/filtermethod支持text默认、glob、regex三种模式匹配incsearch逐键输入时即时跳到当前匹配anchorfind控制查找是否必须从文件名开头匹配默认 truefindlen查找需要输入的字符数设为 0 则持续读取直到只剩唯一匹配wrapscan、ignorecase、smartcase、ignoredia、smartdia分别控制环绕、大小写与变音符号的处理策略。自定义预览脚本预览功能由previewer选项指向一个可执行脚本实现。脚本接收 6 个参数文件名、宽度、高度、水平位置、垂直位置、模式preview或preload。一个按扩展名分流的经典示例#!/bin/sh case $1 in *.tar*) tar tf $1;; *.zip) unzip -l $1;; *.rar) unrar l $1;; *.7z) 7z l $1;; *.pdf) pdftotext $1 -;; *) highlight -O ansi $1;; esac几点实践要点lf 会识别 ANSI 转义序列因此highlight -O ansi这类输出可以正确着色文件较大时 lf 会通过 SIGPIPE 提前关闭输出管道部分程序对 SIGPIPE 不友好会以非零码退出导致预览缓存被禁用可加|| true兜底快速滚动时预览可能跟不上可开启preload选项让预览脚本提前生成并缓存输出dirpreviews可让目录也进入预览器实现自定义目录预览。颜色与图标颜色环境变量 colors 文件lf 的颜色按以下顺序逐级覆盖后项覆盖前项doc.md默认配色 → 2.LSCOLORSmacOS/BSD ls→ 3.LS_COLORSGNU ls→ 4.LF_COLORSlf 专属→ 5. colors 文件LF_COLORS使用与LS_COLORS相同的语法例如export LF_COLORS~/Documents01;31:~/Downloads01;31:.git/01;32:*.gitignore32:*Makefile32:README.*33:*.txt34:*.md34:ln01;36:di01;34:ex01;32:匹配顺序从最具体到最不具体为完整路径 → 目录名如.git/仅目录带尾部斜杠→ 文件类型如lnfi除外→ 文件名后缀匹配README.txt*→ 文件名前缀匹配*README.txt→ 基名README.*→ 扩展名*.txt→ 默认fi。注意这类模式匹配出于性能考虑不做真正的 glob 展开。如果你不想在 shell 配置文件里写长串环境变量更推荐使用 colors 文件~/.config/lf/colors语法为空白分隔的键值对#起注释。仓库中的 colors.example 可作为起点。若终端支持 24 位色可通过设置$COLORTERMtruecolor或让$TERM以-truecolor结尾来启用完整色彩。图标set icons true 图标文件图标功能默认关闭需要两步启用在lfrc中加入set icons true并通过LF_ICONS环境变量或 icons 文件~/.config/lf/icons定义映射。图标文件每行 1~3 列文件类型或名称模式、图标字符、可选的颜色。参考样例见 icons.example单色与 icons_colored.example彩色。其底层实现位于 icons.go与 colors.go 共用同一套类型/名称匹配逻辑。状态栏与 Ruler 定制lf 底部状态栏ruler可通过rulerfile选项指向一个Go template文件来完全定制语法参考 Go 的text/template当rulerfile未设置时使用仓库中的 ruler.default 作为默认模板。模板可用的数据字段覆盖了{{.Message}}、{{.Keys}}、{{.Progress}}、{{.Copy}}、{{.Cut}}、{{.Select}}、{{.Visual}}、{{.Index}}、{{.Total}}、{{.Hidden}}、{{.All}}、{{.LinePercentage}}、{{.ScrollPercentage}}、{{.Filter}}、{{.Mode}}、{{.Options}}、{{.UserOptions}}以及{{.Stat.*}}一整套当前文件元数据路径、名称、扩展名、大小、权限、各类时间戳、链接目标、CustomInfo等内置函数则提供df剩余磁盘空间、env、humanize人性化文件大小、join、lower、upper、substr。{{.SPACER}}可把 ruler 划分为间距均匀的多个分区。| {{.Mode}} | {{.Stat.Path}} | {{humanize .Stat.Size}} | {{.SPACER}} {{.Keys}} |对于不想写模板文件的场景旧版rulerfmt/statfmt选项仍作为向后兼容保留模板方式rulerfile始终是首选。Shell / 编辑器集成README 与 doc.md 都强调lf 的定位决定了它的退出目录继承、快捷键补全等能力需要与 shell 配合。仓库 etc 目录为各主流 shell 提供了现成方案改变当前 shell 的工作目录使用 lfcd.shbash/sh、lfcd.csh、lfcd.fish、lfcd.nu、lfcd.ps1、lfcd.cmd 中的对应脚本包装lf退出后留在 lf 最后所在的目录其原理正是基于lf -print-last-dir输出目录然后cd。不引入包装脚本时手动执行cd $(lf -print-last-dir)也能达到同样效果命令行补全分别提供 lf.bash、lf.zsh、lf.fish、lf.nu、lf.ps1。以 bash 为例只需将其放入 bash-completion 目录如~/.local/share/bash-completion/completions/即可获得所有命令行选项的补全编辑器集成lf.vim 提供 Vim/Neovim 下的集成支持。此外在 lf 内部执行w默认绑定$$SHELL会打开一个嵌套 shell此时$LF_LEVEL环境变量会记录嵌套层级可用于在 shell 提示符中显式标注「当前在 lf 内」。总结从 README.md 到 doc.mdlf 呈现出一条清晰的产品脉络单二进制、零依赖、极快启动是它的立身之本Server/Client 架构、Shell 命令扩展、完全可定制的按键与界面是它的生产力上限。它刻意不做 tabs、不做内置编辑器把选择权交还给窗口管理器、pager 与 shell 工具——这正是它「轻」且「快」的根源。本指南涵盖了从编译安装、命令行选项、配置语法、按键体系、四类 shell 命令、远程控制、文件操作、搜索预览到颜色图标与状态栏定制的完整链路。下一步你可以直接阅读仓库中的 doc.md 全文或运行lf -doc以 lfrc.example 为起点搭建属于自己的配置再把 lfcd.sh 等脚本接入 shell让 lf 真正成为你日常文件操作的中枢。赞分享开发工具CLI【免费下载链接】lfTerminal file manager项目地址https://gitcode.com/gh_mirrors/lf/lf点击查看免费下载相关推荐Notepad2-mod 轻量级文本编辑器终极安装配置指南Notepad2 mod 轻量级文本编辑器终极安装配置指南 Notepad2 mod 是一款快速轻量的类记事本文本编辑器作为 Notepad2 的分支版本它开发工具桌面应用VSCode Neovim终极扩展管理指南轻松安装、更新与配置插件VSCode Neovim终极扩展管理指南轻松安装、更新与配置插件 想要在VSCode中体验原生Vim编辑器的强大功能吗 VSCode Neovim 正是您开发工具代码编辑器Joshuto终端文件管理器安装与配置完全指南Joshuto终端文件管理器安装与配置完全指南 项目基础介绍与编程语言 Joshuto是一个类似于Ranger的终端文件管理器使用Rust编程语言编写。它提供开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表