Closed5
ddcにgitmojiソースを入れるぞの巻
ddc試してみるぞ編
ドキュメントを元にサンプル構成(ddc-exampleまんまです)を作る。
" ddc.vim
call ddc#custom#patch_global('sources', ['around'])
call ddc#custom#patch_global('sourceOptions', {
\ '_': {
\ 'matchers': ['matcher_head'],
\ 'sorters': ['sorter_rank']
\ },
\ 'around': {'mark': 'Ar'}
\ })
inoremap <silent><expr> <TAB>
\ pumvisible() ? '<C-n>' :
\ (col('.') <= 1 <Bar><Bar> getline('.')[col('.') - 2] =~# '\s') ?
\ '<TAB>' : ddc#map#manual_complete()
call ddc#enable()
できた‼︎
ddc-aroundのdocより
This source collects candidates around the cursor, namely inside current buffer.
バッファ内から当てはまるワードを拾ってくるってことやな
ソース作るぞ編
import {
BaseSource,
Candidate,
} from "https://deno.land/x/ddc_vim@v0.17.0/types.ts";
import {
assertEquals,
Denops,
fn,
} from "https://deno.land/x/ddc_vim@v0.17.0/deps.ts#^";
type Gitmoji = {
emoji: string;
entry: string;
code: string;
description: string;
name: string;
semver: string;
}
export type CompleteMetadata = {
name: string;
gitmoji: string;
description: string;
}
function getGitmoji(): CompleteMetadata[] {
const gitmoji = gitmojiJson.gitmojis.map((data: Gitmoji) => ({name: data.code, gitmoji: data.emoji, description: data.description}));
return gitmoji;
}
const gitmojiJson = {
gitmojis: [
{
"emoji": "🎨",
"entity": "🎨",
"code": ":art:",
"description": "Improve structure / format of the code.",
"name": "art",
"semver": null
},
{
"emoji": "⚡️",
"entity": "⚡",
"code": ":zap:",
"description": "Improve performance.",
"name": "zap",
"semver": "patch"
},
{
"emoji": "🔥",
"entity": "🔥",
"code": ":fire:",
"description": "Remove code or files.",
"name": "fire",
"semver": null
},
]
};
export class Source extends BaseSource<Record<string, never>> {
async gatherCandidates(): Promise<Candidate<CompleteMetadata>[]> {
const candidates = getGitmoji();
const ddcCandidates = candidates.flatMap(data => {
return {
word: data.gitmoji,
abbr: data.name,
kind: data.description,
user_data: {
name: data.name,
gitmoji: data.gitmoji,
description: data.description,
},
};
});
return Promise.resolve(ddcCandidates);
}
params() {
return {};
}
}
適当に書いたけど動くものはできた
参考: ddc-emoji
gitmojiからデータを持ってくる
まずはリポジトリにあるJSONをローカルに落としてそのまま流してみる
// ...
const gitmojiJson = JSON.parse(Deno.readTextFileSync('/path/to/gitmoji.json'));
// ...
フィルター作るぞ編
デフォルトフィルターとしてddc-matcher_headを入れているがこれは補完候補の文字と出力文字が同じ場合のフィルターである。
今回の場合 :bug: → 🐛 といった対応を取る必要があるので独自にフィルターを作る必要がある。
(というかddc-emojiもそうやってた。
// @ddc-filters/gitmoji.ts
import { CompletionMetadata } from "../@ddc-sources/emoji.ts";
import { Candidate } from "https://deno.land/x/ddc_vim@v0.17.0/types.ts";
import {
BaseFilter,
FilterArguments,
} from "https://deno.land/x/ddc_vim@v0.17.0/base/filter.ts";
export class Filter extends BaseFilter<Record<string, never>> {
async filter(
args: FilterArguments<Record<string, never>>
): Promise<Candidate[]> {
return args.candidates.filter(candidate => {
const meta = candidate.user_data as unknown as CompletionMetadata;
return meta && meta.name.startsWith(`${args.completeStr}`);
});
}
params() {
return {};
}
}
設定は下記のように
call ddc#custom#patch_global('sources', ['around', 'gitmoji'])
call ddc#custom#patch_global('keywordPattern', '[a-zA-Z_:]\w*')
call ddc#custom#patch_global('sourceOptions', {
\ '_': {
\ 'matchers': ['matcher_head'],
\ 'sorters': ['sorter_rank']
\ },
\ })
call ddc#custom#patch_global('sourceOptions', {
\ 'around': {'mark': 'Ar'},
\ })
call ddc#custom#patch_global('sourceOptions', {
\ 'gitmoji': {
\ 'mark': 'gitmoji',
\ 'matchers': ['gitmoji'],
\ 'sorters': [],
\ },
\ })
demo
魔改造編
ひとまずgitmojiの補完ソースはできた
次やりたいこと
- 補完ワードをfixとかfeatとか検索しやすいものにする
補完ワードをfixとかfeatとか検索しやすいものにする
ある程度できた
あとで書く
このスクラップは2023/08/30にクローズされました