vim-jp / issues

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

vim9scriptの変数宣言と削除について #1396

Closed iranoan closed 2 years ago

iranoan commented 2 years ago

質問の内容

件名の通り、vim9script の変数についてわからないことがあり、質問させて頂きます

ただひょっとすると本家helpのtypo報告スレ (Vim 8.2)その2 #1387に繋げるべき案件かもしれません

本題ですが、https://github.com/vim-jp/vimdoc-ja のドキュメント (以下引用部はヘルプのタグを含めつつ中略されています) vim9.jax に

  1. 旧来の Vim script からの変更点 vim9-differences
> - 値の代入には `:let` を使用せず、変数の宣言には `:var` を使用します: > :var、:final や :const で宣言する変数 ~ > *vim9-declaration* *:var* > Vim9 script では `:let` は使用できません。すでに存在する変数に題してはコマンド > を使用せずに代入します。グローバル変数、ウィンドウ変数、タブ変数、バッファ変 > 数、そして Vim の定義済変数についても同様です。 > 変数は `:unlet` によって削除することもできます。 と記載があり、確かにファイル先頭が `vim9script` のファイルで `:let` を使うとエラーになります しかしドキュメント user_52.jax には > *52.1* 導入 *vim9-script-intro* > vim9script " Vim9 script ファイルであることを示します。 > > export def GetMessage(): string > let result = '' > *52.2* 変数の宣言 *vim9-declarations* > > Vim9 script の変数は一度だけ `:let` もしくは `:const` コマンドによって宣言され > ます。値は `:let` 無しで代入され変数を `:unlet` することはできません。 と `:let` を使った記述があります 更にこちらはコメントに `"` を使ってもいます また前者のドキュメントには > 変数は `:unlet` によって削除することもできます。 とあり、後者には > ます。値は `:let` 無しで代入され変数を `:unlet` することはできません。 実際次のファイルを `:source` で読み込むと `:unlet` でエラーになります ``` vim9script var hoge: bool hoge = true unlet hoge ``` これはそれぞれどちらかのドキュメントの記載が間違っていると解釈すればよいのでしょうか? それとも何か条件によっては、`:let`, `:unlet` が使えるのでしょうか? ## Vimのバージョン > $ vim --version > VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Sep 13 2022 09:35:02) > 適用済パッチ: 1-3995, 4563, 4646, 4774, 4895, 4899, 4901, 4919 ## OSの種類/ディストリ/バージョン > $ lsb_release -a > No LSB modules are available. > Distributor ID: Ubuntu > Description: Ubuntu 22.04.1 LTS > Release: 22.04 > Codename: jammy > $ uname -a > Linux xxxx 5.15.0-48-generic #54-Ubuntu SMP Fri Aug 26 13:26:29 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
k-takata commented 2 years ago

vimdoc-ja の更新が追い付いていないだけですね。 現在こちらで翻訳作業中です。 https://github.com/vim-jp/vimdoc-ja-working/pull/1118

これに限らず、新機能は翻訳が追い付いていない場合があります。 英語版のヘルプは :help 52.1@en などのように後ろに @en を付けることで読むことができます。 (Web上なら https://vim-jp.org/vimdoc-en/ )

翻訳に参加していただける方は常に募集中です。 https://github.com/vim-jp/vimdoc-ja-working/wiki/HowToContribute

tsuyoshicho commented 2 years ago

あー、すみません(?)

日本語翻訳についてですが、とくにvim9.txt は遅れており内容が古いです。 英語原文も確認するほうがよいです。

いま英語のvim9では

Variable declarations with :var, :final and :const ~
                *vim9-declaration* *:var* *E1079*
                *E1017* *E1020* *E1054* *E1087* *E1108* *E1124*
Local variables need to be declared with `:var`.  Local constants need to be
declared with `:final` or `:const`.  We refer to both as "variables" in this
section.

とあるように var もしくは const が必要...とありますが...。

また

<                       *E1016* *E1052* *E1066*
In Vim9 script `:let` cannot be used.  An existing variable is assigned to
without any command.  The same for global, window, tab, buffer and Vim
variables, because they are not really declared.  Those can also be deleted
with `:unlet`.

ここにあるように、var/constなくても変数には格納されます。 そして letは使えず、またunletはできる..?みたいな記述になってますが、unletはたぶんできないんだと思います。


補助的な情報 (比較的翻訳の更新がされている)user_52.jaxの記述もちょっと古いです

usr_52のその記述は今削除されています、それについては日本語ヘルプのPR処理中、というところです。


結論としては

という状態なのはたしかです。

thinca commented 2 years ago

Those can also be deleted with :unlet.

ここでの Thoseglobal, window, tab, buffer and Vim variables にかかっています。

つまり

変数は :unlet によって削除することもできます。

これは

これらは :unlet によって削除することもできます。

が正しい訳になるかと思います。

↓この unlet なら動きます。

vim9script
g:hoge = true
unlet g:hoge
tsuyoshicho commented 2 years ago

自分のもちょっとボケてました、thincaさんのが結論といえそうです。

iranoan commented 2 years ago

usr_46.txt

46.1 Introduction vim9-script-intro

> vim9script " This indicates a Vim9 script file. > > export def GetMessage(): string > let result = '' と有ったのでオリジナルも同じかと思ったのですが、最新版で対応していそうな https://vim-jp.org/vimdoc-en/usr_52.html を読むと修正されているんですね https://vim-jp.org/vimdoc-ja/ を日本語ヘルプとして使っている場合は、 https://vim-jp.org/vimdoc-en/ も取り込んで、確認しないとダメですね 皆さん色々ありがとうございました 事情が解ったのでクローズします