I've been looking for a Notepad++ plugin that can close HTML/XML tags after a slash just like the way Dreamweaver does for a long time.
The only things I could find(TextFX, XML Tools etc.) close the tags right after ">" is typed in, which was not what I wanted.
A couple days ago I found a plugin called Automation Scripts. It allows me to write scripts in C#, so I don't have to spend time learning how to write Notepad++ plugins.
So here you go:

//npp_shortcut Ctrl+Shift+Z

//Automation Scripts plugin needs to be installed for this to work
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Text;
using System;
using System.Windows.Forms;
using NppScripts; public class Script : NppScript
{
public Script()
{
this.OnNotification = (notification) =>
{
if(notification.nmhdr.code == (uint)SciMsg.SCN_CHARADDED)
{
doInsertHtmlCloseTag((char)notification.ch);
}
};
} public override void Run()
{
checkInsertHtmlCloseTag();
} bool doCloseTag; void checkInsertHtmlCloseTag()
{
doCloseTag = !doCloseTag;
Win32.SendMessage(Npp.NppHandle, NppMsg.NPPM_SETMENUITEMCHECK, Plugin.FuncItems.Items[this.ScriptId]._cmdID, doCloseTag ? : );
} string GetStartTagName(string input)
{
Regex regex=new Regex(@"<[A-Za-z][A-Za-z0-9]*[^>]*[^\/]>|<[A-Za-z]>");
if(!regex.IsMatch(input)) return "";
StringBuilder result=new StringBuilder();
int i=;
while(input[i]!=' ' && input[i]!='>' & i<input.Length)
{
result.Append(input[i]);
i++;
}
return result.ToString();
} string GetEndTagName(string input)
{
Regex regex=new Regex(@"<\/[A-Za-z][A-Za-z0-9]*[^>]*>");
if(!regex.IsMatch(input)) return "";
StringBuilder result=new StringBuilder();
int i=;
while(input[i]!=' ' && input[i]!='>' & i<input.Length)
{
result.Append(input[i]);
i++;
}
return result.ToString();
} string GetSelection()
{
IntPtr hCurrentEditView = Npp.CurrentScintilla;
StringBuilder result=new StringBuilder();
Win32.SendMessage(hCurrentEditView,SciMsg.SCI_GETSELTEXT,,result);
return result.ToString();
} int FindNextTag(int pos)
{
IntPtr hCurrentEditView = Npp.CurrentScintilla;
string pattern=@"<\/?[A-Za-z][A-Za-z0-9]*[^>]*[^\/]>|<\/?[A-Za-z]>";
Win32.SendMessage(hCurrentEditView, SciMsg.SCI_SETSEL, pos, pos);
Win32.SendMessage(hCurrentEditView,SciMsg.SCI_SEARCHANCHOR,,);
return (int)Win32.SendMessage(hCurrentEditView,SciMsg.SCI_SEARCHPREV,(int)SciMsg.SCFIND_REGEXP,pattern);
} void doInsertHtmlCloseTag(char newChar)
{
LangType docType = LangType.L_TEXT;
Win32.SendMessage(Npp.NppHandle, NppMsg.NPPM_GETCURRENTLANGTYPE, , ref docType);
bool isDocTypeHTML = (docType == LangType.L_HTML || docType == LangType.L_XML || docType == LangType.L_PHP);
if (doCloseTag && isDocTypeHTML && newChar=='/')
{
IntPtr hCurrentEditView = Npp.CurrentScintilla;
int currentPos = (int)Win32.SendMessage(hCurrentEditView, SciMsg.SCI_GETCURRENTPOS, , );
char lastChar=(char)Win32.SendMessage(hCurrentEditView,SciMsg.SCI_GETCHARAT,currentPos-,);
StringBuilder insertString=new StringBuilder();
if(lastChar=='<')
{
int pos=currentPos;
Stack<string> stack=new Stack<string>();
string tag;
while(true)
{
pos=FindNextTag(pos);
if(pos==-)
{
Win32.SendMessage(hCurrentEditView, SciMsg.SCI_SETSEL, currentPos, currentPos);
return;
}
tag=GetSelection();
if(tag[]=='/')
{
stack.Push(GetEndTagName(tag));
}
else
{
tag=GetStartTagName(tag);
if(stack.Count==)
break;
else
{
string endTag=stack.Pop();
while(tag!=endTag && stack.Count>)
{
endTag=stack.Pop();
}
if(tag!=endTag) break;
}
}
}
insertString.Append(tag+">");
Win32.SendMessage(hCurrentEditView, SciMsg.SCI_BEGINUNDOACTION, , );
Win32.SendMessage(hCurrentEditView, SciMsg.SCI_SETSEL, currentPos, currentPos);
Win32.SendMessage(hCurrentEditView, SciMsg.SCI_REPLACESEL, , insertString);
Win32.SendMessage(hCurrentEditView, SciMsg.SCI_SETSEL, currentPos+insertString.Length, currentPos+insertString.Length);
Win32.SendMessage(hCurrentEditView, SciMsg.SCI_ENDUNDOACTION, , );
}
}
}
}

