Implemented line numbers (#133)

This commit is contained in:
Tomáš Martiček 2019-01-27 15:31:29 +01:00 committed by gokcehan
parent e0e5977008
commit 90f0339fa9
7 changed files with 173 additions and 120 deletions

View File

@ -106,6 +106,12 @@ var (
"wrapscan", "wrapscan",
"nowrapscan", "nowrapscan",
"wrapscan!", "wrapscan!",
"number",
"nonumber",
"number!",
"relativenumber",
"norelativenumber",
"relativenumber!",
"findlen", "findlen",
"period", "period",
"scrolloff", "scrolloff",

2
doc.go
View File

@ -109,6 +109,8 @@ The following options can be used to customize the behavior of lf:
smartcase boolean (default on) smartcase boolean (default on)
smartdia boolean (default off) smartdia boolean (default off)
wrapscan boolean (default on) wrapscan boolean (default on)
number boolean (default off)
relativenumber boolean (default off)
findlen integer (default 1) (zero to prompt until single match) findlen integer (default 1) (zero to prompt until single match)
period integer (default 0) (zero to disable periodic loading) period integer (default 0) (zero to disable periodic loading)
scrolloff integer (default 0) scrolloff integer (default 0)

View File

@ -112,6 +112,8 @@ The following options can be used to customize the behavior of lf:
smartcase boolean (default on) smartcase boolean (default on)
smartdia boolean (default off) smartdia boolean (default off)
wrapscan boolean (default on) wrapscan boolean (default on)
number boolean (default off)
relativenumber boolean (default off)
findlen integer (default 1) (zero to prompt until single match) findlen integer (default 1) (zero to prompt until single match)
period integer (default 0) (zero to disable periodic loading) period integer (default 0) (zero to disable periodic loading)
scrolloff integer (default 0) scrolloff integer (default 0)

12
eval.go
View File

@ -143,6 +143,18 @@ func (e *setExpr) eval(app *app, args []string) {
gOpts.wrapscan = false gOpts.wrapscan = false
case "wrapscan!": case "wrapscan!":
gOpts.wrapscan = !gOpts.wrapscan gOpts.wrapscan = !gOpts.wrapscan
case "number":
gOpts.number = true
case "nonumber":
gOpts.number = false
case "number!":
gOpts.number = !gOpts.number
case "relativenumber":
gOpts.relativenumber = true
case "norelativenumber":
gOpts.relativenumber = false
case "relativenumber!":
gOpts.relativenumber = !gOpts.relativenumber
case "findlen": case "findlen":
n, err := strconv.Atoi(e.val) n, err := strconv.Atoi(e.val)
if err != nil { if err != nil {

2
lf.1
View File

@ -124,6 +124,8 @@ The following options can be used to customize the behavior of lf:
smartcase boolean (default on) smartcase boolean (default on)
smartdia boolean (default off) smartdia boolean (default off)
wrapscan boolean (default on) wrapscan boolean (default on)
number boolean (default off)
relativenumber boolean (default off)
findlen integer (default 1) (zero to prompt until single match) findlen integer (default 1) (zero to prompt until single match)
period integer (default 0) (zero to disable periodic loading) period integer (default 0) (zero to disable periodic loading)
scrolloff integer (default 0) scrolloff integer (default 0)

View File

@ -37,6 +37,8 @@ var gOpts struct {
ignoredia bool ignoredia bool
smartdia bool smartdia bool
wrapscan bool wrapscan bool
number bool
relativenumber bool
findlen int findlen int
period int period int
scrolloff int scrolloff int

35
ui.go
View File

@ -267,18 +267,45 @@ func (win *win) printDir(dir *dir, selections map[string]int, saves map[string]b
return return
} }
var lnwidth int = 0;
var lnformat string = "";
if (gOpts.number || gOpts.relativenumber) {
lnwidth = 1;
for j := 10; j < len(dir.files); j *= 10 {
lnwidth++
}
lnformat = fmt.Sprintf("%%%d.d ", lnwidth)
}
for i, f := range dir.files[beg:end] { for i, f := range dir.files[beg:end] {
fg, bg = colors.get(f) fg, bg = colors.get(f)
if (lnwidth > 0) {
var ln string
if (gOpts.number && (!gOpts.relativenumber || i == dir.pos)) {
ln = fmt.Sprintf(lnformat, i + 1 + beg)
} else if (gOpts.relativenumber) {
if (i < dir.pos) {
ln = fmt.Sprintf(lnformat, dir.pos - i)
} else {
ln = fmt.Sprintf(lnformat, i - dir.pos)
}
}
win.print(0, i, termbox.ColorYellow, bg, ln)
}
path := filepath.Join(dir.path, f.Name()) path := filepath.Join(dir.path, f.Name())
if _, ok := selections[path]; ok { if _, ok := selections[path]; ok {
win.print(0, i, fg, termbox.ColorMagenta, " ") win.print(lnwidth, i, fg, termbox.ColorMagenta, " ")
} else if cp, ok := saves[path]; ok { } else if cp, ok := saves[path]; ok {
if cp { if cp {
win.print(0, i, fg, termbox.ColorYellow, " ") win.print(lnwidth, i, fg, termbox.ColorYellow, " ")
} else { } else {
win.print(0, i, fg, termbox.ColorRed, " ") win.print(lnwidth, i, fg, termbox.ColorRed, " ")
} }
} }
@ -321,7 +348,7 @@ func (win *win) printDir(dir *dir, selections map[string]int, saves map[string]b
s = append(s, ' ') s = append(s, ' ')
win.print(1, i, fg, bg, string(s)) win.print(lnwidth+1, i, fg, bg, string(s))
} }
} }