Snippets System¶
Sync from github¶
curl https://codeload.github.com/hotchilipowder/my_config/tar.gz/main | tar -xz --strip=2 -C ~/.config/nvim/ my_config-main/snippets/
DIY for vim-snippets¶
在使用了2年的 [vim-snippets] 后,因为入坑了 [typst] ,所以决定还是切换到自己的repository下,以便能支持snippets. 此外,因为写snippets的过程其实也是对于语法进行学习了解的过程,例如我根据阅读一些rst的snippet,很好的学习了许多的相关的用法。 因此,个人认为是时候 (2024-12-08) 切换到这里来了。
Introduction¶
使用Snippets无意是在日常工作流中非常重要的一环。
常见的编辑起无论是 vscode
还是 neovim
都有很多的snippets系统。
Ultisnipets¶
Just use UltiSnipsEdit
注意
特别的,当我们写python的时候,可能需要用到一些Rst的snippets。我们可以用 UltiSnipsAddFiletypes python.rst
。这个功能很重要,然而 it cannot provide a command like :UltiSnipsAddFiletypes in coc.nvim. 建议还是换官方吧...
python¶
latex¶
[tttbegin] xelatex begin
% !TeX program = xelatex
[snippet] (^|[^a-zA-Z])mi
`!p snip.rv = match.group(1)`\$${1:${VISUAL:}} \$$0
[hello] test for python
`!p snip.rv="hello world"`
restructuredtext¶
[xref] Description
:xref:\`$1\`
[test] Description
${1:${VISUAL:test}}
Vsnip¶
Just use VsniptOpenEdit
python¶
[pytornado_begin] pytornado_begin"
{
"prefix": "pytornado_begin",
"body": [
"#!/usr/bin/env python",
"",
"import os",
"import sys",
"import logging",
"",
"import tornado.httpserver",
"import tornado.ioloop",
"import tornado.wsgi",
"import tornado.web",
"",
"logger = logging.getLogger('tornado_proxy')",
" # https://github.com/senko/tornado-proxy/blob/master/tornado_proxy/proxy.py",
"class MainHandler(tornado.web.RequestHandler):",
" async def get(self):",
" self.write(\"Hello world!\")",
" self.finish()",
"",
"",
"",
"if __name__ == \"__main__\":",
" # path to your settings module",
" os.environ['DJANGO_SETTINGS_MODULE'] = 'xxx.settings'",
" os.environ[\"DJANGO_ALLOW_ASYNC_UNSAFE\"] = \"true\"",
" # from xxx.wsgi import application",
" # container = tornado.wsgi.WSGIContainer(application)",
"",
" tornado_app = tornado.web.Application(",
" [",
" # python manage.py collectstatic to get django statics",
" (r'/static/(.*)', tornado.web.StaticFileHandler, {\"path\": './staticfiles'}),",
" (r'/uploads/(.*)', tornado.web.StaticFileHandler, {\"path\": './uploads'}),",
" # (r'/admin.*', tornado.web.FallbackHandler, dict(fallback=container)),",
" (r'.*', MainHandler),",
" ],",
" debug=True,",
" autoreload=True",
" )",
" http_server = tornado.httpserver.HTTPServer(tornado_app)",
" http_server.bind(21318, address='0')",
" http_server.start(0) # forks one process per cpu",
" tornado.ioloop.IOLoop.current().start()",
""
]
}
[pydjango_setup] pydjango_setup"
{
"prefix": "pydjango_setup",
"body": [
"import os",
"import sys",
"BASE_DIR =os.path.abspath(__file__)",
"django_project_path = os.path.abspath(os.path.join(BASE_DIR, 'xxx'))",
"print(django_project_path)",
"sys.path.append(django_project_path)",
"print(sys.path)",
"os.environ['DJANGO_SETTINGS_MODULE'] = 'xxx.settings'",
"os.environ['DJANGO_ALLOW_ASYNC_UNSAFE'] = 'True'",
"import django",
"django.setup()",
""
]
}
[jupyterbegin] jupyterbegin"
{
"prefix": "jupyterbegin",
"body": [
"import os",
"import re",
"import sys",
"import time",
"import json",
"import math",
"import random",
"import pickle",
"import logging",
"import subprocess",
"",
"from collections import defaultdict",
"",
"import scipy as sc",
"import pandas as pd",
"import seaborn as sns",
"import numpy as np",
"import matplotlib",
"",
"import networkx as nx",
"from tqdm import tqdm_notebook",
"",
"### this config add some fonts to the ttflist dir",
"import matplotlib.font_manager as font_manager",
"font_dirs = ['/home/huangjunjie/fonts']",
"font_files = font_manager.findSystemFonts(fontpaths=font_dirs)",
"font_list = font_manager.createFontList(font_files)",
"# print(font_list) # list what fonts you have",
"font_manager.fontManager.ttflist.extend(font_list)",
"",
"## this set to matplotlib",
"matplotlib.rcParams['font.family'] = \"sans-serif\"",
"matplotlib.rcParams['font.sans-serif'] = [\"CMU Sans Serif\"]",
"import matplotlib.pyplot as plt",
"plt.style.context('journal')",
"",
"%matplotlib inline",
"sns.set_context(\"paper\", font_scale=1.5, rc={'text.usetex' : True})",
"sns.set_style(\"white\")",
"sns.set_style({'font.family': 'sans-serif'})",
"sns.set_style({'font.sans-serif': [\"Helvetica\"]})"
]
}
[pydjango_simple] pydjango_simple"
{
"prefix": "pydjango_simple",
"body": [
"import os",
"import sys",
"",
"from django.conf import settings",
"",
"DEBUG = os.environ.get('DEBUG', 'on') == 'on'",
"SECRET_KEY = os.environ.get('SECRET_KEY', os.urandom(32))",
"ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', 'localhost').split(',')",
"",
"",
"",
"settings.configure(",
" DEBUG=DEBUG,",
" SECRET_KEY=SECRET_KEY,",
" ALLOWED_HOSTS=ALLOWED_HOSTS,",
" ROOT_URLCONF=__name__,",
" MIDDLEWARE_CLASSES=(",
" 'django.middleware.common.CommonMiddleware',",
" 'django.middleware.csrf.CsrfViewMiddleware',",
" 'django.middleware.clickjacking.XFrameOptionsMiddleware',",
" )",
")",
"",
"",
"from django.conf.urls import re_path",
"from django.http import HttpResponse",
"from django.core.wsgi import get_wsgi_application",
"",
"def index(request):",
" return HttpResponse('Hello World')",
"",
"",
"urlpatterns = (",
" re_path(r'^', index),",
")",
"",
"application = get_wsgi_application()",
"",
"",
"if __name__ == \"__main__\":",
" from django.core.management import execute_from_command_line",
"",
" execute_from_command_line(sys.argv)",
"",
"## run it by python xxx.py runserver",
"",
"",
"## writing views, creating settings, and running management commands"
]
}
[pyloggerbegin] pyloggerbegin"
{
"prefix": "pyloggerbegin",
"body": [
"import logging",
"# https://docs.python.org/3/howto/logging.html#logging-advanced-tutorial",
"",
"logger = logging.getLogger(__file__)",
"logger.setLevel(logging.DEBUG)",
"",
"ch = logging.StreamHandler()",
"ch.setLevel(logging.DEBUG)",
"",
"fh = logging.FileHandler(f'{__file__}.log')",
"fh.setLevel(logging.INFO)",
"",
"# create formatter",
"formatter = logging.Formatter('%(asctime)s %(levelname)s [%(filename)s:%(lineno)d] %(message)s')",
"",
"# add formatter to ch",
"ch.setFormatter(formatter)",
"fh.setFormatter(formatter)",
"",
"# add handler to logger",
"logger.addHandler(ch)",
"logger.addHandler(fh)",
"",
"# 'application' code",
"logger.debug('debug message')",
"logger.info('info message')",
"logger.warning('warn message')",
"logger.error('error message')",
"logger.critical('critical message')"
]
}
[pyaiohttp] pyaiohttp"
{
"prefix": "pyaiohttp",
"body": [
"from aiohttp import web",
"",
"async def handler(request):",
" return web.Response(text=\"Hello, world!\")",
"",
"app = web.Application()",
"app.add_routes([web.get('/', handler)])",
"",
"if __name__ == '__main__':",
" web.run_app(app)"
]
}
[pytorchtemplate] pytorchtemplate"
{
"prefix": "pytorchtemplate",
"body": [
"import os",
"import re",
"import sys",
"import time",
"import json",
"import math",
"import random",
"import pickle",
"import logging",
"import argparse",
"import subprocess",
"",
"from collections import defaultdict",
"",
"import scipy as sc",
"import numpy as np",
"import pandas as pd",
"",
"import torch",
"import torch.nn as nn",
"import torch.nn.functional as F",
"",
"from tqdm import tqdm",
"",
"BASE_DIR = os.path.dirname(os.path.abspath(__file__))",
"",
"parser = argparse.ArgumentParser()",
"## required",
"",
"## others",
"parser.add_argument('--device', default='cuda:0', help='Devices')",
"parser.add_argument('--mode', type=str, default='train', help=\"Train or test\")",
"parser.add_argument('--lr', type=float, default=1e-4, help=\"Learning rate\")",
"parser.add_argument('--weight_decay', type=float, default=0.0001, help=\"Weight Decay\")",
"### less important",
"parser.add_argument('--seed', type=int, default=12, help=\"Seed\")",
"parser.add_argument('--basepath', default=BASE_DIR, help='\u5f53\u524d\u76ee\u5f55')",
"parser.add_argument('--dir', type=str, default='ckpt', help=\"Checkpoint directory\")",
"",
"",
"",
"opt = parser.parse_args()",
"",
"torch.manual_seed(opt.seed)",
"torch.cuda.manual_seed(opt.seed)",
"random.seed(opt.seed)",
"np.random.seed(opt.seed)",
"",
"",
"if not os.path.exists(opt.dir):",
" os.mkdir(opt.dir)",
"",
"def load_from_json(fin):",
" datas = []",
" for line in fin:",
" data = json.loads(line)",
" datas.append(data)",
" return datas",
"",
"def dump_to_json(datas, fout):",
" for data in datas:",
" fout.write(json.dumps(data, sort_keys=True, separators=(',', ': '), ensure_ascii=False))",
" fout.write('\\n')",
" fout.close()",
"",
"class Model(nn.Module):",
" \"\"\"",
" here you can write sth about your model",
" \"\"\"",
" def __init__(self):",
" super(Model, self).__init__()",
"",
" def forward(self):",
" pass",
"",
"class MyDataset(torch.utils.data.Dataset):",
" \"\"\"[here you write your dataset]",
"",
" Arguments:",
" torch {[type]} -- [description]",
" \"\"\"",
" def __init__(self, data_pth, is_train=True):",
" self.datas = []",
" pass",
"",
" def __len__(self):",
" return len(self.datas)",
"",
" def __getitem__(self, index):",
" data = self.datas[index]",
"",
" X = '0'",
" Y = '0'",
" return X, Y",
"",
"def get_dataset(data_path, is_train=True):",
" return MyDataset(data_path, is_train=is_train)",
"",
"def get_dataloader(dataset, batch_size, is_train=True):",
" return torch.utils.data.DataLoader(dataset=dataset, batch_size=batch_size, shuffle=is_train)",
"",
"def save_model(path, model):",
" model_state_dict = model.state_dict()",
" torch.save(model_state_dict, path)",
"",
"def train():",
" train_path = '' ###",
" dev_path = '' ###",
"",
" train_set = get_dataset(train_path, is_train=True)",
" dev_set = get_dataset(dev_path, is_train=False)",
" train_batch = get_dataloader(train_set, opt.batch_size, is_train=True)",
" model = Model() ####",
"",
" if opt.restore != '':",
" model_dict = torch.load(opt.restore)",
" model.load_state_dict(model_dict)",
"",
" model.to(opt.devices)",
" optim = torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()),",
" lr=opt.lr,",
" weight_decay=opt.weight_decay",
" )",
"",
" for epoch in range(1, opt.epoch+1):",
" model.train()",
" report_loss, start_time = 0, time.time()",
" for batch in train_batch:",
" model.zero_grad()",
" X, Y = batch",
"",
" pred_x = model(X)",
" loss = model.loss(X, y)",
" loss.backward()",
" optim.step()",
"",
" return model",
"",
"",
"",
"def eval(dev_set, model):",
" pass",
"",
"def test(test_set, model):",
" print('string testing...')",
"",
"",
"def main():",
" if opt.mode == 'train':",
" train()",
" else:",
" test_path = ''",
" test_set = get_dataset(test_path, is_train=False)",
" model = Model() ##",
" model_dict = torch.load(opt.restore)",
" model.load_state_dict(model_dict)",
" model.to(opt.device)",
" test(test_set, model)",
"",
"if __name__ == \"__main__\":",
" main()",
""
]
}
[pylib] pylib"
{
"prefix": "pylib",
"body": [
"import os",
"import re",
"import sys",
"import time",
"import json",
"import math",
"import random",
"import pickle",
"import logging",
"import argparse",
"import subprocess",
"",
"from collections import defaultdict",
"",
"import scipy as sc",
"import numpy as np",
"import pandas as pd",
"",
"import torch",
"import torch.nn as nn",
"import torch.nn.functional as F",
"",
"from tqdm import tqdm",
"",
"BASE_DIR = os.path.dirname(os.path.abspath(__file__))",
"",
"parser = argparse.ArgumentParser()",
"parser.add_argument('--dirpath', default=BASE_DIR, help='\u5f53\u524d\u76ee\u5f55')",
"args = parser.parse_args()",
"",
"",
"def main():",
" pass",
"",
"",
"if __name__ == \"__main__\":",
" main()",
"",
""
]
}
latex¶
[beamer_only_fig] beamer_only_fig"
{
"prefix": "beamer_only_fig",
"body": [
"\\begin{frame}{xxx}",
" \\begin{tikzpicture}[remember picture,overlay]",
" \\node[anchor=center] (a) at ($(current page.center) + (0, 0cm)$)",
" {",
" \\includegraphics[width=\\linewidth]{figure/xxx}",
" };",
" \\node[below left=of a.south, xshift=0.5\\linewidth, yshift=1.3cm] {xxx};",
"\\end{tikzpicture}",
"",
"\\end{frame}"
]
}
[beamer_img] beamer_img"
{
"prefix": "beamer_img",
"body": [
"\\begin{tikzpicture}[remember picture,overlay,]",
" \\node[anchor=center] (a) at ($(current page.center)+(0, -1cm)$)",
" {",
" \\includegraphics[width=0.8\\linewidth]{./figure/graphsage.png}",
" };",
" \\node[below left=of a.south, xshift=0.5\\linewidth, yshift=1.3cm] {\\tinycite[NIPS2018]{hamilton2017inductive}};",
"",
"\\end{tikzpicture}"
]
}
restructuredtext¶
[ablog_img_new] ablog_img_new"
{
"prefix": "ablog_img_new",
"body": [
".. figure:: ./assets/$1",
" :width: 80%",
"",
" $2"
]
}
[ablog_begin] ablog_begin"
{
"prefix": "ablog_begin",
"body": [
".. post:: $CURRENT_MONTH_NAME_SHORT, $CURRENT_DATE, $CURRENT_YEAR",
" :tags: ICT, PhD",
" :category: PhD",
" :author: hotchilipowder",
" :location: Beijing",
" :language: zh",
"",
"=======================",
"$1",
"======================="
]
}
vim-snippets 简要记录¶
如果你用 [#vim-snippets]_ 就会发现有一些经典的使用。简单的罗列一下snippets (2023-04-22).
Markdown¶
sec, Section
ssec, Sub section
sssec, Sub sub section
par, Paragraph
spar, Paragraph
link, Link to something
img, Image
ilc, Inline code
cbl, Codeblock
refl, Reference Link
fnt, Footnote
detail, Disclosure
Rst¶
see rst.snippest
part, Part
chap, Chapter
sec, Section
ssec, Subsection
sssec, Subsubsubsection
para, Paragraph
em, Emphasize string
st, Strong string
li N<tab>, n List
oi N<tab>, n Order List
cb, Code block
id, Includable Directives
di, Directives, csv-table
dt, Directives without title, code
ds, Directives for subscription, |python|
sa, Specific Admonitions, hint
ro, Text Roles, code
eu, Embedded URI
fnt, Footnote or Citation
sid, sidebar
Python¶
see python.snippets 。
class, "class with docstrings"
slotclass, "class with slots and docstrings"
dcl, "dataclass"
contain, "methods for emulating a container type"
context, "context manager methods"
attr, "methods for customizing attribute access"
desc, "methods implementing descriptors"
cmp, "methods implementing rich comparison"
repr, "methods implementing string representation"
numeric, "methods for emulating a numeric type"
deff, "function or class method"
def, "function with docstrings"
defc, "class method with docstrings"
defs, "static method with docstrings"
from, "from module import name"
roprop, "Read Only Property"
rwprop, "Read write property"
if, "If"
ife, "If / Else"
ifee, "If / Elif / Else"
match, "Structural pattern matching"
matchw, "Pattern matching with wildcard" b
try, "Try / Except"
trye, "Try / Except / Else" b
tryf, "Try / Except / Finally"
tryef, "Try / Except / Else / Finally"
ae, "Assert equal"
at, "Assert True"
af, "Assert False"
aae,"Assert almost equal"
ar,"Assert raises"
an,"Assert is None"
ann, "Assert is not None"
testcase, "pyunit testcase"
", "triple quoted string (double quotes)"
', "triple quoted string (single quotes)"
doc, doc block (triple quotes)
pmdoc, pocoo style module doc string"
Rust¶
see rust.snippets
fn, fn name
pfn, pub fn name
afn, async fn name
pafn, pub async fn name
pri, println!