有自己的想法
大家好。我试图向命令行发送一个提示(很简单),然后用户可以在命令行中键入内容并向程序的其余部分发送命令。通常,要实现这一点,需要使用(getwhatever)函数。我认为这不能用在这种情况下。
这是我的代码:
如您所见,当用户键入“a”(目前是小写字母..稍后会更改)时终止的while循环将重复更新,无论用户输入或缺少输入。当用户键入除“a”之外的任何字母时,字符串将被追加,如果用户点击“backspace”,字符串将被删除一个字符。使用这个概念,我可以在程序运行时获得任何类型的用户输入,而无需暂停。这是我的目标。
我就快到了,但如果你运行代码,你会发现(记住,键入“a”取消它,或者只是混合ESC)我被卡住了。我可以添加到文本字符串中,也可以删除信息,但提示拒绝更改,我不知道为什么。
我知道我的整个问题可能还有其他解决方案,但我想找出这个解决方案,如果只是为了满足我的好奇心的话。
非常感谢您抽出时间^
编辑:哦,如果你用(princ(strcat“\n”meuStr))替换(displayMenu meuStr)行,你会确切地看到我的意思,尽管它会将它粘贴到新行。我可以正确编辑字符串;我的代码就是这样做的。它的展示似乎给了我一个问题。 我相信您的问题是因为打印退格“\ 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))
这个怎么样:
(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))
李,似乎还是不行。您的操作与我的操作相同:字符串本身确实已修改,但显示它似乎是一个问题;退格按原样删除字符串上的最后一个字符,但命令行上的显示不变。至少对我来说不是这样。 在我的最新版本中,整个连接的字符串存储为变量,稍后可以使用,但单个字符打印到命令行。
至于退格——正如我在前面的帖子中所说,退格不会在字符打印到命令行后删除字符,而只是将光标位置向左移动。 啊,我现在明白了。。我测试了它:
(princ (strcat "hello" "\010" "\010" "hi"))(princ)
返回的
helhi
helho。似乎它只是覆盖了已经存在的内容。
那么,有没有办法删除命令行上显示的内容? 试一试:
7 我不知道这有什么用在“getstring”上,但是。。。 快到了,李。。你让我想起了一些非常基本的事情,我觉得自己像个忘记的白痴。再一次,你是一个灵感。给我一分钟!:3.
我感到荣幸
页:
[1]
2