lf filemanager 配置对比 D
31. rename-to 命令#
按键绑定: mv
写法对比:
- lumesh: 使用内置文件函数和字符串插值
1let base_name = Fs.base_name($fx)
2let new_name =read `rename "$base_name" to:`
3if $new_name {
4 $lf_user_wheel mv -- $base_name $new_name
5 lf -remote `send $id :select $new_name`
6}- bash: 使用basename和printf
1fn=$(basename "$fx")
2printf "rename $fn to:"
3read ans
4[ -n "$ans" ] && $lf_user_wheel mv -- $fn $ans优势说明:
- lumesh: 内置文件函数类型安全,字符串插值更直观
- bash: basename命令标准,条件判断简洁
32. chmod 命令#
按键绑定: cm
写法对比:
- lumesh: 使用管道操作符和循环
1let ans = read "Mode Bits:"
2if $ans {
3 $fx |> $lf_user_wheel chmod $ans _
4 lf -remote 'send reload'
5}- bash: 使用xargs并行处理
1printf "\nMode Bits: "
2read ans
3if [ -n "$ans" ]; then
4 set -f
5 printf "%s\n" $fx |xargs -P 4 -i $lf_user_wheel chmod $ans {}
6 lf -remote 'send reload'
7fi优势说明:
- lumesh: 管道操作符
|>语法现代化,循环处理直观 - bash: xargs并行处理性能更好,
-P 4支持多进程
33. chown 命令#
按键绑定: co, cO (递归)
写法对比:
- lumesh: 使用管道操作符
1let ans = read "new Owner:Group :"
2if $ans {
3 $fx |> $lf_user_wheel chown $argv $ans -- _
4 lf -remote 'send reload'
5}- bash: 使用传统for循环
1printf "\nnew Owner:Group : "
2read ans
3if [ -n "$ans" ]; then
4 set -f
5 for file in "$fx"
6 do
7 $lf_user_wheel chown $@ $ans $file
8 done
9 lf -remote 'send reload'
10fi优势说明:
- lumesh: 管道操作符统一处理,语法一致性好
- bash: for循环控制精确,错误处理更细粒度
34. mkfile 命令#
按键绑定: mf
写法对比:
- lumesh: 使用条件判断和循环
1if len($argv)>0 {
2 $lf_user_wheel touch -- $argv
3 for file in $argv{
4 lf -remote `send $id select $file; tag '+'`
5 }
6}- bash: 使用参数检查
1if [ -n "$@" ];then
2 $lf_user_wheel touch -- "$@";
3 lf -remote "send $id select $@"
4fi优势说明:
- lumesh:
len()函数语义清晰,循环处理每个文件 - bash: 参数检查简洁,批量选择效率高
35. mkdirs 命令#
按键绑定: mk
写法对比:
- lumesh: 使用字符串方法和条件判断
1if $argv {
2 $lf_user_wheel mkdir -p -- $argv
3 let name = ""
4 for file in $argv{
5 if !$file.starts_with('/'){
6 name = Fs.base_name($file)
7 lf -remote `send $id :select $name; tag '+'`
8 }
9 }
10}- bash: 使用cut命令提取目录名
1set -f
2$lf_user_wheel mkdir -p -- "$@"
3for file in "$@";do
4 lf -remote "send $id :select $(echo $file| cut -d'/' -f1); tag +"
5done优势说明:
- lumesh: 字符串方法
.starts_with()直观,路径处理类型安全 - bash: cut命令处理路径分割高效,set -f禁用通配符扩展安全
36. folder-selected 命令#
按键绑定: ms
写法对比:
- lumesh: 使用内置函数和错误检查
1let dest = read "Fold to :"
2if $dest {
3 if Fs.exists($dest){
4 eprint 'Dest already Exists'
5 exit 0
6 }
7 $lf_user_wheel mkdir -- $dest
8 let files = $fx | .lines()
9 $lf_user_wheel mv -- $files $dest
10 lf -remote `send $id select '$dest'`
11}- bash: 使用printf和传统工具
1set -f
2printf "Directory name: "
3read newd
4$lf_user_wheel mkdir -- "$newd"
5$lf_user_wheel mv -- $fx "$newd"
6lf -remote "send $id select \"$newd\""优势说明:
- lumesh: 内置存在性检查,错误处理更完善
- bash: 直接创建目录,流程更简洁
37. 编辑器启动命令#
按键绑定: En (geany), Ec (code), Ep (lapce), Eg (geany), Ee (gedit), Ea (apostrophe), El (lite-xl), Em (marker), Er (retext), Ev (vi), Ez (zed)
写法对比:
- lumesh: 直接使用变量
1&geany $fx
2&code $fx
3&lapce $fx- bash: 使用引号保护
1&geany "$fx"
2&code "$fx"
3&lapce "$fx"优势说明:
- lumesh: 变量展开自动处理空格
- bash: 引号保护防止参数分割,更安全
38. 终端启动命令#
按键绑定: rr (foot lf), rt (thunar), rs (spacefm), rh (hx), rc (code), rp (lapce), rn (geany), rl (lite-xl), rz (zed)
写法对比:
- lumesh: 使用字符串字面量
1&$lf_user_wheel foot lf '.'
2&thunar '.'
3&hx '.'- bash: 同样使用字符串字面量
1&$lf_user_wheel foot lf .
2&thunar .
3&hx .优势说明:
- 两种版本基本相同,都是简单的命令调用
39. open-with-gui/cli 命令#
按键绑定: Og (GUI应用), Oc (CLI应用)
写法对比:
- lumesh: 使用数组索引
1&$argv[0] $fx ## GUI应用
2$$argv[0] $fx ## CLI应用- bash: 使用位置参数
1&$@ $fx ## GUI应用
2$$@ $fx ## CLI应用优势说明:
- lumesh: 数组索引明确指定第一个参数
- bash: 位置参数
$@展开所有参数,更灵活
40. archive-mount 命令#
按键绑定: am
写法对比:
- lumesh: 使用字符串插值和内置函数
1let base_name = Fs.base_name($f)
2let mntdir=`/tmp/lf/mount/$base_name`
3mkdir -p $mntdir
4$lf_user_wheel archivemount $f $mntdir -o nosave
5lf -remote `send $id cd $mntdir`- bash: 使用命令替换
1mntdir="/tmp/lf/mount/$(basename $f).mnt"
2mkdir -p "$mntdir"
3$lf_user_wheel archivemount "$f" "$mntdir" -o nosave
4lf -remote "send $id cd $mntdir"优势说明:
- lumesh: 内置文件函数类型安全,字符串插值清晰
- bash: basename命令标准,添加.mnt后缀避免冲突
最终对比总结#
语法现代化程度#
| 语法特性 | Lumesh | Bash | 现代化程度 |
|---|---|---|---|
| 条件表达式 | condition ? value : default | [ condition ] && value || default | Lumesh更现代 |
| 字符串方法 | .starts_with(), .ends_with() | grep, test | Lumesh更直观 |
| 文件操作 | Fs.base_name(), Fs.exists() | basename, test -e | Lumesh类型安全 |
| 数组处理 | .lines(), .map() | awk, cut, sed | Lumesh函数式 |
| 错误处理 | ?:, ?. | &&, || | Lumesh更简洁 |
性能和资源使用#
| 方面 | Lumesh | Bash |
|---|---|---|
| 启动速度 | 7.40ms(lume版本,含repl和内置库) | 4.78ms |
| 6.60ms(lumesh版本,含内置库,不含repl) | ||
| 内存使用 | 6MB | 8MB |
| 工具依赖 | 内置丰富功能 | 依赖系统工具 |
- 字符串处理效率对比 以all-cmds命令中的字符串处理为例:
数据准备
1lf -remote `query $id cmds` >> /tmp/cmdsLumesh 脚本
1# /tmp/cc.lm
2for i in 0..100{
3 Fs.read /tmp/cmds | String.lines() | List.drop(1) | List.map(x -> {String.split("\t\t", $x) | List.first()}) | print
4}Bash 脚本
1# /tmp/cc.lm
2for ((i=0;i<=100;i++))
3do
4 cat /tmp/cmds | awk -F'\t' 'NR>1 {print $1}'
5done执行时间对比
1# Lume
2> time lume /tmp/cc.lm
3________________________________________________________
4Executed in 32.25 millis fish external
5 usr time 25.65 millis 859.00 micros 24.79 millis
6 sys time 6.79 millis 588.00 micros 6.20 millis
7
8# Bash
9> time bash /tmp/cc.sh
10________________________________________________________
11Executed in 511.61 millis fish external
12 usr time 230.11 millis 1.69 millis 228.42 millis
13 sys time 454.95 millis 0.00 millis 454.95 millis
14
15# Dash 和 Bash结果基本相同维护性和可读性#
Lumesh优势:
- 统一的API设计和命名规范
- 类型安全减少运行时错误
- 现代化语法提高代码可读性
- 内置错误处理机制
Bash优势:
- 成熟的生态系统和工具链
- 广泛的社区支持和文档
- 标准化的错误处理模式
- 跨平台兼容性极佳
Notes#
通过对所有lf配置命令的完整对比分析,可以看出:
- 功能等价性: 两种实现都能完成相同的文件管理任务,按键绑定完全一致
- 语法差异: Lumesh体现了现代shell语言的设计理念,而Bash保持了传统Unix哲学
- 选择建议:
- 选择Lumesh:追求现代化语法、类型安全、代码可读性
- 选择Bash:注重兼容性、性能、工具生态成熟度
两种实现都是优秀的lf配置方案,选择主要取决于用户的技术栈偏好和具体需求。
Wiki pages you might want to explore: