showing message to user in mode hook - hook

I'm writing a hook to add some custom key bindings to org mode, it looks like this:
(defun course-export-org-mode-hook ()
(define-key org-mode-map (kbd "C-x .") 'my-custom-func)
(message "Remember that we can use 'C-x .' to run my custom func."))
I'd like to show the message in the last line to the user as a tip, to remember that the keybinding is active.
What happens now is that the message is shown very briefly during the running of the mode hook, but before the contents of the file is actually shown. By the time the buffer is visible, the message has already disappeared.
How can I show the message once the file contents are shown, and perhaps have it stay on the screen for a while so the user has time to read it?

Your code works fine for me, so I presume something else in your config is clobbering that message. You could try using a timer to set the message after any synchronous activities have finished:
(defun course-export-org-mode-hook ()
(run-with-timer 0 nil (lambda () (message "Remember that we can \
use 'C-x .' to run my custom func."))))

Related

How do I skip the execution of the plugin code?

MODX Revolution 2.7.3-pl.
there is a plugin that responds to these events:
1.case 'msOnCreateOrder'
2.case 'OnUserSave'
what needs to be written in the plugin code so that the system ignores the plugin code and just continues its work?
the way is this: the client collects the basket, clicks "Order", the system goes to the plugin, the plugin crashes, the system does not continue to work, nothing happens to the client on the page.
i can't just turn off the plugin.
thanks :)
right after
case 'msOnCreateOrder:'
and
case 'OnUserSave':
(or even at the very beginning) add
return true;
thus, the plugin will return a successful result without ever having worked.

How do I use the Ace dialog to show messages/errors?

I use the ace editor with the vim keybindings on my site. Whenever someone goes into normal mode and types a command, it shows up in a dialog at the bottom. I defined a function like so:
ace.config.loadModule("ace/keyboard/vim", m => {
m.CodeMirror.Vim.defineEx("write", "w", () => submitForm())
})
The neat thing is, whenever that function errors, it shows the error in another dialog. My question is, is this feature exposed to users? Can I use that dialog to show messages like the editor does when the function errors? Here's a screenshot to show an example:
Typing a command -
Error pops up (another dialog in front of the one that I use to type the command) -
there is no documented api for this, but judging by
https://github.com/ajaxorg/ace/blob/v1.4.9/lib/ace/keyboard/vim.js#L4983, it should be possible to use the following
editor.state.cm.openNotification(domNodeOrHtmlString, {bottom: true, duration: 5000})
to create the dom node you can use the buildDom function from ace.
var domNode = ace.require("ace/lib/dom").buildDom(["span", {style: "color:red"}, "xxxxx"])

nightwatch - check for popup window, after each click event

Is there a way in nightwatch to check whether a popup window appears after each click event?
I have a problem that randomly an error message appear and I don't want to write for each click event the same callback function.
I have already tried out the after and afterEach commands in the Global.js but then the commands will only run after the whole test suite.
I also have tried it local within a test file, although it also does not cover all single click events, even though the official website writes "... while beforeEach and afterEach are ran before and after each testcase (test step)"?
Solution I'm looking for:
.waitForElementVisible('selector')
.click('selector')
.click('selector')
Solution I have come up with so far:
.waitForElementVisible('selector')
.click('selector', isPresent)
.click('selector', isPresent)
isPresent as a callback function, which does the checking and close the popup window if it appears.
Is there another way to write a function (with or without after and/or forEach), so that it will be called after each click event or after each command. Thus, I don't have to write the isPresent repetitive code?
You can insert something like this in your page object file:
var popupCommand = {
popupCheck:function(){
return this.waitForElementVisible('selector', 5000)
.click('selector', isPresent)
.click('selector', isPresent)
},
module.exports = {
commands:[popupCommand],
elements:{
firstElement: {selector: 'xpath',locateStrategy: 'xpath'},
secondElement: {selector: 'css'},
}
}
Where 'popupCommand' will be the name of your page object file, for example 'Popup'. And also you will have to insert your isPresent callback function here so you can use it.
I did my best to explain you as much as possible what and how to do that :)
you should yse .switchWindow() method.
Why don't you write your own custom command specific for that case, so that way you will avoid repetitive code?

hunchentoot-based app in a lisp image (from buildapp) immediately returns

