parent
							
								
									43e8efe895
								
							
						
					
					
						commit
						f413a3dbb2
					
				
							
								
								
									
										2
									
								
								vendor/github.com/peterh/liner/fallbackinput.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/peterh/liner/fallbackinput.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -55,3 +55,5 @@ func (n noopMode) ApplyMode() error { | ||||
| func TerminalMode() (ModeApplier, error) { | ||||
| 	return noopMode{}, nil | ||||
| } | ||||
| 
 | ||||
| const cursorColumn = true | ||||
|  | ||||
							
								
								
									
										3
									
								
								vendor/github.com/peterh/liner/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/peterh/liner/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| module github.com/peterh/liner | ||||
| 
 | ||||
| require github.com/mattn/go-runewidth v0.0.3 | ||||
							
								
								
									
										2
									
								
								vendor/github.com/peterh/liner/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/peterh/liner/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | ||||
| github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4= | ||||
| github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= | ||||
							
								
								
									
										7
									
								
								vendor/github.com/peterh/liner/input.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/peterh/liner/input.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -264,9 +264,9 @@ func (s *State) readNext() (interface{}, error) { | ||||
| 						return pageUp, nil | ||||
| 					case 6: | ||||
| 						return pageDown, nil | ||||
| 					case 7: | ||||
| 					case 1, 7: | ||||
| 						return home, nil | ||||
| 					case 8: | ||||
| 					case 4, 8: | ||||
| 						return end, nil | ||||
| 					case 15: | ||||
| 						return f5, nil | ||||
| @ -328,6 +328,9 @@ func (s *State) readNext() (interface{}, error) { | ||||
| 	case 'b': | ||||
| 		s.pending = s.pending[:0] // escape code complete
 | ||||
| 		return altB, nil | ||||
| 	case 'd': | ||||
| 		s.pending = s.pending[:0] // escape code complete
 | ||||
| 		return altD, nil | ||||
| 	case 'f': | ||||
| 		s.pending = s.pending[:0] // escape code complete
 | ||||
| 		return altF, nil | ||||
|  | ||||
							
								
								
									
										33
									
								
								vendor/github.com/peterh/liner/input_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								vendor/github.com/peterh/liner/input_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -4,6 +4,7 @@ import ( | ||||
| 	"bufio" | ||||
| 	"os" | ||||
| 	"syscall" | ||||
| 	"unicode/utf16" | ||||
| 	"unsafe" | ||||
| ) | ||||
| 
 | ||||
| @ -103,7 +104,7 @@ type key_event_record struct { | ||||
| 	RepeatCount     uint16 | ||||
| 	VirtualKeyCode  uint16 | ||||
| 	VirtualScanCode uint16 | ||||
| 	Char            int16 | ||||
| 	Char            uint16 | ||||
| 	ControlKeyState uint32 | ||||
| } | ||||
| 
 | ||||
| @ -111,6 +112,7 @@ type key_event_record struct { | ||||
| // what golint suggests)
 | ||||
| const ( | ||||
| 	vk_tab    = 0x09 | ||||
| 	vk_menu   = 0x12 // ALT key
 | ||||
| 	vk_prior  = 0x21 | ||||
| 	vk_next   = 0x22 | ||||
| 	vk_end    = 0x23 | ||||
| @ -134,6 +136,7 @@ const ( | ||||
| 	vk_f11    = 0x7a | ||||
| 	vk_f12    = 0x7b | ||||
| 	bKey      = 0x42 | ||||
| 	dKey      = 0x44 | ||||
| 	fKey      = 0x46 | ||||
| 	yKey      = 0x59 | ||||
| ) | ||||
| @ -174,6 +177,8 @@ func (s *State) readNext() (interface{}, error) { | ||||
| 	var rv uint32 | ||||
| 	prv := uintptr(unsafe.Pointer(&rv)) | ||||
| 
 | ||||
| 	var surrogate uint16 | ||||
| 
 | ||||
| 	for { | ||||
| 		ok, _, err := procReadConsoleInput.Call(uintptr(s.handle), pbuf, 1, prv) | ||||
| 
 | ||||
| @ -184,9 +189,6 @@ func (s *State) readNext() (interface{}, error) { | ||||
| 		if input.eventType == window_buffer_size_event { | ||||
| 			xy := (*coord)(unsafe.Pointer(&input.blob[0])) | ||||
| 			s.columns = int(xy.x) | ||||
| 			if s.columns > 1 { | ||||
| 				s.columns-- | ||||
| 			} | ||||
| 			return winch, nil | ||||
| 		} | ||||
| 		if input.eventType != key_event { | ||||
| @ -194,6 +196,17 @@ func (s *State) readNext() (interface{}, error) { | ||||
| 		} | ||||
| 		ke := (*key_event_record)(unsafe.Pointer(&input.blob[0])) | ||||
| 		if ke.KeyDown == 0 { | ||||
| 			if ke.VirtualKeyCode == vk_menu && ke.Char > 0 { | ||||
| 				// paste of unicode (eg. via ALT-numpad)
 | ||||
| 				if surrogate > 0 { | ||||
| 					return utf16.DecodeRune(rune(surrogate), rune(ke.Char)), nil | ||||
| 				} else if utf16.IsSurrogate(rune(ke.Char)) { | ||||
| 					surrogate = ke.Char | ||||
| 					continue | ||||
| 				} else { | ||||
| 					return rune(ke.Char), nil | ||||
| 				} | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| @ -202,6 +215,9 @@ func (s *State) readNext() (interface{}, error) { | ||||
| 		} else if ke.VirtualKeyCode == bKey && (ke.ControlKeyState&modKeys == leftAltPressed || | ||||
| 			ke.ControlKeyState&modKeys == rightAltPressed) { | ||||
| 			s.key = altB | ||||
| 		} else if ke.VirtualKeyCode == dKey && (ke.ControlKeyState&modKeys == leftAltPressed || | ||||
| 			ke.ControlKeyState&modKeys == rightAltPressed) { | ||||
| 			s.key = altD | ||||
| 		} else if ke.VirtualKeyCode == fKey && (ke.ControlKeyState&modKeys == leftAltPressed || | ||||
| 			ke.ControlKeyState&modKeys == rightAltPressed) { | ||||
| 			s.key = altF | ||||
| @ -209,7 +225,14 @@ func (s *State) readNext() (interface{}, error) { | ||||
| 			ke.ControlKeyState&modKeys == rightAltPressed) { | ||||
| 			s.key = altY | ||||
| 		} else if ke.Char > 0 { | ||||
| 			if surrogate > 0 { | ||||
| 				s.key = utf16.DecodeRune(rune(surrogate), rune(ke.Char)) | ||||
| 			} else if utf16.IsSurrogate(rune(ke.Char)) { | ||||
| 				surrogate = ke.Char | ||||
| 				continue | ||||
| 			} else { | ||||
| 				s.key = rune(ke.Char) | ||||
| 			} | ||||
| 		} else { | ||||
| 			switch ke.VirtualKeyCode { | ||||
| 			case vk_prior: | ||||
| @ -337,3 +360,5 @@ func TerminalMode() (ModeApplier, error) { | ||||
| 	} | ||||
| 	return mode, err | ||||
| } | ||||
| 
 | ||||
| const cursorColumn = true | ||||
|  | ||||
							
								
								
									
										48
									
								
								vendor/github.com/peterh/liner/line.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										48
									
								
								vendor/github.com/peterh/liner/line.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -40,6 +40,7 @@ const ( | ||||
| 	f11 | ||||
| 	f12 | ||||
| 	altB | ||||
| 	altD | ||||
| 	altF | ||||
| 	altY | ||||
| 	shiftTab | ||||
| @ -112,6 +113,10 @@ func (s *State) refreshSingleLine(prompt []rune, buf []rune, pos int) error { | ||||
| 
 | ||||
| 	pLen := countGlyphs(prompt) | ||||
| 	bLen := countGlyphs(buf) | ||||
| 	// on some OS / terminals extra column is needed to place the cursor char
 | ||||
| 	if cursorColumn { | ||||
| 		bLen++ | ||||
| 	} | ||||
| 	pos = countGlyphs(buf[:pos]) | ||||
| 	if pLen+bLen < s.columns { | ||||
| 		_, err = fmt.Print(string(buf)) | ||||
| @ -162,6 +167,14 @@ func (s *State) refreshSingleLine(prompt []rune, buf []rune, pos int) error { | ||||
| func (s *State) refreshMultiLine(prompt []rune, buf []rune, pos int) error { | ||||
| 	promptColumns := countMultiLineGlyphs(prompt, s.columns, 0) | ||||
| 	totalColumns := countMultiLineGlyphs(buf, s.columns, promptColumns) | ||||
| 	// on some OS / terminals extra column is needed to place the cursor char
 | ||||
| 	// if cursorColumn {
 | ||||
| 	//	totalColumns++
 | ||||
| 	// }
 | ||||
| 
 | ||||
| 	// it looks like Multiline mode always assume that a cursor need an extra column,
 | ||||
| 	// and always emit a newline if we are at the screen end, so no worarounds needed there
 | ||||
| 
 | ||||
| 	totalRows := (totalColumns + s.columns - 1) / s.columns | ||||
| 	maxRows := s.maxRows | ||||
| 	if totalRows > s.maxRows { | ||||
| @ -583,7 +596,7 @@ func (s *State) Prompt(prompt string) (string, error) { | ||||
| 
 | ||||
| // PromptWithSuggestion displays prompt and an editable text with cursor at
 | ||||
| // given position. The cursor will be set to the end of the line if given position
 | ||||
| // is negative or greater than length of text. Returns a line of user input, not
 | ||||
| // is negative or greater than length of text (in runes). Returns a line of user input, not
 | ||||
| // including a trailing newline character. An io.EOF error is returned if the user
 | ||||
| // signals end-of-file by pressing Ctrl-D.
 | ||||
| func (s *State) PromptWithSuggestion(prompt string, text string, pos int) (string, error) { | ||||
| @ -618,8 +631,8 @@ func (s *State) PromptWithSuggestion(prompt string, text string, pos int) (strin | ||||
| 
 | ||||
| 	defer s.stopPrompt() | ||||
| 
 | ||||
| 	if pos < 0 || len(text) < pos { | ||||
| 		pos = len(text) | ||||
| 	if pos < 0 || len(line) < pos { | ||||
| 		pos = len(line) | ||||
| 	} | ||||
| 	if len(line) > 0 { | ||||
| 		err := s.refresh(p, line, pos) | ||||
| @ -969,6 +982,35 @@ mainLoop: | ||||
| 				pos = 0 | ||||
| 			case end: // End of line
 | ||||
| 				pos = len(line) | ||||
| 			case altD: // Delete next word
 | ||||
| 				if pos == len(line) { | ||||
| 					fmt.Print(beep) | ||||
| 					break | ||||
| 				} | ||||
| 				// Remove whitespace to the right
 | ||||
| 				var buf []rune // Store the deleted chars in a buffer
 | ||||
| 				for { | ||||
| 					if pos == len(line) || !unicode.IsSpace(line[pos]) { | ||||
| 						break | ||||
| 					} | ||||
| 					buf = append(buf, line[pos]) | ||||
| 					line = append(line[:pos], line[pos+1:]...) | ||||
| 				} | ||||
| 				// Remove non-whitespace to the right
 | ||||
| 				for { | ||||
| 					if pos == len(line) || unicode.IsSpace(line[pos]) { | ||||
| 						break | ||||
| 					} | ||||
| 					buf = append(buf, line[pos]) | ||||
| 					line = append(line[:pos], line[pos+1:]...) | ||||
| 				} | ||||
| 				// Save the result on the killRing
 | ||||
| 				if killAction > 0 { | ||||
| 					s.addToKillRing(buf, 2) // Add in prepend mode
 | ||||
| 				} else { | ||||
| 					s.addToKillRing(buf, 0) // Add in normal mode
 | ||||
| 				} | ||||
| 				killAction = 2 // Mark that there was some killing
 | ||||
| 			case winch: // Window change
 | ||||
| 				if s.multiLineMode { | ||||
| 					if s.maxRows-s.cursorRows > 0 { | ||||
|  | ||||
							
								
								
									
										3
									
								
								vendor/github.com/peterh/liner/output.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/peterh/liner/output.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -56,9 +56,6 @@ func (s *State) getColumns() bool { | ||||
| 		return false | ||||
| 	} | ||||
| 	s.columns = int(ws.col) | ||||
| 	if cursorColumn && s.columns > 1 { | ||||
| 		s.columns-- | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										4
									
								
								vendor/github.com/peterh/liner/output_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/peterh/liner/output_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -69,8 +69,4 @@ func (s *State) getColumns() { | ||||
| 	var sbi consoleScreenBufferInfo | ||||
| 	procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi))) | ||||
| 	s.columns = int(sbi.dwSize.x) | ||||
| 	if s.columns > 1 { | ||||
| 		// Windows 10 needs a spare column for the cursor
 | ||||
| 		s.columns-- | ||||
| 	} | ||||
| } | ||||
|  | ||||
							
								
								
									
										31
									
								
								vendor/github.com/peterh/liner/width.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										31
									
								
								vendor/github.com/peterh/liner/width.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,6 +1,10 @@ | ||||
| package liner | ||||
| 
 | ||||
| import "unicode" | ||||
| import ( | ||||
| 	"unicode" | ||||
| 
 | ||||
| 	"github.com/mattn/go-runewidth" | ||||
| ) | ||||
| 
 | ||||
| // These character classes are mostly zero width (when combined).
 | ||||
| // A few might not be, depending on the user's font. Fixing this
 | ||||
| @ -13,13 +17,6 @@ var zeroWidth = []*unicode.RangeTable{ | ||||
| 	unicode.Cf, | ||||
| } | ||||
| 
 | ||||
| var doubleWidth = []*unicode.RangeTable{ | ||||
| 	unicode.Han, | ||||
| 	unicode.Hangul, | ||||
| 	unicode.Hiragana, | ||||
| 	unicode.Katakana, | ||||
| } | ||||
| 
 | ||||
| // countGlyphs considers zero-width characters to be zero glyphs wide,
 | ||||
| // and members of Chinese, Japanese, and Korean scripts to be 2 glyphs wide.
 | ||||
| func countGlyphs(s []rune) int { | ||||
| @ -31,13 +28,7 @@ func countGlyphs(s []rune) int { | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		switch { | ||||
| 		case unicode.IsOneOf(zeroWidth, r): | ||||
| 		case unicode.IsOneOf(doubleWidth, r): | ||||
| 			n += 2 | ||||
| 		default: | ||||
| 			n++ | ||||
| 		} | ||||
| 		n += runewidth.RuneWidth(r) | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
| @ -49,17 +40,17 @@ func countMultiLineGlyphs(s []rune, columns int, start int) int { | ||||
| 			n++ | ||||
| 			continue | ||||
| 		} | ||||
| 		switch { | ||||
| 		case unicode.IsOneOf(zeroWidth, r): | ||||
| 		case unicode.IsOneOf(doubleWidth, r): | ||||
| 		switch runewidth.RuneWidth(r) { | ||||
| 		case 0: | ||||
| 		case 1: | ||||
| 			n++ | ||||
| 		case 2: | ||||
| 			n += 2 | ||||
| 			// no room for a 2-glyphs-wide char in the ending
 | ||||
| 			// so skip a column and display it at the beginning
 | ||||
| 			if n%columns == 1 { | ||||
| 				n++ | ||||
| 			} | ||||
| 		default: | ||||
| 			n++ | ||||
| 		} | ||||
| 	} | ||||
| 	return n | ||||
|  | ||||
							
								
								
									
										6
									
								
								vendor/vendor.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/vendor.json
									
									
									
									
										vendored
									
									
								
							| @ -359,10 +359,10 @@ | ||||
| 			"revisionTime": "2017-01-12T15:04:04Z" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"checksumSHA1": "lSRg5clrIZUxq4aaExbpnpAgtWA=", | ||||
| 			"checksumSHA1": "fGwQlTsml12gzgbWjOyyKPzbMD8=", | ||||
| 			"path": "github.com/peterh/liner", | ||||
| 			"revision": "a37ad39843113264dae84a5d89fcee28f50b35c6", | ||||
| 			"revisionTime": "2017-09-02T20:46:57Z" | ||||
| 			"revision": "a2c9a5303de792c7581a3b80a8f10258319bb20e", | ||||
| 			"revisionTime": "2019-01-23T17:38:45Z" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"checksumSHA1": "xCv4GBFyw07vZkVtKF/XrUnkHRk=", | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user