@@ -53,6 +53,7 @@ func NewUI() *UI {
5353}
5454
5555var commands = []CommandInfo {
56+ {"help" , "Show help message" },
5657 {"add <file>" , "Add a specific file to the index" },
5758 {"add ." , "Add all changes to index" },
5859 {"add -p" , "Add changes interactively" },
@@ -100,9 +101,9 @@ var commands = []CommandInfo{
100101 {"status short" , "Show concise status (porcelain format)" },
101102 {"rebase interactive" , "Interactive rebase" },
102103 {"remote list" , "List all remote repositories" },
103- {"remote add <name > <url>" , "Add remote repository" },
104- {"remote remove <name >" , "Remove remote repository" },
105- {"remote set-url <name > <url>" , "Change remote URL" },
104+ {"remote add <n > <url>" , "Add remote repository" },
105+ {"remote remove <n >" , "Remove remote repository" },
106+ {"remote set-url <n > <url>" , "Change remote URL" },
106107 {"quit" , "Exit interactive mode" },
107108}
108109
@@ -115,33 +116,36 @@ func InteractiveUI() []string {
115116
116117// Run executes the interactive UI
117118func (ui * UI ) Run () []string {
118- fd := int ( os . Stdin . Fd ())
119- oldState , err := ui . term .makeRaw ( fd )
120- if err != nil {
121- fmt . Fprintln ( ui . stderr , "Failed to set terminal to raw mode:" , err )
122- return nil
123- }
124- defer func () {
125- if err := ui . term . restore ( fd , oldState ); err != nil {
126- fmt . Fprintln ( ui . stderr , "failed to restore terminal state:" , err )
119+ // ターミナルの生モード設定は標準入力がターミナルの場合のみ行う
120+ var oldState * term.State
121+ if f , ok := ui . stdin .( * os. File ); ok {
122+ fd := int ( f . Fd () )
123+ var err error
124+ oldState , err = ui . term . makeRaw ( fd )
125+ if err != nil {
126+ fmt . Fprintln ( ui . stderr , "Failed to set terminal to raw mode:" , err )
127+ return nil
127128 }
128- }()
129+ defer func () {
130+ if err := ui .term .restore (fd , oldState ); err != nil {
131+ fmt .Fprintln (ui .stderr , "failed to restore terminal state:" , err )
132+ }
133+ }()
134+ }
129135
130136 reader := bufio .NewReader (ui .stdin )
131137 selected := 0
132138 input := ""
133139
134140 for {
135- if _ , err := fmt .Fprint (ui .stdout , "\033 [H\033 [2J\033 [H" ); err != nil {
136- fmt .Fprintln (ui .stderr , "failed to write clear screen sequence:" , err )
137- }
141+ fmt .Fprint (ui .stdout , "\033 [H\033 [2J\033 [H" ) // Clear screen
138142 fmt .Fprintf (ui .stdout , "Select a command (incremental search: type to filter, ctrl+n: down, ctrl+p: up, enter: execute, ctrl+c: quit)\n " )
139143 fmt .Fprintf (ui .stdout , "\r Search: %s\n \n " , input )
140144
141145 // Filtering
142146 filtered := []CommandInfo {}
143147 for _ , cmd := range commands {
144- if strings .Contains (cmd .Command , input ) {
148+ if strings .HasPrefix (cmd .Command , input ) {
145149 filtered = append (filtered , cmd )
146150 }
147151 }
@@ -182,11 +186,18 @@ func (ui *UI) Run() []string {
182186
183187 b , err := reader .ReadByte ()
184188 if err != nil {
189+ if err == io .EOF {
190+ return nil
191+ }
185192 continue
186193 }
187194 if b == 3 { // Ctrl+C in raw mode
188- if err := ui .term .restore (fd , oldState ); err != nil {
189- fmt .Fprintln (ui .stderr , "failed to restore terminal state:" , err )
195+ if oldState != nil {
196+ if f , ok := ui .stdin .(* os.File ); ok {
197+ if err := ui .term .restore (int (f .Fd ()), oldState ); err != nil {
198+ fmt .Fprintln (ui .stderr , "failed to restore terminal state:" , err )
199+ }
200+ }
190201 }
191202 fmt .Fprintln (ui .stdout , "\n Exiting..." )
192203 os .Exit (0 )
@@ -196,8 +207,12 @@ func (ui *UI) Run() []string {
196207 }
197208 if len (filtered ) > 0 {
198209 fmt .Fprintf (ui .stdout , "\n Execute: %s\n " , filtered [selected ].Command )
199- if err := ui .term .restore (fd , oldState ); err != nil {
200- fmt .Fprintln (ui .stderr , "failed to restore terminal state:" , err )
210+ if oldState != nil {
211+ if f , ok := ui .stdin .(* os.File ); ok {
212+ if err := ui .term .restore (int (f .Fd ()), oldState ); err != nil {
213+ fmt .Fprintln (ui .stderr , "failed to restore terminal state:" , err )
214+ }
215+ }
201216 }
202217 // Placeholder detection
203218 cmdTemplate := filtered [selected ].Command
0 commit comments