So I have an application using restas, based on hunchentoot.
At some point, I have the following function:
(defun main (args)
(declare (ignore args))
(set-config)
(restas:start '#:spa :port 8080))
(set-config) sets a few values related to database.
Anyway, I then use buildapp in the following way:
buildapp --output dist/spa --load-system spa --asdf-tree ~/quicklisp/ --entry spa::main --compress-core
Which works perfectly. The (set-config) function requires a config.json file to be present, and it indeed doesn't work when the file doesn't exist, so I know for sure that the application is correctly compiled.
When I run the generated binary however, the application immediately returns. Which means the HTTP server doesn't stay up.
I guess it's related to the fact that hunchentoot spawns a new thread, but it shouldn't stop the process, should it?
Also, I don't want to not use threads, i.e. I want the fact that each request is a separate thread.
So... I'm not sure exactly why it immediately returns. Why? And how to fix it?
I guess that you have to enter a main loop to keep the program running. The example at http://www.xach.com/lisp/buildapp/ uses the SBCL-specific (sb-impl::toplevel-repl nil).

Expect send KEY_DOWN and KEY_UP events to Process in Linux

I want to simulate embedded linux keypress events to my Qt GUI Application. Primarily I want to simulate KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, and KEY_F{1-2-3} key presses. I don't have X available.
There is an ASCII character table here:
http://foldoc.org/ASCII+character+table\
And I understand how to send things, say CNTRL-T, using that table to my aplication by spawning it and sending it the following in my expect script:
send "\x14"
I can't seem to find documentation or examples on how to send the KEY_??? key presses using Expect. How can I do this using Expect?
If not possible, is there some other way to send keypresses to my process? I can't seem to be able to echo escape sequences to /dev/input/keypad...
Update:
Thanks for the comments.
I can see the output that my arrow keys generate by doing:
$ od -c
^[[D^[[C^[[D^[[B^[[A^[[A^[[B^[[B^C
I can also see the output of infocmp xterm as:
am, bce, km, mc5i, mir, msgr, npc, xenl,
colors#8, cols#80, it#8, lines#24, pairs#64,
acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
clear=\E[H\E[2J, cnorm=\E[?12l\E[?25h, cr=^M,
csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C,
cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM,
dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K,
flash=\E[?5h$<100/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG,
ht=^I, hts=\EH, ich=\E[%p1%d#, il=\E[%p1%dL, il1=\E[L,
ind=^J, indn=\E[%p1%dS, invis=\E[8m,
is2=\E[!p\E[?3;4l\E[4l\E>, kDC=\E[3;2~, kEND=\E[1;2F,
kHOM=\E[1;2H, kIC=\E[2;2~, kLFT=\E[1;2D, kNXT=\E[6;2~,
kPRV=\E[5;2~, kRIT=\E[1;2C, kb2=\EOE, kbs=\177, kcbt=\E[Z,
kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
kdch1=\E[3~, kend=\EOF, kent=\EOM, kf1=\EOP, kf10=\E[21~,
kf11=\E[23~, kf12=\E[24~, kf13=\EO2P, kf14=\EO2Q,
kf15=\EO2R, kf16=\EO2S, kf17=\E[15;2~, kf18=\E[17;2~,
kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~, kf21=\E[20;2~,
kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~, kf25=\EO5P,
kf26=\EO5Q, kf27=\EO5R, kf28=\EO5S, kf29=\E[15;5~,
kf3=\EOR, kf30=\E[17;5~, kf31=\E[18;5~, kf32=\E[19;5~,
kf33=\E[20;5~, kf34=\E[21;5~, kf35=\E[23;5~,
kf36=\E[24;5~, kf37=\EO6P, kf38=\EO6Q, kf39=\EO6R,
kf4=\EOS, kf40=\EO6S, kf41=\E[15;6~, kf42=\E[17;6~,
kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~,
kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~, kf49=\EO3P,
kf5=\E[15~, kf50=\EO3Q, kf51=\EO3R, kf52=\EO3S,
kf53=\E[15;3~, kf54=\E[17;3~, kf55=\E[18;3~,
kf56=\E[19;3~, kf57=\E[20;3~, kf58=\E[21;3~,
kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~, kf61=\EO4P,
kf62=\EO4Q, kf63=\EO4R, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
khome=\EOH, kich1=\E[2~, kmous=\E[M, knp=\E[6~, kpp=\E[5~,
mc0=\E[i, mc4=\E[4i, mc5=\E[5i, meml=\El, memu=\Em,
op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, rin=\E[%p1%dT,
rmacs=\E(B, rmam=\E[?7l, rmcup=\E[?1049l, rmir=\E[4l,
rmkx=\E[?1l\E>, rmso=\E[27m, rmul=\E[24m, rs1=\Ec,
rs2=\E[!p\E[?3;4l\E[4l\E>, sc=\E7, setab=\E[4%p1%dm,
setaf=\E[3%p1%dm,
setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m%?%p9%t\E(0%e\E(B%;,
sgr0=\E[m\E(B, smacs=\E(0, smam=\E[?7h, smcup=\E[?1049h,
smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m,
tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?1;2c, u9=\E[c,
vpa=\E[%i%p1%dd,
I've tried several of the simple escape sequences on a 'menuconfig' ( much like Linux ) program for Buildroot like so:
#!/usr/bin/expect --
# Span menuconfig
spawn make menuconfig
expect *
send {"\e[D"}
#send {"\e[%p1%dB"}
interact
I'd like to have the menuconfig open and the cursor move down one spot. However, it just launches and quits right away, even though I have an 'interact' statement in there. Any ideas as to why? Thanks -
Have you tried using autoexpect ?
Try this :
$ autoexpect
And do what you want expect to do, if you would like it to scroll two lines down - send two down arrow events - do this by pressing down arrow twice.
Then exit autoexpect with Ctrl+C
Autoexpect will generate a script of all your actions that you can then run if you want expect to repeat the same thing. What is more important is that it will also catch the key events you want to send and generate correct lines of expect script that send these events. In my case (down arrow) this was
send -- "^[OB"
Just press all the keys you want to automatically send, and then inspect the generated script (usually named script.exp).
Hope this helps

Resources