language select on notepad launch
-
Hi
I would like notepad automatically select user defined language based on the first line content.
I have been trying to practice using command like this shown below but did not work. I think there is more to it than i thought.
const char * lan = “xml”;
::SendMessage(nppData._nppHandle, SCI_SETLEXERLANGUAGE, 0, (LPARAM)lan);Thanks
-
In the end after playing with the code I have understood that it is not possible to write such plugin. My biggest bet was to change language at a plugin initialization stage but the command (I have used a different command to the one listed above) gets ignored or overwritten.
It is a bit pity that I cant do it as I work with old UNIX style files where the files do not include extensions and the extension definition is within a file. That is making to look at different editor despite I like notepad++.
Thanks
-
It seems like you might be able to do this with one of the scripting plugins.
You could (write and) install some logic that would fire upon opening a file. The logic could look at the first line and then select a different “language” based upon what is found in the first line’s contents…
-
I tried playing with it some in PythonScript and my Perl library: it appears there may be a bug in the SCI_SETLEXERLANGUAGE string-based message, because it isn’t affecting the language chosen. There’s the SCI_SETLEXER int-based message which does work languages, but that cannot set a specific UDL.
You could navigate the Languages menu, and look for the dynamically-allocated menuCmdID for your UDL.
-
In general I would say using a notepad message ensures more or less
that the UI gets updated as well where as scintilla messages flying under the radar of npp.@lubysj
in your case I would say act on notepads bufferactivated notification,
get the first line of the document and send either a menucommand,
in case of udls or use NPPM_SETCURRENTLANGTYPE in case of builtin languages.Example how something might look like:
from Npp import notepad, NOTIFICATION, editor, LANGTYPE def callback_BUFFERACTIVATED(args): x = editor.getLine(0) if x.startswith('// c++'): notepad.setLangType(LANGTYPE.CPP) elif x.startswith('# npp3'): notepad.runMenuCommand('Language', 'NPP3') else: notepad.setLangType(LANGTYPE.PYTHON) notepad.callback(callback_BUFFERACTIVATED, [NOTIFICATION.BUFFERACTIVATED]) -
Thanks to all. Buffer activated message did the trick. I do not work with Python, though always wanted to learn. For those who want code in c is below. It is quite good that it allows to catch other notepad messages, so plugin can play more part rather than being passive and reacting to user menu commands.
xtern "C" __declspec(dllexport) void beNotified(SCNotification *notifyCode) { switch (notifyCode->nmhdr.code) { case NPPN_BUFFERACTIVATED: { ::SendMessage(nppData._nppHandle, NPPM_MENUCOMMAND, 0, IDM_LANG_XML); } break; default: return; } } -
Going back to UDLs… I was able to execute normal menu commands including for changing build in languages. However, I wasn’t able to change to a user defined language.
@Ekopalypse are you able to open phyton library to check how does runcommand translates into c call?
-
Pythonscript plugin is on github and here the part you are interested in.
-
@Ekopalypse , thanks. I will need to dig a bit to get a around.
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login