Skip to content

Commit 5af8e42

Browse files
committed
feat: add emmet
1 parent a84174a commit 5af8e42

File tree

6 files changed

+104
-5
lines changed

6 files changed

+104
-5
lines changed

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,15 @@
3535
"homepage": "https://github.com/vuetifyjs/vue-repl#readme",
3636
"devDependencies": {
3737
"@babel/types": "^7.15.6",
38+
"@emmetio/abbreviation": "^2.3.3",
39+
"@emmetio/codemirror-plugin": "^1.2.4",
40+
"@emmetio/css-abbreviation": "^2.1.8",
3841
"@microsoft/api-extractor": "^7.19.2",
3942
"@types/codemirror": "^5.60.2",
4043
"@types/node": "^16.11.12",
4144
"@vitejs/plugin-vue": "^3.0.0",
4245
"codemirror": "^5.62.3",
46+
"emmet": "^2.4.4",
4347
"fflate": "^0.7.3",
4448
"hash-sum": "^2.0.0",
4549
"rimraf": "^3.0.2",

pnpm-lock.yaml

Lines changed: 35 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/codemirror/CodeMirror.vue

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,19 @@ onMounted(() => {
2929
autoCloseBrackets: true,
3030
autoCloseTags: true,
3131
foldGutter: true,
32-
gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter']
32+
gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter'],
33+
extraKeys: {
34+
'Tab': 'emmetExpandAbbreviation',
35+
'Esc': 'emmetResetAbbreviation',
36+
'Enter': 'emmetInsertLineBreak'
37+
},
38+
emmet: {
39+
mark: true,
40+
markTagPairs: true,
41+
previewOpenTag: true,
42+
preview: true,
43+
autoRenameTags: true,
44+
}
3345
}
3446
3547
const editor = CodeMirror(el.value!, {
@@ -39,6 +51,7 @@ onMounted(() => {
3951
tabSize: 2,
4052
lineWrapping: true,
4153
lineNumbers: true,
54+
inputStyle: 'contenteditable',
4255
...addonOptions
4356
})
4457

src/codemirror/codemirror.css

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,9 @@
249249
.cm-s-default .cm-meta {
250250
color: #555;
251251
}
252+
.cm-s-default .cm-mustache {
253+
color: var(--base);
254+
}
252255
.cm-s-default .cm-qualifier {
253256
color: var(--qualifier);
254257
}
@@ -520,3 +523,43 @@ div.CodeMirror-dragcursors {
520523
span.CodeMirror-selectedtext {
521524
background: none;
522525
}
526+
527+
/* Emmet */
528+
.emmet-abbreviation {
529+
border-bottom: 1px solid rgba(0, 180, 0, 0.3);
530+
border-radius: 2px;
531+
}
532+
533+
.emmet-abbreviation-preview {
534+
background: #111;
535+
border-radius: 4px;
536+
overflow: hidden;
537+
z-index: 2;
538+
}
539+
540+
.emmet-abbreviation-preview .CodeMirror-cursors {
541+
display: none;
542+
}
543+
544+
.emmet-abbreviation-preview .CodeMirror-vscrollbar {
545+
overflow: hidden;
546+
}
547+
548+
.emmet-abbreviation-preview .CodeMirror-sizer {
549+
border-right: 0;
550+
}
551+
552+
.emmet-open-tag, .emmet-close-tag {
553+
text-decoration: underline;
554+
}
555+
556+
.emmet-tag-preview {
557+
background: #117700;
558+
color: #ffffff;
559+
border-radius: 2px;
560+
padding: 2px 4px;
561+
font-size: 0.8em;
562+
opacity: 0.6;
563+
margin-top: -16px;
564+
margin-left: 2px;
565+
}

src/codemirror/codemirror.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import './codemirror.css'
55
import 'codemirror/mode/javascript/javascript.js'
66
import 'codemirror/mode/css/css.js'
77
import 'codemirror/mode/htmlmixed/htmlmixed.js'
8+
import 'codemirror/mode/vue/vue.js'
89

910
// addons
1011
import 'codemirror/addon/edit/closebrackets.js'
@@ -16,4 +17,8 @@ import 'codemirror/addon/fold/brace-fold.js'
1617
import 'codemirror/addon/fold/indent-fold.js'
1718
import 'codemirror/addon/fold/comment-fold.js'
1819

20+
import emmet from '@emmetio/codemirror-plugin'
21+
22+
emmet(CodeMirror)
23+
1924
export default CodeMirror

src/editor/Editor.vue

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,9 @@ const onChange = debounce((code: string) => {
1414
1515
const activeMode = computed(() => {
1616
const { filename } = store.state.activeFile
17-
return filename.endsWith('.vue') || filename.endsWith('.html')
18-
? 'htmlmixed'
19-
: filename.endsWith('.css')
20-
? 'css'
17+
return filename.endsWith('.vue') ? 'vue'
18+
: filename.endsWith('.html') ? 'htmlmixed'
19+
: filename.endsWith('.css') ? 'css'
2120
: 'javascript'
2221
})
2322
</script>

0 commit comments

Comments
 (0)