NOTIFICATION.FILESAVED, на которое можно повесить git add и git commit. Отдельный watcher или NppExec для этого не нужен.Plugins → Plugins Admin....Plugins → PythonScript → Configuration....ATSTARTUP. Заодно полезно включить Automatically open console on error, чтобы ошибки скрипта сразу были видны.Plugins → PythonScript → Scripts и startup (User). Если пользовательского startup.py ещё нет — создать через Plugins → PythonScript → New Script файл с именем startup.py.from Npp import notepad, NOTIFICATION
import os
import subprocess
import datetime
def on_save(args):
filename = notepad.getBufferFilename(args["bufferID"])
file_dir = os.path.dirname(filename)
try:
repo = subprocess.check_output([
"git", "-C", file_dir,
"rev-parse", "--show-toplevel"
]).strip()
except subprocess.CalledProcessError:
return
rel_file = os.path.relpath(filename, repo)
subprocess.call([
"git", "-C", repo,
"add", "--", rel_file
])
changed = subprocess.call([
"git", "-C", repo,
"diff", "--cached", "--quiet",
"--", rel_file
])
if changed != 0:
message = "autosave " + datetime.datetime.now().strftime(
"%Y-%m-%d %H:%M:%S"
)
subprocess.call([
"git", "-C", repo,
"commit",
"-m", message,
"--", rel_file
])
notepad.callback(on_save, [NOTIFICATION.FILESAVED])git rev-parse --show-toplevel определяет его Git-репозиторий;git должен быть установлен и доступен через PATH, а файл должен находиться внутри уже созданного Git-репозитория.Settings → Preferences → Backup → Backup on save → Verbose backuppush — это история версий, но не полноценный backup. При потере диска вместе с рабочей папкой пропадёт и каталог .git. Если нужна именно резервная копия, репозиторий надо периодически отправлять во внешнее хранилище.
<b class="aaakjhij" data="hk">jjj!!!!</b> должно быть уже в шаблоне. Если надо по условию - то использовать v-if или v-for если несколько.<script>
export default {
data() {
return {
data: 'hk',
text: 'jjj!!!!',
show: false
}
},
methods: {
_jjj(){
this.show = true
this.data = 'hk';
this.text = 'jjj!!!!';
},
_kkk(){
this.data = 'ooooooooooo';
this.text = 'ha-ha-haaaa!!!'
}
}
}
</script>
<template>
<div>
<b v-if="show" :data="data">{{text}}</b>
</div>
<button @click="_jjj">11</button>
<button @click="_kkk">12</button>
</template><template id="component-id"> в качестве источника шаблона компонента, а уже компоненты поместить в корень приложения (<div id="app"> или что-то подобное) https://codepen.io/FragsterAt/pen/gONyzdJ
v-for.@media (min-width: 768px) /* ширина по вашему хотению */ {
.block {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.yellow {
grid-column: span 3;
}
}
data: () => ({
filterColumns: [
[ 'name', 'имя', 'string' ],
[ 'count', 'количество', 'number' ],
[ 'distance', 'расстояние', 'number' ],
],
operations: [
[ 'equal', 'равно' ],
[ 'contains', 'содержит' ],
[ 'greater', 'больше' ],
[ 'less', 'меньше' ],
],
...data: () => ({
types: {
string: {
equal: (a, b) => a.toLowerCase() === b,
contains: (a, b) => a.toLowerCase().includes(b),
greater: (a, b) => a.toLowerCase() > b,
less: (a, b) => a.toLowerCase() < b,
},
number: {
equal: (a, b) => a === +b,
contains: (a, b) => `${a}`.includes(b),
greater: (a, b) => a > +b,
less: (a, b) => a < +b,
},
},
...<select v-model="column">
<option v-for="n in filterColumns" :value="n[0]">{{ n[1] }}</option>
</select>
<select v-model="operation">
<option v-for="n in operations" :value="n[0]">{{ n[1] }}</option>
</select>computed: {
filteredItems() {
const { items, column } = this;
const type = this.filterColumns.find(n => n[0] === column)?.[2];
const filterFn = this.types[type]?.[this.operation];
const filterVal = this.filterVal.toLowerCase();
return filterFn && filterVal
? items.filter(n => filterFn(n[column], filterVal))
: items;
},
...
li:not(:first-child, :last-child)li:not(:first-child):not(:last-child)li {
/* тут стили для всех элементов */
}
li:first-child,
li:last-child {
/* здесь сбрасываете стили, установленные выше */
}