elvish/pkg/eval/builtin_fn_fs.go

138 lines
2.5 KiB
Go
Raw Normal View History

2017-12-17 13:20:03 +08:00
package eval
import (
"errors"
"src.elv.sh/pkg/fsutil"
"src.elv.sh/pkg/store"
2017-12-17 13:20:03 +08:00
)
// Filesystem commands.
2017-12-17 13:20:03 +08:00
2019-04-19 05:15:34 +08:00
// ErrStoreNotConnected is thrown by dir-history when the store is not connected.
2017-12-17 13:20:03 +08:00
var ErrStoreNotConnected = errors.New("store not connected")
//elvdoc:fn path-\*
//
// ```elvish
// path-abs $path
// path-base $path
// path-clean $path
// path-dir $path
// path-ext $path
// ```
//
// See [godoc of path/filepath](https://godoc.org/path/filepath). Go errors are
// turned into exceptions.
//
// These functions are deprecated. Use the equivalent functions in the
// [path:](path.html) module.
2017-12-17 13:20:03 +08:00
func init() {
2018-02-07 03:39:40 +08:00
addBuiltinFns(map[string]interface{}{
2017-12-17 13:20:03 +08:00
// Directory
"cd": cd,
"dir-history": dirs,
2017-12-17 13:20:03 +08:00
// Path
"tilde-abbr": tildeAbbr,
2017-12-17 13:20:03 +08:00
})
}
//elvdoc:fn cd
//
// ```elvish
// cd $dirname
// ```
//
// Change directory. This affects the entire process; i.e., all threads
// whether running indirectly (e.g., prompt functions) or started explicitly
// by commands such as [`peach`](#peach).
//
// Note that Elvish's `cd` does not support `cd -`.
//
// @cf pwd
func cd(fm *Frame, args ...string) error {
2017-12-17 13:20:03 +08:00
var dir string
switch len(args) {
case 0:
var err error
dir, err = fsutil.GetHome("")
if err != nil {
return err
}
case 1:
dir = args[0]
default:
return ErrArgs
2017-12-17 13:20:03 +08:00
}
return fm.Evaler.Chdir(dir)
2017-12-17 13:20:03 +08:00
}
//elvdoc:fn dir-history
//
// ```elvish
// dir-history
// ```
//
// Return a list containing the interactive directory history. Each element is a map with two keys:
// `path` and `score`. The list is sorted by descending score.
//
// Example:
//
// ```elvish-transcript
// ~> dir-history | take 1
// ▶ [&path=/Users/foo/.elvish &score=96.79928]
// ```
//
// @cf edit:command-history
type dirHistoryEntry struct {
Path string
Score float64
2018-01-03 08:43:27 +08:00
}
func (dirHistoryEntry) IsStructMap() {}
func dirs(fm *Frame) error {
daemon := fm.Evaler.DaemonClient()
if daemon == nil {
return ErrStoreNotConnected
2017-12-17 13:20:03 +08:00
}
dirs, err := daemon.Dirs(store.NoBlacklist)
2017-12-17 13:20:03 +08:00
if err != nil {
return err
2017-12-17 13:20:03 +08:00
}
out := fm.OutputChan()
2017-12-17 13:20:03 +08:00
for _, dir := range dirs {
out <- dirHistoryEntry{dir.Path, dir.Score}
2017-12-17 13:20:03 +08:00
}
return nil
2017-12-17 13:20:03 +08:00
}
//elvdoc:fn tilde-abbr
//
// ```elvish
// tilde-abbr $path
// ```
//
// If `$path` represents a path under the home directory, replace the home
// directory with `~`. Examples:
//
// ```elvish-transcript
// ~> echo $E:HOME
// /Users/foo
// ~> tilde-abbr /Users/foo
// ▶ '~'
// ~> tilde-abbr /Users/foobar
// ▶ /Users/foobar
// ~> tilde-abbr /Users/foo/a/b
// ▶ '~/a/b'
// ```
func tildeAbbr(path string) string {
return fsutil.TildeAbbr(path)
2017-12-17 13:20:03 +08:00
}