lf filemanager 配置对比 A
lumesh版本使用现代化的语法和内置函数,而bash版本使用传统的shell语法和外部工具。
概览
通用功能命令
all-cmd,history-cmd,history-dir- 命令历史和选择toggle-preview,toggle-selmode,toggle-super- 界面切换zox/z,zoxide-query,cd-usermedia- 目录导航
文件操作命令
select-files系列 - 文件选择和过滤yank-path,yank-name,yank-basename- 复制操作delete,trash,paste/mpaste,link- 文件管理rename-to,bulk-rename- 重命名操作chmod,chown,mkfile,mkdirs- 权限和创建
搜索和预览命令
fzf-edit,fzf-file,fzf-folder,fzf-content- 模糊搜索filter系列 - 文件过滤
压缩和挂载命令
extract-to,compress-to,archive-mount- 压缩包处理mount-dev,umount-dev- 设备挂载
比较和校验命令
diff,delta,diff-md5,check-sum- 文件比较
外部程序集成
cmus-play,open-handlr,open-with-gui/cli- 程序启动drag-in,drag-out- 拖拽操作- 编辑器启动命令 (
En,Ec,Ep等)
系统命令
on-cd- 自动触发命令
两种实现在功能上完全等价,按键绑定完全一致,选择主要取决于用户对现代化语法的偏好程度和对传统Unix工具的依赖程度。
在lf中启用shell
- 在lf中启用Lumesh
set shell lumesh # 必须 |
- 在lf中启用bash
set shell bash # 必须 |
主要命令对比A
1. all-cmd 命令
按键绑定: <c-e>
写法对比:
- lumesh: 使用链式管道方法和内置函数
let cmd = lf -remote `query $id cmds` | .lines() | .sort() | .drop(1) | .map(x -> {x.split("\t\t") | .first()}) | Ui.pick "select cmd:" |
- bash: 使用管道和外部工具
cmd=$( lf -remote "query $id cmds" | awk -F'\t' 'NR > 1 { print $NF}' | sort -u | fzf --reverse --prompt='Execute command: ' --preview='' ) |
优势说明:
- lumesh: 语法更直观,链式调用易读,完全省去外部应用的启动时间和数据转换时间,内置
Ui.pick提供统一交互体验 - bash: 使用标准Unix工具,兼容性好,
awk处理文本更灵活
2. history-cmd 命令
按键绑定: <backspace>, <backspace2>
写法对比:
- lumesh:
let cmd = lf -remote `query $id history` | .lines() | .sort() | Ui.pick "history command:" | .split("\t\t") | .last() |
- bash:
cmd=$( lf -remote "query $id history" | awk -F'\t' 'NR > 1 { print $NF}' | sort -u | fzf --reverse --prompt='Execute command: ' --preview='' ) |
优势说明:
- lumesh: 内置方法链更简洁,
.last()语义清晰 - bash:
awk的$NF高效处理最后一列
3. toggle-preview 命令
按键绑定: zp
写法对比:
- lumesh: 使用模式匹配
match $lf_preview { |
- bash: 使用条件判断
if [ "$lf_preview" = "true" ]; then |
优势说明:
- lumesh:
match语法更现代化,模式匹配功能强大; 变量无须引号 - bash: 传统
if-else结构清晰,调试容易
4. select-files 命令
按键绑定: Sf (文件), Sd (目录), SF (空文件), SD (空目录), Sl (符号链接), Sx (可执行文件)
写法对比:
- lumesh: 使用三元运算符和内置函数
let htag= $lf_hidden ? '-H' : '' |
- bash: 使用函数和条件判断
get_files() { |
优势说明:
- lumesh: 三元运算符简洁,变量作用域清晰
- bash: 函数封装逻辑清晰,可重用性好
5. fzf-content 命令
按键绑定: fc<space>, fct (txt), fcm (md), fcs (sh), fcy (py), fcj (js)
写法对比:
- lumesh: 使用现代语法和字符串插值
let file_type = len($argv)>0 ? $argv[0] : 'sh' |
- bash: 使用传统shell语法
RG_PREFIX="$lf_user_wheel rg --column --line-number --no-heading --color=always --smart-case --max-filesize 50K" |
优势说明:
- lumesh: 字符串方法链更直观,条件表达式简洁
- bash: 参数展开灵活,
cut命令处理分隔符高效
6. yank系列命令
按键绑定: yp (路径), yn (文件名), yb (基础名), yu (清除)
写法对比:
- lumesh: 使用函数式编程风格
$fx.lines() | .map(Fs.base_name) | .join("\n") | wl-copy |
- bash: 使用传统Unix工具
basename -a -- "$fx" | head -c-1 | wl-copy |
优势说明:
- lumesh: 函数式风格一致,内置文件系统函数功能丰富
- bash: Unix工具成熟稳定,
basename、cut等工具专业高效
7. paste/mpaste 命令
按键绑定: pp (粘贴), po (强制), pb (备份), pO (强制覆盖)
写法对比:
- lumesh: 使用现代集合操作
let load=Fs.read ~/.local/share/lf/files | .lines() |
- bash: 使用传统文本处理
load=$(cat ~/.local/share/lf/files) |
优势说明:
- lumesh: 集合操作直观,模式匹配优雅,内置文件函数类型安全
- bash:
sed文本处理强大,条件分支清晰
8. bulk-rename 命令
按键绑定: cb
写法对比:
- lumesh: 使用现代数据结构
let old_files = $fs.lines() |
- bash: 使用传统文本处理
paste "$old" "$new" | while IFS= read -r names; do |
优势说明:
- lumesh:
List.zip函数式操作优雅,数组访问直观 - bash:
paste命令专业,管道处理内存效率高
9. mount-dev 命令
按键绑定: mm
写法对比:
- lumesh: 使用结构化数据处理
let sel = lsblk -rno 'name,type,size,mountpoint,label,fstype' | Into.table([name,'type',size,mountpoint,label,fstype]) |
- bash: 使用文本处理和字段提取
sel=$(lsblk -rno 'name,type,size,label,mountpoint,fstype' | |
优势说明:
- lumesh: 结构化数据处理强大,字段访问类型安全,
where过滤直观 - bash:
awk文本处理灵活高效,字段提取成熟稳定
总体优势对比
Lumesh优势:
- 现代化语法,链式调用直观
- 内置函数丰富,类型安全
- 函数式编程风格一致
- 结构化数据处理能力强
- 调试和错误处理机制更完善
- 可尽量减少对三方工具的依赖,节省资源
Bash优势:
- Unix工具生态成熟
- 兼容性和可移植性好
- 三方文本处理工具专业高效
Notes
两种实现都实现了相同的lf文件管理器功能,按键绑定完全一致。Lumesh版本展现了现代shell语言的优势,而bash版本体现了传统Unix哲学的稳定性。选择哪种主要取决于用户对语法风格的偏好和对工具生态的依赖程度。
阅读更多