Coder Social home page Coder Social logo

vim-skk / skkeleton Goto Github PK

View Code? Open in Web Editor NEW
235.0 235.0 31.0 563 KB

SKK implements for Vim/Neovim with denops.vim

License: zlib License

TypeScript 90.90% Vim Script 9.10%
ddc-source ddc-vim denops hacktoberfest hacktoberfest-accepted ime neovim skk vim vim-denops

skkeleton's People

Contributors

4513echo avatar aspulse avatar delphinus avatar gamoutatsumi avatar kat0h avatar kuuote avatar mattn avatar matts966 avatar ni57721 avatar ogaken-1 avatar orokasan avatar shougo avatar tani avatar thinca avatar uga-rosa avatar vuchvu avatar willelz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

skkeleton's Issues

`escape`を`jj`に割り当てるとescape時に`jj`が残ってしまう。

call skkeleton#register_kanatable('rom', {
  \ 'jj': 'escape',
  \ })

上記の設定をしているのですが、skkeletonをアップデートしたところ、jjでエスケープする際にjjという文字列が残ってしまうようになりました。

4b317fe
こちらのコミットが原因のようです。これより前に戻したら直りました。

skkeleton_bug_esc

ポップアップウィンドウを使用していない時に変換候補欄から変換すると挿入位置がおかしくなる

usePopup=false, showCandidatesCount = 0でコマンドラインの変換候補欄から変換をすると、変換前のひらがなの間に変換結果が挿入されます。
#21 に類似しているかもしれませんが、ambiwidth=singleに設定していました。
markerもambiwidthに影響されないものを指定しましたが挙動は変わりませんでした。
usePopup=true の場合は変換候補欄から選択しても上記の問題は見られません。

  • 変換前
    image

  • 変換後
    image

  • 使用環境

    • neovim: v0.8.2
    • terminal: kitty, alacritty
    • font: Firacode Nerd Font

変換を確定させるとエラーが発生しその後モードの変更が出来なくなる。

環境

OS : windows10
NVIM : v0.5.0
deno : 1.14.3

再現手順

  1. <Plug>(skkeleton-toggle) で有効にする
  2. NIhongoと入力する
  3. <Space>で変換
  4. <CR>で確定
  5. lでskkeletonを無効にする

最小構成

set rtp+=~/tmp/skkeleton
set rtp+=~/tmp/denops.vim
imap <c-j> <Plug>(skkeleton-toggle)

call skkeleton#config({
\ 'globalJisyo': expand('~/.eskk/SKK-JISYO.L'),
\ })

エラーメッセージ

