1

I'm trying to bulk correct some OCR formatting issues. I tried recording a macro that would:

  1. ]s (advance to the next spelling error)
  2. z= (view the suggested corrections)
  3. 1 (choose the first suggested correction)

Unfortunately for my purposes, when I replay the macro, it pauses at the step #3 and waits for me to make the selection. Is there a way to still automate that step too (as part of the macro or otherwise)?

Thanks!

Matt V.
  • 113
  • 5

2 Answers2

2

The simple answer is to use a count as @Mass and @D.BenKnoble suggest:

  1. ]s
  2. 1z=

But let's take a closer look at why your original macro was failing, because it's not quite as simple as @Ralf implies.

First try recording your steps into register "r:

qr]sz=1Enterq

Then use @Ralf's :let command to set up register "s

:let @s="]sz=1\<cr>"

And then take a look at the difference in the output of :registers:

"r   ]sz=1^M
"s   ]sz=1^M^J

When you were recording your macro, you pressed Enter, and you can see that it's been included in the "r register as a CTRL-M or CR character. (As you may already know, pressing CTRL-M and pressing Enter within a terminal does the same thing, for historical reasons.)

However, when you set the "s register directly with the :let command, the \<CR> carriage return has been included as a CTRL-M followed by a CTRL-J (CRLF). I have no idea why there is a difference or why the LF is required for the macro to work, but let's try re-recording the macro and this time pressing CTRL-J after pressing Enter to see if we can include this character in our recording:

qr]sz=1EnterCTRL-Jq

Now let's take another look at the :registers output again:

"r   ]sz=1^M^@
"s   ]sz=1^M^J

Okay. Not quite right: pressing CTRL-J seems to have inserted a NUL character into our macro instead of a LF. (Again, no real idea why this is.) Still, try running the new macro, and you will discover that it works!

Extra Credit:

Now let's make the macro recursive so we can correct the entire file with a single @q:

qqqqq]sz=1EnterCTRL-J@qq

Rich
  • 31,891
  • 3
  • 72
  • 139
1

First assign the macro. Lets use register s:

:let @s="]sz=1\<cr>"

The special thing is \<cr>. This is Carriage Return that you need to hit after selecting the first spell sugestion.

As Mass & D. Ben Knoble pointed out, z= can take a count. So even simpler:

:let @s="]s1z="

Now use @s to execute the macro in register s. For the following invocations just use @@.


BTW: Be careful with this. I tested it on a text that contains the word "octothorpe". This was detected as spelling error and the first suggestion was "onto Thorpe".

statox
  • 49,782
  • 19
  • 148
  • 225
Ralf
  • 9,197
  • 1
  • 11
  • 30