eshell相关笔记

eshell中的循环

一直以在我都习惯bash中的一行流,其中对于循环我使用得很多。 我在 shell脚本中的循环 中还专门记录了一下。

有时在emacs就完全不想出来,所认总是想在eshell中也做类似的事情。 bash中的一行循环:

for i in `ls`; do echo $i;done
,对应写出来的eshell如下:
for i in {ls|sort} {message "%s" $i}

可以看出来,在eshell中,我觉得echo就最好让message来替换。 然后现在对elisp也相对熟悉一些了,其实循环中的很多功能可以直接使用elisp来做了。

eshell的一行流中,我个人觉得和bash的思路不同,主要的操作是在这个i值的取得上。 比如bash中我可能是在取得了i后,在后面的do中再对这个i进行加工。 在eshell中,应该事先就把i加工好。比如可以直接使用elisp来加工i:

for i in {(let (result) (setq result (shell-command-to-string "ls")))} {message "%s.temp" $i}

如果需要两个变量怎么办呢?我找到一个这样的办法:

for i in {(list "xiepeng peng")} {message "%s, %s" $i[0] $i[1]}

这个办法是在eshell的manual里面看到这样说的:

‘$var[i]’
     Expands to the ‘i’th element of the value bound to ‘var’.  If the
     value is a string, it will be split at whitespace to make it a
     list.  Again, raises an error if the value is not a sequence.

我只找到这样切字符串的方法,它默认会以空格来切开,然后当成一个数组返回。 最后就可以使用下标来访问了。其实这样的话,数字也是可以的:

for i in {(list "1 2")} {message "%d, %d" $i[0] $i[1]}

通过这样操作,可以使用多个变量。不过我觉得这样还是不太完美。看看后面能不能找到更好的办法。