mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-12-29 13:21:01 +00:00
Merge pull request #2071 from pchaigno/new-grammars
Grammars for 6 languages
This commit is contained in:
21
.gitmodules
vendored
21
.gitmodules
vendored
@@ -552,9 +552,6 @@
|
|||||||
[submodule "vendor/grammars/liquid.tmbundle"]
|
[submodule "vendor/grammars/liquid.tmbundle"]
|
||||||
path = vendor/grammars/liquid.tmbundle
|
path = vendor/grammars/liquid.tmbundle
|
||||||
url = https://github.com/bastilian/validcode-textmate-bundles
|
url = https://github.com/bastilian/validcode-textmate-bundles
|
||||||
[submodule "vendor/grammars/AutoHotkey"]
|
|
||||||
path = vendor/grammars/AutoHotkey
|
|
||||||
url = https://github.com/ahkscript/AutoHotkey
|
|
||||||
[submodule "vendor/grammars/ats.sublime"]
|
[submodule "vendor/grammars/ats.sublime"]
|
||||||
path = vendor/grammars/ats.sublime
|
path = vendor/grammars/ats.sublime
|
||||||
url = https://github.com/steinwaywhw/ats-mode-sublimetext
|
url = https://github.com/steinwaywhw/ats-mode-sublimetext
|
||||||
@@ -579,3 +576,21 @@
|
|||||||
[submodule "vendor/grammars/JSyntax"]
|
[submodule "vendor/grammars/JSyntax"]
|
||||||
path = vendor/grammars/JSyntax
|
path = vendor/grammars/JSyntax
|
||||||
url = https://github.com/bcj/JSyntax
|
url = https://github.com/bcj/JSyntax
|
||||||
|
[submodule "vendor/grammars/TXL"]
|
||||||
|
path = vendor/grammars/TXL
|
||||||
|
url = https://github.com/MikeHoffert/Sublime-Text-TXL-syntax
|
||||||
|
[submodule "vendor/grammars/G-Code"]
|
||||||
|
path = vendor/grammars/G-Code
|
||||||
|
url = https://github.com/robotmaster/sublime-text-syntax-highlighting
|
||||||
|
[submodule "vendor/grammars/grace-tmbundle"]
|
||||||
|
path = vendor/grammars/grace-tmbundle
|
||||||
|
url = https://github.com/zmthy/grace-tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-text-ox"]
|
||||||
|
path = vendor/grammars/sublime-text-ox
|
||||||
|
url = https://github.com/andreashetland/sublime-text-ox
|
||||||
|
[submodule "vendor/grammars/AutoHotkey"]
|
||||||
|
path = vendor/grammars/AutoHotkey
|
||||||
|
url = https://github.com/ahkscript/SublimeAutoHotkey
|
||||||
|
[submodule "vendor/grammars/ec.tmbundle"]
|
||||||
|
path = vendor/grammars/ec.tmbundle
|
||||||
|
url = https://github.com/ecere/ec.tmbundle
|
||||||
|
|||||||
16
grammars.yml
16
grammars.yml
@@ -24,7 +24,7 @@ vendor/grammars/Agda.tmbundle:
|
|||||||
- source.agda
|
- source.agda
|
||||||
vendor/grammars/Alloy.tmbundle:
|
vendor/grammars/Alloy.tmbundle:
|
||||||
- source.alloy
|
- source.alloy
|
||||||
vendor/grammars/AutoHotkey:
|
vendor/grammars/AutoHotkey/:
|
||||||
- source.ahk
|
- source.ahk
|
||||||
vendor/grammars/CLIPS-sublime:
|
vendor/grammars/CLIPS-sublime:
|
||||||
- source.clips
|
- source.clips
|
||||||
@@ -39,6 +39,12 @@ vendor/grammars/Docker.tmbundle:
|
|||||||
- source.dockerfile
|
- source.dockerfile
|
||||||
vendor/grammars/Elm.tmLanguage:
|
vendor/grammars/Elm.tmLanguage:
|
||||||
- source.elm
|
- source.elm
|
||||||
|
vendor/grammars/G-Code/:
|
||||||
|
- source.LS
|
||||||
|
- source.MCPOST
|
||||||
|
- source.MOD
|
||||||
|
- source.apt
|
||||||
|
- source.gcode
|
||||||
vendor/grammars/GDScript-sublime/:
|
vendor/grammars/GDScript-sublime/:
|
||||||
- source.gdscript
|
- source.gdscript
|
||||||
vendor/grammars/Handlebars:
|
vendor/grammars/Handlebars:
|
||||||
@@ -106,6 +112,8 @@ vendor/grammars/SublimeBrainfuck:
|
|||||||
- source.bf
|
- source.bf
|
||||||
vendor/grammars/SublimeXtend:
|
vendor/grammars/SublimeXtend:
|
||||||
- source.xtend
|
- source.xtend
|
||||||
|
vendor/grammars/TXL/:
|
||||||
|
- source.txl
|
||||||
vendor/grammars/Textmate-Gosu-Bundle:
|
vendor/grammars/Textmate-Gosu-Bundle:
|
||||||
- source.gosu.2
|
- source.gosu.2
|
||||||
vendor/grammars/VBDotNetSyntax:
|
vendor/grammars/VBDotNetSyntax:
|
||||||
@@ -192,6 +200,8 @@ vendor/grammars/dylan.tmbundle:
|
|||||||
- source.makegen
|
- source.makegen
|
||||||
vendor/grammars/ebundles/Bundles/MSDOS batch file.tmbundle:
|
vendor/grammars/ebundles/Bundles/MSDOS batch file.tmbundle:
|
||||||
- source.dosbatch
|
- source.dosbatch
|
||||||
|
vendor/grammars/ec.tmbundle/:
|
||||||
|
- source.c.ec
|
||||||
vendor/grammars/eiffel.tmbundle:
|
vendor/grammars/eiffel.tmbundle:
|
||||||
- source.eiffel
|
- source.eiffel
|
||||||
vendor/grammars/elixir-tmbundle:
|
vendor/grammars/elixir-tmbundle:
|
||||||
@@ -219,6 +229,8 @@ vendor/grammars/gnuplot-tmbundle:
|
|||||||
- source.gnuplot
|
- source.gnuplot
|
||||||
vendor/grammars/go-tmbundle:
|
vendor/grammars/go-tmbundle:
|
||||||
- source.go
|
- source.go
|
||||||
|
vendor/grammars/grace-tmbundle/:
|
||||||
|
- source.grace
|
||||||
vendor/grammars/gradle.tmbundle:
|
vendor/grammars/gradle.tmbundle:
|
||||||
- source.groovy.gradle
|
- source.groovy.gradle
|
||||||
vendor/grammars/graphviz.tmbundle:
|
vendor/grammars/graphviz.tmbundle:
|
||||||
@@ -447,6 +459,8 @@ vendor/grammars/sublime-sourcepawn:
|
|||||||
- source.sp
|
- source.sp
|
||||||
vendor/grammars/sublime-tea:
|
vendor/grammars/sublime-tea:
|
||||||
- source.tea
|
- source.tea
|
||||||
|
vendor/grammars/sublime-text-ox/:
|
||||||
|
- source.ox
|
||||||
vendor/grammars/sublime_cobol:
|
vendor/grammars/sublime_cobol:
|
||||||
- source.acucobol
|
- source.acucobol
|
||||||
- source.cobol
|
- source.cobol
|
||||||
|
|||||||
@@ -943,7 +943,7 @@ G-code:
|
|||||||
- .g
|
- .g
|
||||||
- .gco
|
- .gco
|
||||||
- .gcode
|
- .gcode
|
||||||
tm_scope: none
|
tm_scope: source.gcode
|
||||||
ace_mode: gcode
|
ace_mode: gcode
|
||||||
|
|
||||||
GAMS:
|
GAMS:
|
||||||
@@ -1093,7 +1093,7 @@ Grace:
|
|||||||
type: programming
|
type: programming
|
||||||
extensions:
|
extensions:
|
||||||
- .grace
|
- .grace
|
||||||
tm_scope: none
|
tm_scope: source.grace
|
||||||
ace_mode: text
|
ace_mode: text
|
||||||
|
|
||||||
Gradle:
|
Gradle:
|
||||||
@@ -2097,7 +2097,7 @@ Ox:
|
|||||||
- .ox
|
- .ox
|
||||||
- .oxh
|
- .oxh
|
||||||
- .oxo
|
- .oxo
|
||||||
tm_scope: none
|
tm_scope: source.ox
|
||||||
ace_mode: text
|
ace_mode: text
|
||||||
|
|
||||||
Oxygene:
|
Oxygene:
|
||||||
@@ -2922,7 +2922,7 @@ TXL:
|
|||||||
type: programming
|
type: programming
|
||||||
extensions:
|
extensions:
|
||||||
- .txl
|
- .txl
|
||||||
tm_scope: none
|
tm_scope: source.txl
|
||||||
ace_mode: text
|
ace_mode: text
|
||||||
|
|
||||||
Tcl:
|
Tcl:
|
||||||
@@ -3332,7 +3332,7 @@ eC:
|
|||||||
extensions:
|
extensions:
|
||||||
- .ec
|
- .ec
|
||||||
- .eh
|
- .eh
|
||||||
tm_scope: none
|
tm_scope: source.c.ec
|
||||||
ace_mode: text
|
ace_mode: text
|
||||||
|
|
||||||
edn:
|
edn:
|
||||||
|
|||||||
337
samples/eC/Designer.ec
Normal file
337
samples/eC/Designer.ec
Normal file
@@ -0,0 +1,337 @@
|
|||||||
|
import "ide"
|
||||||
|
|
||||||
|
class Designer : DesignerBase
|
||||||
|
{
|
||||||
|
~Designer()
|
||||||
|
{
|
||||||
|
if(GetActiveDesigner() == this)
|
||||||
|
{
|
||||||
|
SetActiveDesigner(null);
|
||||||
|
}
|
||||||
|
if(classDesigner)
|
||||||
|
delete classDesigner;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *** DesignerBase Implementation ***
|
||||||
|
|
||||||
|
void ModifyCode()
|
||||||
|
{
|
||||||
|
codeEditor.ModifyCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateProperties()
|
||||||
|
{
|
||||||
|
codeEditor.DesignerModifiedObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CodeAddObject(Instance instance, ObjectInfo * object)
|
||||||
|
{
|
||||||
|
codeEditor.AddObject(instance, object);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SheetAddObject(ObjectInfo object)
|
||||||
|
{
|
||||||
|
codeEditor.sheet.AddObject(object, object.name, typeData, true); //className, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddToolBoxClass(Class _class)
|
||||||
|
{
|
||||||
|
((IDEWorkSpace)master).toolBox.AddControl(_class);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddDefaultMethod(Instance instance, Instance classInstance)
|
||||||
|
{
|
||||||
|
Class _class = instance._class;
|
||||||
|
Method defaultMethod = null;
|
||||||
|
|
||||||
|
for( ; _class; _class = _class.base)
|
||||||
|
{
|
||||||
|
Method method;
|
||||||
|
int minID = MAXINT;
|
||||||
|
for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)
|
||||||
|
{
|
||||||
|
if(method.type == virtualMethod)
|
||||||
|
{
|
||||||
|
if(!method.dataType)
|
||||||
|
method.dataType = ProcessTypeString(method.dataTypeString, false);
|
||||||
|
if(method.vid < minID && (instance == classInstance || (method.dataType.thisClass && eClass_IsDerived(classInstance._class, method.dataType.thisClass.registered))))
|
||||||
|
{
|
||||||
|
defaultMethod = method;
|
||||||
|
minID = method.vid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(defaultMethod)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
codeEditor.AddMethod(defaultMethod);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ObjectContainsCode(ObjectInfo object)
|
||||||
|
{
|
||||||
|
// Confirmation if control contains code
|
||||||
|
if(object.instCode)
|
||||||
|
{
|
||||||
|
MembersInit members;
|
||||||
|
if(object.instCode.members)
|
||||||
|
{
|
||||||
|
for(members = object.instCode.members->first; members; members = members.next)
|
||||||
|
{
|
||||||
|
if(members.type == methodMembersInit)
|
||||||
|
{
|
||||||
|
//if(!Code_IsFunctionEmpty(members.function))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeleteObject(ObjectInfo object)
|
||||||
|
{
|
||||||
|
if(codeEditor)
|
||||||
|
codeEditor.DeleteObject(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenameObject(ObjectInfo object, const char * name)
|
||||||
|
{
|
||||||
|
if(object && (name || !object.classDefinition))
|
||||||
|
codeEditor.RenameObject(object, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FindObject(Instance * object, const char * string)
|
||||||
|
{
|
||||||
|
ObjectInfo classObject;
|
||||||
|
for(classObject = codeEditor.classes.first; classObject; classObject = classObject.next)
|
||||||
|
{
|
||||||
|
ObjectInfo check;
|
||||||
|
if(classObject.name && !strcmp(string, classObject.name))
|
||||||
|
{
|
||||||
|
*object = classObject.instance;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for(check = classObject.instances.first; check; check = check.next)
|
||||||
|
{
|
||||||
|
if(check.name && !strcmp(string, check.name))
|
||||||
|
{
|
||||||
|
*object = check.instance;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(check)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SelectObjectFromDesigner(ObjectInfo object)
|
||||||
|
{
|
||||||
|
codeEditor.SelectObjectFromDesigner(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
borderStyle = sizable;
|
||||||
|
isActiveClient = true;
|
||||||
|
hasVertScroll = true;
|
||||||
|
hasHorzScroll = true;
|
||||||
|
hasClose = true;
|
||||||
|
hasMaximize = true;
|
||||||
|
hasMinimize = true;
|
||||||
|
text = $"Designer";
|
||||||
|
menu = Menu { };
|
||||||
|
anchor = Anchor { left = 300, right = 150, top = 0, bottom = 0 };
|
||||||
|
|
||||||
|
ToolBox toolBox;
|
||||||
|
CodeEditor codeEditor;
|
||||||
|
|
||||||
|
Menu fileMenu { menu, $"File", f };
|
||||||
|
MenuItem fileSaveItem
|
||||||
|
{
|
||||||
|
fileMenu, $"Save", s, ctrlS;
|
||||||
|
bool NotifySelect(MenuItem selection, Modifiers mods)
|
||||||
|
{
|
||||||
|
return codeEditor.MenuFileSave(selection, mods);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
MenuItem fileSaveAsItem
|
||||||
|
{
|
||||||
|
fileMenu, $"Save As...", a;
|
||||||
|
bool NotifySelect(MenuItem selection, Modifiers mods)
|
||||||
|
{
|
||||||
|
return codeEditor.MenuFileSaveAs(selection, mods);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
bool debugClosing;
|
||||||
|
|
||||||
|
bool OnClose(bool parentClosing)
|
||||||
|
{
|
||||||
|
if(!parentClosing)
|
||||||
|
{
|
||||||
|
if(codeEditor && codeEditor.inUseDebug && !debugClosing)
|
||||||
|
{
|
||||||
|
debugClosing = true;
|
||||||
|
closing = false;
|
||||||
|
if(CloseConfirmation(false))
|
||||||
|
{
|
||||||
|
visible = false;
|
||||||
|
if(modifiedDocument)
|
||||||
|
OnFileModified({ modified = true }, null);
|
||||||
|
}
|
||||||
|
debugClosing = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(codeEditor && !codeEditor.closing && !debugClosing)
|
||||||
|
{
|
||||||
|
if(!codeEditor.visible)
|
||||||
|
{
|
||||||
|
if(!codeEditor.Destroy(0))
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
codeEditor = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
visible = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OnActivate(bool active, Window previous, bool * goOnWithActivation, bool direct)
|
||||||
|
{
|
||||||
|
if(active)
|
||||||
|
{
|
||||||
|
codeEditor.EnsureUpToDate();
|
||||||
|
codeEditor.fixCaret = true;
|
||||||
|
/*
|
||||||
|
if(classDesigner)
|
||||||
|
classDesigner.Activate();
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OnKeyHit(Key key, unichar ch)
|
||||||
|
{
|
||||||
|
return codeEditor.sheet.OnKeyHit(key, ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(modifiedDocument)
|
||||||
|
{
|
||||||
|
fileSaveItem.disabled = !modifiedDocument && codeEditor.fileName;
|
||||||
|
};
|
||||||
|
|
||||||
|
// *** METHODS ACCESSED FROM PROPERTY SHEET/TOOLBOX/CODE EDITOR ***
|
||||||
|
void Reset()
|
||||||
|
{
|
||||||
|
if(classDesigner)
|
||||||
|
{
|
||||||
|
classDesigner.Reset();
|
||||||
|
classDesigner.SelectObject(null, null);
|
||||||
|
classDesigner.Destroy(0);
|
||||||
|
delete classDesigner;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FillToolBox()
|
||||||
|
{
|
||||||
|
if(this && classDesigner)
|
||||||
|
classDesigner.ListToolBoxClasses(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SelectObject(ObjectInfo object, Instance instance)
|
||||||
|
{
|
||||||
|
ClassDesignerBase classDesigner = this.classDesigner;
|
||||||
|
#ifdef _DEBUG
|
||||||
|
if(instance && instance._class.module.application != codeEditor.privateModule)
|
||||||
|
printf("warning: SelectObject: instance._class.module.application != codeEditor.privateModule\n");
|
||||||
|
#endif
|
||||||
|
if(!classDesigner || !instance || classDesigner._class != (Class)eInstance_GetDesigner(instance))
|
||||||
|
{
|
||||||
|
if(classDesigner)
|
||||||
|
{
|
||||||
|
classDesigner.SelectObject(null, null);
|
||||||
|
classDesigner.Destroy(0);
|
||||||
|
classDesigner = null;
|
||||||
|
delete this.classDesigner;
|
||||||
|
}
|
||||||
|
if(instance)
|
||||||
|
{
|
||||||
|
this.classDesigner = classDesigner = eInstance_New(eInstance_GetDesigner(instance));
|
||||||
|
incref classDesigner;
|
||||||
|
//if(!classDesigner.parent)
|
||||||
|
{
|
||||||
|
classDesigner.parent = this;
|
||||||
|
classDesigner.anchor = Anchor { left = 0, right = 0, top = 0, bottom = 0 };
|
||||||
|
}
|
||||||
|
classDesigner.Create();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Call class editor SelectObject
|
||||||
|
if(classDesigner)
|
||||||
|
classDesigner.SelectObject(object, instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddObject()
|
||||||
|
{
|
||||||
|
// Call class editor AddObject
|
||||||
|
if(classDesigner)
|
||||||
|
classDesigner.AddObject();
|
||||||
|
if(visible)
|
||||||
|
Activate();
|
||||||
|
else
|
||||||
|
codeEditor.Activate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreateObject(Instance instance, ObjectInfo object, bool isClass, Instance iclass)
|
||||||
|
{
|
||||||
|
subclass(ClassDesignerBase) designerClass = eInstance_GetDesigner(instance);
|
||||||
|
|
||||||
|
// Call class editor CreateObject
|
||||||
|
if(designerClass)
|
||||||
|
designerClass.CreateObject(this, instance, object, isClass, iclass);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ::PostCreateObject(Instance instance, ObjectInfo object, bool isClass, Instance iclass)
|
||||||
|
{
|
||||||
|
subclass(ClassDesignerBase) designerClass = eInstance_GetDesigner(instance);
|
||||||
|
|
||||||
|
// Call class editor PostCreateObject
|
||||||
|
if(designerClass)
|
||||||
|
designerClass.PostCreateObject(instance, object, isClass, iclass);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ::DroppedObject(Instance instance, ObjectInfo object, bool isClass, Instance iclass)
|
||||||
|
{
|
||||||
|
subclass(ClassDesignerBase) designerClass = eInstance_GetDesigner(instance);
|
||||||
|
|
||||||
|
// Call class editor PostCreateObject
|
||||||
|
if(designerClass)
|
||||||
|
designerClass.DroppedObject(instance, object, isClass, iclass);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrepareTestObject(Instance instance)
|
||||||
|
{
|
||||||
|
subclass(ClassDesignerBase) designerClass = eInstance_GetDesigner(instance);
|
||||||
|
if(designerClass)
|
||||||
|
designerClass.PrepareTestObject(this, instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ::DestroyObject(Instance instance)
|
||||||
|
{
|
||||||
|
subclass(ClassDesignerBase) designerClass = eInstance_GetDesigner(instance);
|
||||||
|
if(designerClass)
|
||||||
|
designerClass.DestroyObject(instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ::FixProperty(Property prop, Instance instance)
|
||||||
|
{
|
||||||
|
subclass(ClassDesignerBase) designerClass = eInstance_GetDesigner(instance);
|
||||||
|
if(designerClass)
|
||||||
|
designerClass.FixProperty(prop, instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
1
vendor/grammars/G-Code
vendored
Submodule
1
vendor/grammars/G-Code
vendored
Submodule
Submodule vendor/grammars/G-Code added at 81e8b03e3d
1
vendor/grammars/TXL
vendored
Submodule
1
vendor/grammars/TXL
vendored
Submodule
Submodule vendor/grammars/TXL added at c1c98dfa86
1
vendor/grammars/ec.tmbundle
vendored
Submodule
1
vendor/grammars/ec.tmbundle
vendored
Submodule
Submodule vendor/grammars/ec.tmbundle added at b8ec2d32af
1
vendor/grammars/grace-tmbundle
vendored
Submodule
1
vendor/grammars/grace-tmbundle
vendored
Submodule
Submodule vendor/grammars/grace-tmbundle added at c342d35c76
1
vendor/grammars/sublime-text-ox
vendored
Submodule
1
vendor/grammars/sublime-text-ox
vendored
Submodule
Submodule vendor/grammars/sublime-text-ox added at bdd03e09fa
Reference in New Issue
Block a user