vim-jp / issues

有志で既知のバグや要望を検討・管理し、オフィシャルへの還元をしていきます。
https://vim-jp.org/
341 stars 11 forks source link

メソッドとして使う場合に動作しないケースが有る #1403

Closed iranoan closed 1 year ago

iranoan commented 1 year ago

不具合の内容

def を用いた関数内で、メソッドが上手く働かないケースが有ります

再現手順

例えば次のようなスクリプトで、メソッドとしての働きません 最新版ではどうなっているでしょうか?

def ZenHan(s: string): string
    return substitute(s, '[¥\]', '\={"¥": "¥", "\": "⧵"}[submatch(0)]', 'g')
        ->map('v:val =~# "[!-~]" ? nr2char(strgetchar(v:val, 0) - 65248) : v:val')
enddef

def Han2zen(s: string): string
    return substitute(s, '\([カ-トハ-ホ]゙\|[ハ-ホ]゚\)', '\={"ガ": "ガ"}[submatch(0)]', 'g')
        ->substitute('[。-゚]', '\={"カ": "カ"}[submatch(0)]', 'g')
enddef

echo ZenHan('¥\!~')
echo Han2zen('ガカ')

期待動作と上記スクリプトの結果

上記スクリプトで

¥⧵!~ ガカ

を期待しますが、結果は次の様になります

¥⧵!~ ガカ

現状で分かっている再現する条件

Vimのバージョン

$ vim --version VIM - Vi IMproved 9.0 (2022 Jun 28, compiled Aug 23 2022 20:18:58) 適用済パッチ: 1-242 Modified by team+vim@tracker.debian.org Compiled by team+vim@tracker.debian.org Huge 版 with GTK3 GUI. 機能の一覧 有効(+)/無効(-)

OSの種類/ディストリ/バージョン

$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.10 Release: 22.10 Codename: kinetic $ uname -a Linux xxxx 5.19.0-26-generic #27-Ubuntu SMP PREEMPT_DYNAMIC Wed Nov 23 20:44:15 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

h-east commented 1 year ago

Vim 9.0.1153 (現時点の最新)で再現しました。

h-east commented 1 year ago

PRed https://github.com/vim/vim/pull/11796

問題: search()系(search(), searchpos(), searchpair(), searchpairpos())、または、{sub}引数が\=で始まっているsubstitute()の呼び出しの場合に次行が全体に作用しない。

legacy scriptの問題は上記とは別件です。こちらは未調査。上記PRにコメントで報告はしました。

h-east commented 1 year ago

@iranoan map() で発生するパターンを提示いただけますか? 別バグの可能性が高いです。

h-east commented 1 year ago

legacy scriptの問題は上記とは別件です。こちらは未調査。上記PRにコメントで報告はしました。

Bram氏からコメントありました。:h :return に以下のように書かれているので、仕様ですね。

            旧来のスクリプトでは、到達不可能な行のチェックは行われ
            ないため、コマンドが `:return` の後に続く場合でも警告
            は出ない。
h-east commented 1 year ago

patch 9.0.1164で修正されました。

iranoan commented 1 year ago

map() で発生するパターンを提示いただけますか?

def ZenHan: が例になっています

修正されたんですね

改めてご報告いただきありがとうございました

h-east commented 1 year ago

def ZenHan: が例になっています

なるほどです。そうであれば、https://github.com/vim-jp/issues/issues/1403#issuecomment-1375632805 の条件に当てはまるので patch 9.0.1164 で修正されています。 ({sub}引数が\=で始まっているsubstitute() の次行はmap()でも何でもアウトだったので)

ですので、特に問題なければ本Issue閉じていただいてOKです。

iranoan commented 1 year ago

別の問題も有ったんですね 閉じます