function skkeleton#handle[1]..denops#request[1]..denops#server#request[4]..29_request の処理中にエラーが検出されま>した:
行 1:
Error invoking 'invoke' on channel 6:
Error: Failed to call 'toggle' with ["\n",{"mode":"i","completeStr":null}]: TypeError: Cannot read properties of undefined (reading 'eval')
at disable (file:///C:/Users/miyake.isana/AppData/Local/nvim-data/site/pack/packer/start/denops-skkeleton.vim/denops/skkeleton/function/disable.ts:10:20)
at disable (file:///C:/Users/miyake.isana/AppData/Local/nvim-data/site/pack/packer/start/denops-skkeleton.vim/denops/skkeleton/main.ts:121:9)
at Session.toggle (file:///C:/Users/miyake.isana/AppData/Local/nvim-data/site/pack/packer/start/denops-skkeleton.vim/denops/skkeleton/main.ts:215:16)
at async Session.dispatch (https://deno.land/x/[email protected]/session.ts:99:12)
at async https://deno.land/x/[email protected]/session.ts:108:18
at async Session.handleRequest (https://deno.land/x/[email protected]/session.ts:104:29)
at Session.call (https://deno.land/x/[email protected]/session.ts:207:13)
at async Service.dispatch (file:///C:/Users/miyake.isana/AppData/Local/nvim-data/site/pack/packer/start/denops.vim/denops/@denops-private/service.ts:112:14)
at async Session.invoke (file:///C:/Users/miyake.isana/AppData/Local/nvim-data/site/pack/packer/start/denops.vim/denops/@denops-private/host/nvim.ts:44:16)
at async Session.dispatch (https://deno.land/x/[email protected]/session.ts:99:12)
at async https://deno.land/x/[email protected]/session.ts:108:18
at async Session.handleRequest (https://deno.land/x/[email protected]/session.ts:104:29)

gif

skkeleton

pum#map#select_relative で確定が上手くいかない

こんな感じで確定が解除?されてしまいます。

2022-10-30.14.39.05.mov
  1. 「にゅうりょ」まで打ち込む
  2. 変換候補を選ぶ
  3. 決定する(「入力」で <CR>
  4. 「が」を打つ
  5. 「にゅうりょが」になってしまう

vimrc

let s:plugins = [
    \   'vim-denops/denops.vim',
    \   'Shougo/ddc.vim',
    \   'Shougo/pum.vim',
    \   'Shougo/ddc-ui-pum',
    \   'vim-skk/skkeleton',
    \ ]
for plug in s:plugins
    execute 'set runtimepath+=~/.cache/dein/repos/github.com/' . plug
endfor

call skkeleton#config({
    \   'globalDictionaries': ['~/.local/share/SKK/dict/SKK-JISYO.L'],
    \   'eggLikeNewline': v:true,
    \ })

imap <C-j> <Plug>(skkeleton-enable)

inoremap <expr> <C-n> pum#visible() ? pum#map#select_relative(+1) : '<Cmd>normal! gj<CR>'
inoremap <expr> <C-p> pum#visible() ? pum#map#select_relative(-1) : '<Cmd>normal! gk<CR>'
inoremap <expr> <CR>  pum#visible() ? pum#map#confirm() : '<CR>'
inoremap <expr> <C-y> pum#map#confirm()

call ddc#custom#patch_global({
    \   'ui': 'pum',
    \   'sources': ['skkeleton'],
    \   'sourceOptions': {
    \     'skkeleton': {
    \       'mark': 'skkeleton',
    \       'matchers': ['skkeleton'],
    \       'sorters': [],
    \       'isVolatile': v:true
    \     },
    \   }
    \ })

call ddc#enable()

コマンドモードで変換すると、おかしくなる。

環境

  • OS: Manjaro
  • terminal: kitty alacritty
  • neovim 0.5.0
  • denops-skkeleton.vim version: 3b9090e

問題

translate.vimというプラグインで日本語から英語に変換している様子です。
Peek 2021-09-19 15-21
詳しくは、上のGifの通りなのですが、

  1. コマンドモードで変換を開始する。
  2. カーソルの前に変換した文字が表示し、入力した文字を置き換えていく。
  3. 変換を始めるまでは、問題なく入力可能。
  4. 表示がおかしいだけで、入力内容は問題ない。実際、問題なく英語にも変換してくれている。

例外

ターミナルから起動したneovimは問題が発生しますが、GUIを使用した際は、上記の問題は起きていません。
現状確認しているGUIはneovideとneovim-gtkです。

`<Space>n` で `ん` が確定される

ひらがなモードで <Space>n と入力すると、 が確定されてしまいます。
これにより例えば <Space>naにならず んあになります。
スペースの部分は += などでも起きるようです。

辞書登録中に変換をしようとすると、複数候補の表示が辞書登録プロンプトで消される

# syntax=docker/dockerfile:1.3-labs

FROM thinca/vim:v8.2.3455-ubuntu

RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive apt-get install -y curl unzip \
 && curl -sL 'https://github.com/denoland/deno/releases/download/v1.14.0/deno-x86_64-unknown-linux-gnu.zip' -o /tmp/deno.zip \
 && unzip -qd /usr/local/bin /tmp/deno.zip \
 && rm /tmp/deno.zip \
 && mkdir -p $HOME/.vim/pack/test/start/denops $HOME/.vim/pack/test/start/denops-skkeleton \
 && curl -sL \
        "https://github.com/vim-denops/denops.vim/archive/v2.0.0.tar.gz" | \
        tar xz --directory=$HOME/.vim/pack/test/start/denops --strip-components=1 \
 && curl -sL \
        "https://github.com/kuuote/denops-skkeleton.vim/archive/main.tar.gz" | \
        tar xz --directory=$HOME/.vim/pack/test/start/denops-skkeleton --strip-components=1 \
 && mkdir -p /usr/share/skk \
 && curl -sL http://openlab.jp/skk/dic/SKK-JISYO.L.gz | zcat > /usr/share/skk/SKK-JISYO.L

COPY <<VIMRC /root/.vim/vimrc
imap <C-j> <Plug>(skkeleton-toggle)
cmap <C-j> <Plug>(skkeleton-toggle)
VIMRC
$ DOCKER_BUILDKIT=1 docker build -t skkeleton .
$ docker run --rm -it --name skkeleton -e COLUMNS="$(tput cols)" -e LINES="$(tput lines)" skkeleton
  1. 挿入モードで skkeleton を有効にして、適当に変換を行い、辞書登録モードに入る。
  2. 辞書登録モードで漢字変換を行い、4 つ目以降の候補を表示させようとする。
  3. 候補の一覧が一瞬だけ表示されるが、すぐに辞書登録モードのプロンプトが表示されてしまい、候補を選ぶことができない。

iter is deprecated

LSP prints the warning.
I think it should be replaced.

import { iter } from "./deps/std/io.ts";

ロードマップ

  • 機能テーブルを実装
    • 機能テーブルをユーザーがカスタマイズできるようにする
  • かなテーブルに機能を持たせられるようにする
    • かなテーブルをユーザーがカスタマイズできるようにする
  • カタカナモードを実装
    • 半角カナモードを実装
  • 直接入力モードを実装
  • abbrevモードを実装
  • 特殊変換を実装
    • 接頭辞・接尾辞変換
    • 数値変換
    • サ変動詞変換
  • アノテーション関連の機能を実装
  • 辞書サーバ機能を実装
    • 補完に対応する
  • 補完を実装
    • pum.vim対応
  • 状態表示できるようにする
  • 辞書の遅延読み込み
    • できれば候補を拾う段階まで遅延したい

辞書登録モードをキャンセルできない

正式なキャンセル方法がわかってないのですが、辞書登録時にキャンセルの意図で <C-c> を入力するとエラーが出てしまいます。

Error detected while processing function denops#request[1]..denops#server#request[4]..<SNR>17_request[3]..function denops#request[1]..denops#server#request[4]..<SNR>17_request:
line    3:
E605: Exception not caught: Error: Failed to call 'handleKey' with [" ","i"]: Error: Failed to call 'call' with ["input","[辞書登録] あああ: ",""]: Error: Failed to call 'input([辞書登録] あああ: , )': Vim:Interrupt^@    at Vim.call (file:///root/.vim/pack/test/start/denops/denops/@denops-private/host/vim.ts:75:12)^@    at async Service.call (file:///root/.vim/pack/test/start/denops/denops/@denops-private/service.ts:96:33)^@    at async Session.call (file:///root/.vim/pack/test/start/denops/denops/@denops-private/service.ts:70:25)^@    at async Session.dispatch (https://deno.land/x/[email protected]/session.ts:96:72)^@    at async https://deno.land/x/[email protected]/session.ts:108:15^@    at async Session.handleRequest (https://deno.land/x/[email protected]/session.ts:104:25)^@    at Session.call (https://deno.land/x/[email protected]/session.ts:206:72)^@    at async DenopsImpl.call (file:///root/.vim/pack/test/start/denops/denops/@denops/denops.ts:141:33)^@    at async jisyoTouroku (file:///root/.

キャンセル方法が別にあるとしても、エラーになるのはよくないと思うので Issue にしておきます。

変換入力時ひらがなのまま <C-j> を押すと挙動が不安定になる

とりあえず変換を開始して入力したものの、実際にはひらがなのままでよかった、というような場合にそのまま <C-j> を押して確定できるようにしたいです。現状だと <C-j> を入力すると変換マーカーが残ったまま改行され、その後の挙動も不安定になります。

  • 入力 Hiragana<C-j>
  • 理想
    ひらがな|
    
  • 実際
    ▽ひらがな
    |
    

私の環境では、次のような repro.vim で nvim -u repro.vim として起動して再現します。<BS> のマッピングは問題なく動くようです。

function! s:init_skkeleton() abort
  call skkeleton#register_keymap('henkan', '<C-j>', 'kakutei')
  call skkeleton#register_keymap('henkan', '<BS>', 'henkanBackward')
endfunction

imap <C-j> <Plug>(skkeleton-enable)

augroup rc__skkeleton_init
  autocmd User skkeleton-initialize-pre call s:init_skkeleton()
augroup END

packadd denops.vim
packadd skkeleton

skkservを使うと変換できない

skkservを使うと変換ができませんでした。
「あ」の変換を行ったときにtcpdumpでパケットを見てみると
1okurinasi{space}
4okurinasi{space}{NL}
という通信をしていました。

環境はWIndows 10 Pro gvim 8.2.4843 eskkeleton (2022/4/30版)
skkservはWSL2のUbuntu 22.04 yaskkserv
です。
skkeletonを使ったのは初めてなので以前のバージョンでは動いたという情報はありません。
skkservを使わずに辞書を使った場合は変換できました。
vimrcは以下の通りです。

set nocompatible
set runtimepath=
set runtimepath^=~/vimfiles/plugged/skkeleton/
set runtimepath^=~/vimfiles/plugged/denops.vim/

imap <C-j> <Plug>(skkeleton-toggle)
cmap <C-j> <Plug>(skkeleton-toggle)
call skkeleton#config({
  \'eggLikeNewline':v:true,
  \'keepState':v:true,
  \'useSkkServer':v:true,
  \'skkServerHost':"127.0.0.1",
  \'skkServerPort':1178,
  \'skkServerResEnc':"euc-jp",
  \'skkServerReqEnc':"euc-jp",
\})

skkeleton#status() の追加

g:eskk#statusline_mode_strings	*g:eskk#statusline_mode_strings*
							(Default: See below)
	Current mode's strings at |'statusline'|.
	Statusline string of modes.
	This changes |eskk#statusline()|'s return value.

	Default value is: >
	let g:eskk#statusline_mode_strings = {
	\	'hira': 'あ',
	\	'kata': 'ア',
	\	'ascii': 'aA',
	\	'zenei': 'a',
	\	'hankata': 'ァア',
	\	'abbrev': 'aあ'
	\}

STATUS LINE                                               *eskk-status-line* {{{

eskk provides a helper function to display the current mode in the
status line. Given the default status line: >

    set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

One can add the eskk indicator this way: >

    set statusline=%<%f\ %h%m%r%{eskk#statusline()}%=%-14.(%l,%c%V%)\ %P

The function takes 2 parameters:

    * A format string for the case where eskk is enabled
      (default: '[eskk:%s]'). %s is replaced by the eskk mode.
    * What to display when eskk is disabled (default: '').

To display [%s]/[-] instead: >

    set statusline=%<%f\ %h%m%r%{eskk#statusline('[%s]','[-]')}%=%-14.(%l,%c%V%)\ %P


lightline <https://github.com/itchyny/lightline.vim>
----------------------------------------------------

To display the eskk mode in the mode component: >

    let g:lightline = {
    \   'component_function': {
    \       'mode': 'LightlineMode',
    \   }}

    function! LightlineMode()
        return lightline#mode()
        \   . (exists('g:loaded_eskk') && eskk#is_enabled()
        \       ? ' (' . eskk#get_mode() . ')'
        \       : '')
    endfunction
<

markerHenkanに絵文字などを設定するとマーカー前の文字が消える

Vimrc:

imap <C-j> <Plug>(skkeleton-toggle)
cmap <C-j> <Plug>(skkeleton-toggle)

function! s:skkeleton_init() abort
  call skkeleton#config({
        \ "markerHenkan": "💤",
        \ "markerHenkanSelect": "💨"
        \}) 
endfunction
autocmd User skkeleton-initialize-pre call s:skkeleton_init()

再現動画:

期待する結果:

日本語変換

実際の結果:

変換

備考:
どの範囲のコードポイントで再現するか詳しく確認できていません。

辞書登録モードでコマンドラインウィンドウを開くとエラーになる

正確にはコマンドラインウィンドウを開いた後に何かしらの操作をする(エンターなど)とエラーで落ちます。

function skkeleton#handle[1]..denops#request[1]..denops#server#request[6]..<SNR>28_request の処理中にエラーが検出されました:
行    1:
Error invoking 'invoke' on channel 4:
Error: Failed to call 'handleKey' with ["<space>",{"completeInfo":{"pum_visible":0,"mode":"","selected":-1,"items":[]},"mode":"i","
isNativePum":0}]: BatchError: Vim(cunmap):E31: そのようなマッピングはありません
    at DenopsImpl.batch (file:///home/fr/dotfiles/dotConfig/nvim/denops/@denops/impl.ts:43:13)
    at async batch (https://deno.land/x/[email protected]/batch/batch.ts:89:3)
    at async jisyoTouroku (file:///home/fr/.config/nvim/denops/skkeleton/function/jisyo.ts:49:5)
    at async henkanForward (file:///home/fr/.config/nvim/denops/skkeleton/function/henkan.ts:54:9)
    at async henkanFirst (file:///home/fr/.config/nvim/denops/skkeleton/function/henkan.ts:39:3)
    at async acceptResult (file:///home/fr/.config/nvim/denops/skkeleton/function/input.ts:75:5)
    at async kanaInput (file:///home/fr/.config/nvim/denops/skkeleton/function/input.ts:100:39)
    at async handleKey (file:///home/fr/.config/nvim/denops/skkeleton/keymap.ts:64:3)
    at async handle (file:///home/fr/.config/nvim/denops/skkeleton/main.ts:203:3)
    at async Session.dispatch (https://deno.land/x/[email protected]/session.ts:99:12)
    at Session.call (https://deno.land/x/[email protected]/session.ts:207:13)
    at async Service.dispatch (file:///home/fr/dotfiles/dotConfig/nvim/denops/@denops-private/service.ts:101:14)
    at async Session.invoke (file:///home/fr/dotfiles/dotConfig/nvim/denops/@denops-private/host/nvim.ts:48:16)
    at async Session.dispatch (https://deno.land/x/[email protected]/session.ts:99:12)
    at async https://deno.land/x/[email protected]/session.ts:108:18
    at async Session.handleRequest (https://deno.land/x/[email protected]/session.ts:104:29)

再現手順

  1. 適当な文字を入力し辞書登録モードに入る
  2. Ctrl-Fでコマンドラインウィンドウに入る
  3. エンターを押す

init.vim

imap <C-j> <Plug>(skkeleton-enable)

skkeleton#mode()の返り値と実際の出力が一致しないときがある

再現手順

  1. <Plug>(skkeleton-toggle)でskkeletonを有効にする
  2. qでskkeletonの出力をカタカナにする
  3. <C-o>で一時的に挿入モードから抜ける
  4. 任意のコマンドを一度実行して再び挿入モードに入る
  5. skkeleton#mode()の返り値はkataだが実際の出力はひらがなになっている

最小構成

.vimrc

set runtimepath+=~\src\denops.vim
set runtimepath+=~\src\skkeleton

imap <C-j> <Plug>(skkeleton-toggle)

skkeletonを有効にしたまま挿入モードから抜けてすぐ文字を入力すると、抜けた後に入力した文字が書きこまれる

再現手順

i<c-j>aiueo<c-[>l

期待: あいうえお
結果: あいうえおl
(最後のlはhjkl等なんでもよい)

<c-[>の後、しばらく待つと一瞬Insertモードになった後normalモードに戻る。
その後にlを押すと問題ない。

環境

  • denops.vim: d7db28587bb281f9fcf56d4986e313025e250295
  • skkeleton: 7fcc024
  • OS: ubuntu 20.04
  • ターミナルエミュレータ: gnome-terminal, kitty v0.26.3

最小構成

if &compatible
  set nocompatible
endif

set runtimepath+=~/.vim/plugged/denops.vim
set runtimepath+=~/.vim/plugged/skkeleton

imap <C-j> <Plug>(skkeleton-enable)
cmap <C-j> <Plug>(skkeleton-enable)

遅延読み込みした際にタイムアウトする

説明

このプラグインを遅延読み込みした状態で有効化するとフリーズし、
そのまま30秒放置するとエラーも出ず、denopsにタイムアウトとして殺されます。
(30秒の間にCtrl-Cで押すとエラーが見えました。後述)

(たぶん) 最小の再現手順

  1. lazy.nvimに以下の設定を食べさせます:
{
  {
    'vim-skk/skkeleton,
    event = { 'InsertEnter' },
    dependencies = { 'vim-denops/denops.vim' },
    config = function()
      vim.keymap.set('i', '<C-j>', '<Plug>(skkeleton-toggle)', { remap = true })
      vim.fn['skkeleton#config']({})
    end
  },
}
  1. 適当なファイルを開き、インサートモードに入ってCtrl-Jを押下します。
  2. 「説明」で述べた現象が発生します。

この設定ファイルの event = { 'InsertEnter' } を削除する( = 遅延読み込みしないようにする )と、この問題は解消します

エラー文

処理中に Ctrl-C で止めるとエラー文が見えて、こんな内容でした。(aspulseはユーザー名になります)

line    1:
Error invoking 'invoke' on channel 5:
Error: No plugin 'skkeleton' is registered
    at Service.dispatch (file:///C:/Users/aspulse/AppData/Local/nvim-data/lazy/denops.vim/denops/@denops-private/service.ts:115:15)
    at Invoker.dispatch (file:///C:/Users/aspulse/AppData/Local/nvim-data/lazy/denops.vim/denops/@denops-private/host/invoker.ts:50:26)
    at Session.invoke (file:///C:/Users/aspulse/AppData/Local/nvim-data/lazy/denops.vim/denops/@denops-private/host/nvim.ts:57:38)
    at Session.dispatch (https://deno.land/x/[email protected]/session.ts:99:42)
    at https://deno.land/x/[email protected]/session.ts:108:29
    at Session.handleRequest (https://deno.land/x/[email protected]/session.ts:114:6)
    at Session.listen (https://deno.land/x/[email protected]/session.ts:148:16)
    at async file:///C:/Users/aspulse/AppData/Local/nvim-data/lazy/denops.vim/denops/@denops-private/cli.ts:62:7
    at async using (https://deno.land/x/[email protected]/using.ts:14:12)
    at async file:///C:/Users/aspulse/AppData/Local/nvim-data/lazy/denops.vim/denops/@denops-private/cli.ts:61:5
Error detected while processing function skkeleton#handle[1]..skkeleton#request[4]..denops#request[1]..denops#server#request[4]..denops#_internal#server#chan#request[4]..denops#_internal#rpc#nvim#request:

環境

Windows 11

skkeleton 6b41145
    ● skkeleton 43.5ms  start
        dir    C:/Users/aspulse/AppData/Local/nvim-data/lazy/skkeleton
        url    https://github.com/vim-skk/skkeleton
        branch main
        commit 6b41145
        readme README.md
nvim v0.9.0 LuaJIT 2.1.0
$ nvim --version
NVIM v0.9.0-dev-622+g08ebf8d3a
Build type: RelWithDebInfo
LuaJIT 2.1.0-beta3
Compiled by runneradmin@fv-az276-876

Features: -acl +iconv +tui
deno 1.30.3
$ deno --version
deno 1.30.3 (release, x86_64-pc-windows-msvc)
v8 10.9.194.5
typescript 4.9.4
denops checkhealth runnning
> :checkhealth denops
denops: health#denops#check

- Supported Deno version: `1.28.0`
- Detected Deno version: `1.30.3`
- OK Deno version check: passed
- Supported Neovim version: `0.8.0`
- Detected Neovim version: `0.9.0`
- OK Neovim version check: passed
- Denops status: `running`
- OK Denops status check: passed

(vim関連で初めてのissueなので、何か内容に間違っているところとか足りない情報あったら教えてください...!)

esm.shやめる

Deno 1.28から作られるようになったlockfileと動的にスクリプトを生成するesm.shとの相性が悪いので別の手段を検討する

Note: vim-jpで聞いた所 g:denops#server#deno_args--no-lock を追加するとlockfileを無効化できるらしい

マーカーを空にすると補完確定後、ローマ字入力が壊れる

前提

ddcとskkeletonを使用しています。
ddc-uiはnativeとpumどちらも再現します。

skkeletonrc

function! s:skkeleton_init() abort
  call skkeleton#config({
     \ 'markerHenkan' : '',
    \ 'markerHenkanSelect' : '',
    \ })
endfunction

imap <C-j> <Plug>(skkeleton-enable)
cmap <C-j> <Plug>(skkeleton-enable)

autocmd User skkeleton-initialize-pre call s:skkeleton_init()

再現手順

Henn<c-n>da変dあ

単語登録しようとすると error となり、状態が壊れる

denops.vim のコミット vim-denops/denops.vim@8923103 から、なぜか単語登録時にエラーになってしまいます。

image

この状態で何でもいいのでキーを押すと (例えば a キーを押してみます) 次のようになります。

image

error という文字列が挿入されていることも変ですが、それ以上に、この時点で状態が壊れてしまっているようで単語登録が機能しません。単語を入力して Enter キーを押しても登録されませんし、登録した単語に変換もされませんし、しかも、マーカーは残っているのにスペースキーを押しても変換できません。
以下、スペースキーを押したり a キーを押したり改行したりした様子ですが、完全に変換前のテキストが (そういうテキストとして) 固定されています。

image

一応、最小構成は次の通りです。

let g:denops#deno = 'path/to/deno'
packadd denops.vim
packadd skkeleton

imap <C-j> <Plug>(skkeleton-enable)

コマンドラインモードから抜けた後に有効化しようとするとエラーが出る

831
  [00:30](https://vim-jp.slack.com/archives/C023EFATA0H/p1674142205057419)
skkeleton 壊れたのですが私だけでしょうか?
!deno --version
deno 1.29.4 (release, x86_64-apple-darwin)
v8 10.9.194.5
typescript 4.9.4
:!nvim --version
NVIM v0.9.0-dev-1947+g0aae7f386-dirty
Build type: Release
LuaJIT 2.1.0-beta3
Compiled by ---

Features: +acl +iconv +tui
See ":help feature-compile"

   system vimrc file: "$VIM/sysinit.vim"
  fall-back for $VIM: "/usr/local/Cellar/neovim/HEAD-0aae7f3/share/nvim"

Run :checkhealth for more info
Untitled
 
set rtp+=~/.local/share/nvim/lazy/denops.vim
set rtp+=~/.local/share/nvim/lazy/skkeleton
cmap <C-j> <Plug>(skkeleton-enable)
" 1. /
" 2. <C-j>
" 3. <Esc>
" 4. /
" 5. <C-j>
" Error detected while processing function skkeleton#handle[1]..skkeleton#request[4]..denops#request[1]..denops#server#request[4]..denops#_internal#server#chan#request[4]..denops#_internal#rpc#nvim#request:
" line    1:
" Error invoking 'invoke' on channel 4:
" Error: Failed to call 'enable' with [{},{"prevInput":"","completeInfo":{"pum_visible":0,"mode":"","selected":-1,"items":[]},"mode":"c","completeType":"native"}]: AssertError: value must be Opts
"     at assertOpts (file:///Users/user-name/.local/share/nvim/lazy/skkeleton/denops/skkeleton/main.ts#126.429337:29:11)
"     at handle (file:///Users/user-name/.local/share/nvim/lazy/skkeleton/denops/skkeleton/main.ts#126.429337:212:3)
"     at enable (file:///Users/user-name/.local/share/nvim/lazy/skkeleton/denops/skkeleton/main.ts#126.429337:131:12)
"     at async Session.enable (file:///Users/user-name/.local/share/nvim/lazy/skkeleton/denops/skkeleton/main.ts#126.429337:279:14)
"     at async Session.dispatch (https://deno.land/x/[email protected]/session.ts:99:12)
"     at async https://deno.land/x/[email protected]/session.ts:108:18
"     at async Session.handleRequest (https://deno.land/x/[email protected]/session.ts:104:29)
"     at Session.call (https://deno.land/x/[email protected]/session.ts:207:13)
"     at async Service.dispatch (file:///Users/user-name/.local/share/nvim/lazy/denops.vim/denops/@denops-private/service.ts:117:14)
"     at async Session.invoke (file:///Users/user-name/.local/share/nvim/lazy/denops.vim/denops/@denops-private/host/nvim.ts:57:16)
"     at async Session.dispatch (https://deno.land/x/[email protected]/session.ts:99:12)
"     at async https://deno.land/x/[email protected]/session.ts:108:18
"     at async Session.handleRequest (https://deno.land/x/[email protected]/session.ts:104:29)

この手順の通りに操作すると再現する

特定の条件下で `keepState` と `<Plug>(skkeleton-toggle)` を組み合わせるとskkeletonを無効化できなくなる

Vim/Neovim双方で再現を確認しました。

vimrc

if !has('nvim')
  set nocompatible
endif
set runtimepath^=~/Repositories/github.com/vim-skk/skkeleton
set runtimepath^=~/Repositories/github.com/vim-denops/denops.vim

imap <C-j> <Plug>(skkeleton-toggle)
" このcmapを除けば再現しない
cmap <C-j> <Plug>(skkeleton-enable)

autocmd User skkeleton-initialize-pre call skkeleton#config({"keepState": v:true})

再現手順

  1. 普通にインサートモードに入り、 <C-j> を押下してskkeletonを有効化する。
  2. そのまま <Esc> でノーマルモードに戻り、再びインサートモードに入る。(この時点で keepState によりskkeletonが再度有効化される)
  3. <C-j> で無効化しようと試みるが無効化できない( l での無効化は通常通り動作します)

キューイングモード

denopsの立ち上がりが遅いケースがあるので、その状態で立ち上げようとすると入力をキューイングするモードに移行して立ち上がったら一気に変換とかしてみてもいいのかもしれない

不要なマッピングをやめる

現在、日本語入力という動作を実現するためにlanguage-mappingを使用しており、既存のマッピングのほぼ全域を上書きしている。この上書きされる範囲はeskk.vimの物をそのまま借用しており、その中には補完などの機能に関する制御文字も含まれている。
この問題を解決するため、マッピングの定義を必要最低限に絞る(か、あるいはユーザーが100%定義するようにする)ことを検討している。

そのためには、補完のハンドリングを一部していたと思うので、削除して問題ないかの検証を行う必要がある。

補完のためにユーザー辞書の順序を使用順にする

skkeleton.vim は ddc.vim と連携して変換候補の入力途中でも候補を補完で表示することができます。
現状ユーザー辞書はソートされて保存されていますが、これを使用順にして保存することで、候補を出す際に最近使用した候補を優先して出すことが可能になります。

変換中かどうかを知りたい

skkeleton#mode()では以下の5つのどれか(または空文字)が返ってきますが、変換中などの情報も知りたいと思っています。入力モードとはまた別の話として新たな関数を追加するか、skkeleton#mode()に変更を入れるかは議論の余地があると思います。

  • "hira": ひらがな
  • "kata": カタカナ
  • "hankata": 半角カタカナ
  • "zenkaku": 全角英数
  • "abbrev": abbrev

補完候補をTabで選択した後、skkeletonの動作がおかしくなる

#22 を作成している際に、skkeletonのおかしな挙動を見付けましたので報告します。

skkeletonの補完候補を、<Tab><C-p>で選択し、その後何も選択せず補完ウィンドウから抜けた際、
skkeletonの動作が停止し、変換ができなくなります。また、マーカーも残ったままになります。

tab_comp

skkeletonの補完候補を、<C-n><C-p>で選択した場合、この問題は起こりません。
c_p

#22 にも関わってくる問題だとは思いますが、こちらでは原因が分かりませんでした。
お手数ですが、ご確認をお願いします。

  • 環境
OS: Windows 10
neovim-version: NVIM v0.6.0-dev+284-gc2a65921d
skkeleton-version: 2d544f1
" 最小構成
set ambiwidth=double

set rtp+=~\.cache\dein\repos\github.com\vim-denops\denops.vim
set rtp+=~\.cache\dein\repos\github.com\Shougo\ddc.vim
set rtp+=~\.cache\dein\repos\github.com\kuuote\denops-skkeleton.vim

call ddc#custom#patch_global('sourceOptions', {
      \ 'skkeleton': {'mark': 'skk', 'matchers': ['skkeleton'], 'sorters': []},
      \ })
call ddc#custom#patch_global('sources', ['skkeleton'])
call ddc#enable()

call skkeleton#config({
    \ 'globalJisyo': expand('~/.skk/SKK-JISYO.L'),
    \ 'userJisyo': expand('~/.skk/.skk-jisyo'),
    \})

imap <C-j> <Plug>(skkeleton-enable)

ローマ字テーブルのカスタマイズ機能

eskk でいう下記のようなカスタマイズを可能にする

  autocmd MyAutoCmd User eskk-initialize-pre call s:eskk_initial_pre()
  function! s:eskk_initial_pre() abort
    let t = eskk#table#new('rom_to_hira*', 'rom_to_hira')
    call t.add_map('z ', ' ')
    call t.add_map('~', '')
    call t.add_map('zc', '©')
    call t.add_map('zr', '®')
    call t.add_map('z9', '')
    call t.add_map('z0', '')
    call eskk#register_mode_table('hira', t)
  endfunction

skkeleton-mode-changed がすぐに発火しない場合がある

skkeleton_indicator.nvim を作ってるときに気付いたのですが、カタカナモードや半角カタカナモードに遷移した際、skkeleton-mode-changed イベントの発火が遅れる場合があるようです。

デバッグ用 diff
diff --git a/autoload/skkeleton.vim b/autoload/skkeleton.vim
index 03c157e..bc5fda6 100644
--- a/autoload/skkeleton.vim
+++ b/autoload/skkeleton.vim
@@ -83,6 +83,7 @@ endfunction
 
 function! skkeleton#handle(func, key) abort
   let ret = denops#request('skkeleton', a:func, [a:key, skkeleton#vim_status()])
+  echomsg '[vim] ' . string([a:key, ret])
   if ret =~# "^<Cmd>"
     let ret = "\<Cmd>" .. ret[5:] .. "\<CR>"
   endif
diff --git a/denops/skkeleton/main.ts b/denops/skkeleton/main.ts
index 23f3fdb..1d57cfd 100644
--- a/denops/skkeleton/main.ts
+++ b/denops/skkeleton/main.ts
@@ -167,6 +167,7 @@ type VimStatus = {
 };
 
 async function handle(key: unknown, vimStatus: unknown): Promise<string> {
+  console.log({ key });
   ensureString(key);
   const { completeInfo, isNativePum, mode } = vimStatus as VimStatus;
   const context = currentContext.get();

デバッグ用に↑のようなログを仕込み、Skkeleton で AQAesc とゆっくりキーを叩くと、

[vim] ['a', 'あ']
[denops] { key: "a" }
[vim] ['q', '']
[vim] ['a', 'ア']
[denops] { key: "q" }
[denops] { key: "a" }
[vim] ['^[', '^^^[']
[denops] { key: "\x1b" }

このようになります。Aesc のときはすぐに denops の handle() のログが表示されていますが、Qのときは次の A が来るまで反応がありません。

Kapture 2021-10-26 at 22 41 49

skkeleton-mode-changed で描画の更新を行っているのですが、「カナ」の表示が「ア」が表示されるまで遅延しています。

しかし、denops#request() の返り値が '' 以外、つまり、画面の更新が行われる場合はすぐにイベントが発火するようです。以下の動画では KQAesc の順にキーを叩いています。

Kapture 2021-10-26 at 22 48 36

[vim] ['k', 'k']
[denops] { key: "k" }
[vim] ['q', '^H']
[denops] { key: "q" }
[vim] ['a', 'ア']
[denops] { key: "a" }
[vim] ['^[', '^^^[']
[denops] { key: "\x1b" }

同種のことは Q だけでなく control+Q のときも起こるのですが、なんとかならないでしょうか。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.