Make Notepad++ auto close HTML/XML tags after the slash(the Dreamweaver way)的更多相关文章

  1. Using Notepad++ To Quickly Format XML

    http://geek.sylvainw.com/2010/03/28/using-notepad-to-quickly-format-xml/ My favorite way to quickly ...

  2. 通过notepad++将混乱的xml配置的格式进行美化

    需求描述: 最近在进行hbase配置文件的修改之后,发现xml文件的格式很不美观, 然后,在网上找了些方法,实测,通过notepad++的xml tools插件就可 达到美化效果. 操作过程: 1.以 ...

  3. Notepad++安装xml插件

    环境: win7 64位 Notepad++7.3.3 原生的Notepad++不自带xml文件的插件,所以在显示xml文件时并不分行(如下图所示),对于用户编辑,查看的操作而言,并不友好,所以需要安 ...

  4. Android Auto开发之一《开始学习Auto 》

    共同学习,共同进步, 转载请注明出处.欢迎微信交流:sfssqs,申请注明"Android Car"字样 ================= =================== ...

  5. Notepad++编写Markdown

    Markdown语法高亮 下载userDefineLang_markdown.xml 打开Notepad++的 Language 菜单,选中底部的 Define your language... 在 ...

  6. Notepad++配置Python开发环境

    1. 安装Python 1 下载 我选择了32位的2.7版本.https://www.python.org/ftp/python/2.7.8/python-2.7.8.msi 2. 安装 安装的时候可 ...

  7. 实战android菜单项之XML加载菜单与动态菜单项[转]

    原文地址:http://blog.csdn.net/kaiwii/article/details/7767225 自定义android应用程序的菜单项首先要知道切入点.经过学习,知道主要是两个Acti ...

  8. 【Markdown】notepad++ 支持 markdown语法、预览

    Notepad++中支持Markdown   最近在学习Markdown语言的使用,很想在XP主机上使用Markdown的离线编辑器,但MarkdownPad.作业部分的离线客户端都不能再XP上运行, ...

  9. xml 和 json 的区别

    JSON(Javascript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于Javascript Programming Langu ...

随机推荐

  1. Spring bean 实现初始化、销毁方法的方式及顺序

    Spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作,常用方法有三种: 使用注解,在指定方法上加上@PostConstruct或@PreDestroy注解来制定该方法是在初始化之后还是 ...

  2. Android 7.0 UICC 分析(三)

    本文讲解UICCCardApplication /frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/UiccC ...

  3. orm获取关联表里的属性值

    ORM——关系对象模型 laravel中的Eloquent ORM用于和数据表互动,其中每个数据库表会和一个对应的「模型」互动,想要了解请查看官方文档或自行百度.获取关联表里的属性值代码如下: /** ...

  4. sublime插件@sublimelinter安装使用

    sublimelinter插件是一款sublime编辑器的代码校验插件,支持多种语言,对于前端来说主要包含css和js校验. 要是用这款插件 1)安装node,然后在全局安装jshint(npm in ...

  5. 第五回. $e$ 的引入

    假如你有 $1$ 块钱, 存银行, 利率为 $100\%$, 那么一年后本息和为$$1+1=2.$$ 如果你换种存法, 存半年, 把本息和取出来, 再存半年, 那么一年后本息和为$$\left(1+\ ...

  6. C1000k 新思路:用户态 TCP/IP 协议栈

    现在的服务器支撑上百万个并发 TCP 连接已经不是新闻(余锋2010年的演讲,ideawu 的 iComet 开源项目,WhatsApp 做到了 2.5M).实现 C1000k 的常规做法是调整内核参 ...

  7. javascript判断变量是不是空值

    JavaScript本身没有判断一个变量是不是空值的函数,因为变量有可能是string,object,number,boolean等类型,类型不同,判断方法也不同.所以在文章中写了一个函数,用以判断J ...

  8. js动态生成二维码图片

    1.html代码 <div id="qrcode" style="width:200px; height:200px;position: fixed;bottom: ...

  9. Busybox下tftp命令使用详解

    http://blog.chinaunix.net/uid-375398-id-1991686.html Busybox下的tftp命令可以用来进行单文件传输.使用的时候,是把电脑作为服务器Serve ...

  10. js 常见混乱

    slice(begin.end) 复制出一个新的数组或是一个新的字符串,其中end 不包括end本身 splice(begin,howmany,item1....itemn) 更改原先的array 会 ...