Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

vimでgithub emojiをUnicode emojiにする

$
0
0

vimでgithub emojiをUnicode emojiにする

あわせて、echoする機能も。
ただ、まだ微妙にバグっているので注意。
すくなくともechoは後のほうのを拾ってしまうし、カーソル位置移動も適切とはいいがたい。

利用には、junegunn/vim-emojiプラグインが必要です。

deinならこう

[[plugins]]# completion <C-X><C-U> (user completion)repo='junegunn/vim-emoji'

hook_post_sourceに以下をセットしてやる。

" set default user completion functionset completefunc=emoji#complete

  " replace :emoji: to <unicode-emoji>" try echo unicodefunction!s:emoji_unicode_echo()letl:keywords=&iskeyword
    setlocal iskeyword-=:letl:word = expand('<cword>')letl:gh_word =':'.l:word.':'if''!=? emoji#for(l:word)
      echo 'emoji :'.expand('<cword>').'-'.emoji#for(l:word)else
      echo 'emoji :'.expand('<cword>').'-'.'(no match)'endiflet&iskeyword=l:keywords
  endfunction

  nnoremap <silent><Leader>e:call<SID>emoji_unicode_echo()<CR>function!s:emoji_unicode_replace()letl:keywords=&iskeyword
    setlocal iskeyword-=:letl:word = expand('<cword>')if word ==''let&iskeyword=l:keywords
      returnendifletl:gh_word =':'.l:word.':'if''!=? emoji#for(l:word)" カーソル位置をword分前に動かしてから、その位置から後の最初のwordを置換する" 完了後、位置を移動"   123456789ABCD"   smile :smile:"   ^____ origin cursor"   ^____ replace match start (word match pos - colon_size (min:1))"   ^____ if success; search emoji start (same replace match)"   smile :smile:"   __^__ origin cursor"   ^____ replace match start (word match pos - colon_size (min:1))"   ^____ if success; search emoji start (same replace match)"   smile :smile:"   ________^__ origin cursor"   ___^_______ word matchs start (origin - word len(min:1))"   ______^____ replace match start (word match pos - colon_size (min:1))"   ______^____ if success; search emoji start (same replace match)let pos = getcurpos()let word_col = pos[2]let target_col = pos[2]if pos[2]!=1" 行頭以外は位置補正するlet word_col = pos[2]- strlen(l:word)if word_col <1|let word_col =1|endiflet target_col = word_col
        if word_col !=1call cursor(pos[1], word_col)call search(l:word)let target_pos = getcurpos()let target_col = target_pos[2]-1 " :の分
          if target_col <1|let target_col =1|endifendifendifcall cursor(pos[1], target_col)letl:success =0try
        execute('substitute'.'/'.'\%#'.l:gh_word .'/'.'\=emoji#for(l:word)'.'/el')letl:success =1finallycall cursor(pos[1], pos[2])endtryifl:success
        call cursor(pos[1], target_col)call search(emoji#for(l:word))endif" debug" echom 'emoji:' . 'pos:'.pos[2] . ',word:'.word_col . ',target:'.target_col . ',success:'.l:successendiflet&iskeyword=l:keywords
  endfunction

  nnoremap <silent><Leader>E :call<SID>emoji_unicode_replace()<CR>

ポイントは、\%#を使うことで、後のほうにある、同名のemojiを対象にしないようにすること。
あと行頭のあたりで暴発しないようにするに苦労した...


Viewing all articles
Browse latest Browse all 5608

Trending Articles