Closed5

ddcにgitmojiソースを入れるぞの巻

mikanmikan

依存関係入れるぞ編

そもそもdenodenopsddcも入ってないので入れる

asdf plugin-add deno
asdf install deno (asdf list all deno | fzf)
asdf global deno <インスコしたやつ>
# ...
[[plugins]]
repo = 'vim-denops/denops.vim'

# なんとなく入れた
[[plugins]]
repo = 'vim-denops/denops-helloworld.vim'

[[plugins]]
repo = 'Shougo/ddc.vim'
# ...
mikanmikan

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.

バッファ内から当てはまるワードを拾ってくるってことやな

mikanmikan

ソース作るぞ編

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": "&#x1f3a8;",
      "code": ":art:",
      "description": "Improve structure / format of the code.",
      "name": "art",
      "semver": null
    },
    {
      "emoji": "⚡️",
      "entity": "&#x26a1;",
      "code": ":zap:",
      "description": "Improve performance.",
      "name": "zap",
      "semver": "patch"
    },
    {
      "emoji": "🔥",
      "entity": "&#x1f525;",
      "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'));
// ...
mikanmikan

フィルター作るぞ編

デフォルトフィルターとして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

mikanmikan

魔改造編

ひとまずgitmojiの補完ソースはできた
次やりたいこと

  • 補完ワードをfixとかfeatとか検索しやすいものにする

補完ワードをfixとかfeatとか検索しやすいものにする

ある程度できた
あとで書く

このスクラップは2023/08/30にクローズされました