Freerefill 发表于 2022-7-6 14:36:45

有自己的想法

大家好。
 
我试图向命令行发送一个提示(很简单),然后用户可以在命令行中键入内容并向程序的其余部分发送命令。通常,要实现这一点,需要使用(getwhatever)函数。我认为这不能用在这种情况下。
 
这是我的代码:
 
如您所见,当用户键入“a”(目前是小写字母..稍后会更改)时终止的while循环将重复更新,无论用户输入或缺少输入。当用户键入除“a”之外的任何字母时,字符串将被追加,如果用户点击“backspace”,字符串将被删除一个字符。使用这个概念,我可以在程序运行时获得任何类型的用户输入,而无需暂停。这是我的目标。
 
我就快到了,但如果你运行代码,你会发现(记住,键入“a”取消它,或者只是混合ESC)我被卡住了。我可以添加到文本字符串中,也可以删除信息,但提示拒绝更改,我不知道为什么。
 
我知道我的整个问题可能还有其他解决方案,但我想找出这个解决方案,如果只是为了满足我的好奇心的话。
 
非常感谢您抽出时间^
 
编辑:哦,如果你用(princ(strcat“\n”meuStr))替换(displayMenu meuStr)行,你会确切地看到我的意思,尽管它会将它粘贴到新行。我可以正确编辑字符串;我的代码就是这样做的。它的展示似乎给了我一个问题。

Lee Mac 发表于 2022-7-6 14:43:01

我相信您的问题是因为打印退格“\ 010”不会删除文本,而只是将光标位置移到左侧:
 
我稍微修改了一下,但没有修改太多:
 

(defun c:menumsg (/ data)
(prompt (setq meuStr "Enter option (Abort/Retry/Cheerios): "))

(while (not (and (eq 2 (car (setq data (grread nil 13 1))))
                  (member (cadr data) '(97 65))))
   (cond
   ((and (= (car data) 2) (= (cadr data) )
      (setq meuStr (substr meuStr 1 (1- (strlen meuStr)))))
   ((= (car data) 2)
      (setq meuStr (strcat meuStr (chr (cadr data))))))
   (displayMenu meuStr))
(princ))

(defun displayMenu (string / strDel)
(setq strDel "")
(repeat (1+ (strlen string)) (setq strDel (strcat strDel "\010")))
(prompt (strcat strDel string))
(princ))

Lee Mac 发表于 2022-7-6 14:45:12

这个怎么样:
 

(defun c:menumsg(/ data Str)
(princ "Enter option (Abort/Retry/Cheerios): \n")
(setq Str "")

(while (not (and (eq 2 (car (setq data (grread nil 13 1))))
                  (member (cadr data) '(97 65))))
   (cond
   ((and (= (car data) 2) (= (cadr data) 13))
      (princ "\n")
      (setq Str (strcat Str "\n")))
   ((= (car data) 2)
      (princ (chr (cadr data)))
      (setq Str (strcat Str (chr (cadr data)))))))
(princ))

Freerefill 发表于 2022-7-6 14:50:44

李,似乎还是不行。您的操作与我的操作相同:字符串本身确实已修改,但显示它似乎是一个问题;退格按原样删除字符串上的最后一个字符,但命令行上的显示不变。至少对我来说不是这样。

Lee Mac 发表于 2022-7-6 14:52:53

在我的最新版本中,整个连接的字符串存储为变量,稍后可以使用,但单个字符打印到命令行。
 
至于退格——正如我在前面的帖子中所说,退格不会在字符打印到命令行后删除字符,而只是将光标位置向左移动。

Freerefill 发表于 2022-7-6 14:57:31

啊,我现在明白了。。我测试了它:
 
(princ (strcat "hello" "\010" "\010" "hi"))(princ)
返回的
 
helhi
helho。似乎它只是覆盖了已经存在的内容。
 
那么,有没有办法删除命令行上显示的内容?

Lee Mac 发表于 2022-7-6 15:04:09

试一试:
 
7

Lee Mac 发表于 2022-7-6 15:06:55

我不知道这有什么用在“getstring”上,但是。。。

Freerefill 发表于 2022-7-6 15:10:39

快到了,李。。你让我想起了一些非常基本的事情,我觉得自己像个忘记的白痴。再一次,你是一个灵感。给我一分钟!:3.

Lee Mac 发表于 2022-7-6 15:15:59

 
我感到荣幸
页: [1] 2
查看完整版本: 有自己的想法