From a5881619dfe84a46f0164f1a74adf3de1b3df2fc Mon Sep 17 00:00:00 2001 From: nokotan Date: Sun, 25 Oct 2026 23:28:11 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B5=D1=84=D0=B8=D0=BA=D1=81?= =?UTF-8?q?=D0=B0=20=D0=B8=20placeholder=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5?= =?UTF-8?q?=20=D0=BE=D0=B1=D0=BE=D0=BB=D0=BE=D1=87=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/app/main.go | 26 ++++++++++++---------- executor/executor.go | 27 +++++++++++++---------- executor/setup_script.go | 44 ++++++++++++++++++++++++++++++++++++++ suggestions/suggestions.go | 10 +++++---- 4 files changed, 81 insertions(+), 26 deletions(-) create mode 100644 executor/setup_script.go diff --git a/cmd/app/main.go b/cmd/app/main.go index d1423fa..8125ece 100644 --- a/cmd/app/main.go +++ b/cmd/app/main.go @@ -9,7 +9,7 @@ import ( tea "charm.land/bubbletea/v2" "charm.land/lipgloss/v2" - "nshell/executor" + "nshell/executor" ) // Сообщение, которое сигнализирует о завершении работы внешней команды @@ -21,9 +21,9 @@ type model struct { errText string // Храним ошибку, если команда не найдена } -func initialModel() model { +func initialModel(placeholderText string, prefixText string) model { ti := textinput.New() - ti.Placeholder = "Type a command..." + ti.Placeholder = placeholderText ti.Focus() ti.CharLimit = 250 ti.SetWidth(60) @@ -33,8 +33,7 @@ func initialModel() model { Foreground(lipgloss.Color("#FF00FA")). Bold(true) - ti.Prompt = prefixStyle.Render("noko> ") - //prefixStyle=lipgloss.NewStyle().Foreground(lipgloss.Color("#00FFD1")) + ti.Prompt = prefixStyle.Render(prefixText) return model{ textInput: ti, @@ -51,7 +50,10 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { - case "ctrl+c", "esc": + case "ctrl+c": + m.textInput.SetValue("") + return m, nil + case "ctrl+d": return m, tea.Quit case "enter": @@ -108,22 +110,24 @@ func (m model) View() tea.View { errStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("#FF0000")) s.WriteString(errStyle.Render(m.errText)) s.WriteString("\n") - m.errText = "" } s.WriteString(m.textInput.View()) - + // Возвращаем объект tea.View, обернув в него строку return tea.NewView(s.String()) } - func main() { + // Применение setup скрипта + executor.ExecSetUpScript() + placeholderText := executor.GetVariable("NSHELL_NO_TEXT_PLACEHOLDER") + prefixText := executor.GetVariable("NSHELL_PREFIX") + // Запускаем программу - p := tea.NewProgram(initialModel()) + p := tea.NewProgram(initialModel(placeholderText, prefixText)) if _, err := p.Run(); err != nil { fmt.Printf("Error running noko-shell: %v\n", err) os.Exit(1) } } - diff --git a/executor/executor.go b/executor/executor.go index a394912..c1abece 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -3,13 +3,15 @@ package executor import ( "errors" - "os/exec" "os" + "os/exec" "strings" ) -var ErrBuiltInExit = errors.New("exit command") -var localVars = make(map[string]string) +var ( + ErrBuiltInExit = errors.New("exit command") + localVars = make(map[string]string) +) func PrepareCommand(in string) (*exec.Cmd, error) { in = strings.TrimSpace(in) @@ -17,21 +19,25 @@ func PrepareCommand(in string) (*exec.Cmd, error) { return nil, nil } if strings.Contains(in, "=") && !strings.HasPrefix(in, "export ") { - parts := strings.SplitN(in, "=", 2) - key := strings.TrimSpace(parts[0]) - value := strings.TrimSpace(parts[1]) + parts := strings.SplitN(in, "=", 2) + key := strings.TrimSpace(parts[0]) + value := strings.TrimSpace(parts[1]) - localVars[key] = value - return nil,nil - } + localVars[key] = value + return nil, nil + } in = os.Expand(in, GetVariable) - + in = strings.TrimSpace(in) parts := strings.Fields(in) head := parts[0] args := parts[1:] + if len(parts) == 0 { + return nil, nil // Если после os.Expand строка стала пустой, безопасно выходим + } + switch head { case "exit": return nil, ErrBuiltInExit @@ -49,7 +55,6 @@ func PrepareCommand(in string) (*exec.Cmd, error) { return exec.Command(fullPath, args...), nil } - func GetVariable(key string) string { if val, exists := localVars[key]; exists { return val diff --git a/executor/setup_script.go b/executor/setup_script.go new file mode 100644 index 0000000..f8814e8 --- /dev/null +++ b/executor/setup_script.go @@ -0,0 +1,44 @@ +package executor + +import ( + "bufio" + "fmt" + "os" + "strings" +) + +const defaultStartScript string = ` +echo meow meow +NSHELL_NO_TEXT_PLACEHOLDER=Type Noko Meow Meow +NSHELL_PREFIX=noko> +` + +func ExecSetUpScript() { + scanner := bufio.NewScanner(strings.NewReader(defaultStartScript)) + for scanner.Scan() { + line := scanner.Text() + cmd, err := PrepareCommand(line) + if err != nil { + fmt.Printf("Error %s\n", err.Error()) + } + if err != nil { + fmt.Printf("Error preparing command: %s\n", err.Error()) + continue + } + + if cmd == nil { + continue + } + + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + err = cmd.Run() + if err != nil { + fmt.Printf("Ошибка при выполнении команды: %s\n", err.Error()) + } + } + if err := scanner.Err(); err != nil { + fmt.Println("Ошибка чтения:", err) + } +} diff --git a/suggestions/suggestions.go b/suggestions/suggestions.go index 94c4ecf..ff4ff6d 100644 --- a/suggestions/suggestions.go +++ b/suggestions/suggestions.go @@ -6,11 +6,13 @@ import "strings" var defaultSuggestions = []string{"exit"} func Completer(in string) []string { - if in=="" {return nil} + if in == "" { + return nil + } var matched []string - for _,cmd := range defaultSuggestions { - if strings.HasPrefix(cmd,in){ - matched=append(matched, cmd) + for _, cmd := range defaultSuggestions { + if strings.HasPrefix(cmd, in) { + matched = append(matched, cmd) } } return matched