- AuthorPosts
- July 3, 2010 at 12:00 pm #8692chjfthMember
Hello, Yukata,
I want to know the return method of current active document from macro code in Emeditor. So I tried the following VBS snippet,
Set WshShell = CreateObject( "WScript.Shell" )
Set dc = document.config
crlf_style = dc.FileSave.ReturnMethod
WshShell.Popup "crlf_style " & crlf_style
However, whether I run this macro on a Windows text file(CRLF) or Unix text file(LF), I always get “crlf_style 0”. Is there a way to work me out?
Tried on EmEditor v8 and v10.0, same result.
Thank you.
July 3, 2010 at 5:03 pm #8693Yutaka EmuraKeymasterHello chjfth,
If you just want to know the Return method of the current document, you can display that information on the Status Bar. Please go to Customize on the Tools menu, and select the “Status” tab, and check “Return Method”.
Please let me know if you have further questions.
Thank you for using EmEditor!
July 4, 2010 at 6:27 am #8697chjfthMemberOh, yes, I do have a further question.
I’m writing a slash-cvt.vbee macro.
' This VBScript macro do the following:
' For a block of selected text,
' * if a / is found, replace all occurance of / to .
' * else if a is found, replace all to / .
' After the macro is executed, the converted text will remain at its select state(invert-colored).
Set ds = document.selection
slen = Len(ds.Text) ' get selected text length
posSlash = InStr(ds.Text, "/")
posBkSlash = InStr(ds.Text, "")
If posSlash>0 and (posBkSlash=0 or posBkSlash>posSlash) Then
' / in selected text and / appears before
ds.Text = Replace(ds.Text, "/", "")
ds.CharLeft True, slen 'make the new text in selected state(inverted color)
ElseIf posBkSlash>0 Then
' in selected text
ds.Text = Replace(ds.Text, "", "/")
ds.CharLeft True, slen
Else
Set WshShell = CreateObject( "WScript.Shell" )
n = WshShell.Popup( "There is no / or in your selected text. This macro can do nothing.", 0, "EmEditor Macro running", 0 )
Set dc = document.config
crlf_style = dc.FileSave.ReturnMethod
WshShell.Popup "abc" & crlf_style
End If
If the selection is partial line, or, multiple lines of a Unix text file, it works well. However, if the selection is multiple lines of a CRLF text file, there is something wrong:
ds.CharLeft True, slen
will move(select) visually more characters than I expect, –because, at end of a line,ds.CharLeft True, 1
will actually step 2 characters(CR and LF).So, If I can know whether a text file is CRLF-ed, I can replace all CRLF to LF before I count slen=Len(ds.Text) , so that the finally selection length will be correct.
I hope you can add this property in future version. On the other hand, is there another way to achieve the same goal(implement the slash-cvt.vbee macro)?
July 4, 2010 at 8:27 pm #8700Yutaka EmuraKeymasterHi,
GetLine method (Document object) allows you to add new line character(s) (CR, LF, or CR+LF) at the end of the line.
str = document.GetLine( yLine, eeGetLineWithNewLines )
Then you can correctly count the line length.
I hope this helps.
July 5, 2010 at 1:24 am #8703chjfthMemberExcuse me, I cannot tell how document.GetLine() can help. In order to call GetLine, I have to know the line numbers of the selected text, which seems to stray away from my topic.
This issue is not urgent. I can wait until next EmEditor release when you add a document property to tell current document’s return method.
Regards.
July 5, 2010 at 1:55 am #8704Yutaka EmuraKeymasterdc.FileSave.ReturnMethod usually always returns 0. This means the configuration will not alter the return method of a document. EmEditor supports files that have mixed return methods.
If you want to find the return method of the current document and if you know the return method is the same in the entire document, you can write:
str = document.GetLine( 0, eeGetLineWithNewLines )
Then you can find what the return method of the current document is.
I hope this helps.
If you have further questions, please let me know.
Thanks!July 5, 2010 at 12:13 pm #8705chjfthMemberMany thanks to your final clear reply. Now I know that EmEditor supports mixed EOL mark. And thank you for pointing out
str = document.GetLine( 1, eeGetLineWithNewLines )
can find out the EOL of line 1. (Yes, I must use 1 as first parameter instead of 0. 0 will cause script error “Invalid procedure call or argument”.
Now, I realize that I pratically don’t have to care if current text file has LF or CRLF as end-of-line marker; I can simply replace all occurence of “rn” to “n” before counting slen, then my goal is fulfilled.
So my script becomes:
' This VBScript macro do the following:
' For a block of selected text,
' * if a / is found, replace all occurance of / to .
' * else if a is found, replace all to / .
' After the macro is executed, the converted text will remain at its select state(invert-colored).
Set ds = document.selection
TextCopy = Replace(ds.Text, chr(13)+chr(10), chr(10)) 'replace rn to be one n
slen = Len(TextCopy) 'get selected text length, rn counted as only one char
posSlash = InStr(ds.Text, "/")
posBkSlash = InStr(ds.Text, "")
If posSlash>0 and (posBkSlash=0 or posBkSlash>posSlash) Then
' / in selected text and / appears before
ds.Text = Replace(ds.Text, "/", "")
ds.CharLeft True, slen 'make the new text in selected state(inverted color)
ElseIf posBkSlash>0 Then
' in selected text
ds.Text = Replace(ds.Text, "", "/")
ds.CharLeft True, slen
Else
Set WshShell = CreateObject( "WScript.Shell" )
n = WshShell.Popup( "There is no / or in your selected text. This macro can do nothing.", 0, "EmEditor Macro running", 0 )
End If
EmEditor is so great with custom script.
- AuthorPosts
- You must be logged in to reply to this topic.