回答編集履歴

1

追加コメントに対する回答。

2023/03/24 11:46

投稿

Milly
Milly

スコア167

test CHANGED
@@ -1,4 +1,31 @@
1
+ ### 追加コメントに対する回答
2
+
3
+ > 実はread の引数を関数(s:filename)にしてあり、前段で、ファイルの種類により、 読み込むファイルを変更したいのです。 read の引数を固定した文字列であれば、正常に実行しますが、変数にするとそのファイルが開けないのです。 お教えいただいた方法は固定したファイルとなりますので、うまくできません。
4
+
5
+ **:read** コマンドに与える引数の書き方が違います。
6
+
7
+ 以下のようにすれば期待の動作になると思います。
8
+
9
+ ```vim
10
+ let s:filename = 'e:\dir\orgtext.txt'
11
+ map <F11> :call InsText()
12
+ function InsText()
13
+ execute 'read' fnameescape(s:filename)
14
+ endfunction
15
+ ```
16
+
17
+ - [:read](https://vim-jp.org/vimdoc-ja/eval.html#:read) Exコマンドの引数は固定文字列です。式を指定することはできません。
18
+ - [:execute](https://vim-jp.org/vimdoc-ja/eval.html#:execute) Exコマンドの引数は空白区切りの式です。式の評価結果の文字列をExコマンドとして実行します。
19
+ - [fnameescape()](https://vim-jp.org/vimdoc-ja/builtin.html#fnameescape()) 関数は文字列に含まれる特殊文字をエスケープします。
20
+
21
+ 上記の通り、Exコマンドによって引数に式が使えるかどうかはかわります。コマンド毎にヘルプを確認するとよいでしょう。
22
+
23
+ 今回のポイントはヘルプの [41.5 式を実行する](https://vim-jp.org/vimdoc-ja/usr_41.html#41.5) に書かれています。
24
+ [ヘルプの41章](https://vim-jp.org/vimdoc-ja/usr_41.html) にはVim scriptを書くために必要なことがまとめられていますので、すべて目を通しておくとよいでしょう。
25
+
26
+ ---
27
+
1
- ### 結論
28
+ ### (以前の)結論
2
29
 
3
30
  **:read** コマンドに与える引数の書き方が違います。
4
31
 
@@ -14,9 +41,9 @@
14
41
  ### 説明
15
42
 
16
43
  VimにはEXコマンドと関数があります。
17
- **:function ...** の中の各行もEXコマンドですが、質問者のスクリプトでは関数のような書き方をされてしまっています。
44
+ **:function ...** の中の各行もExコマンドですが、質問者のスクリプトでは関数のような書き方をされてしまっています。
18
45
 
19
- - EXコマンド:
46
+ - Exコマンド:
20
47
  コマンドモードやVimスクリプトの行頭に書く。
21
48
  引数にカッコやクォートはつけず、複数項目は空白で区切る。(厳密にはコマンドによって引数の処理方法はさまざまです。引数を式として評価するコマンドなど。)
22
49
  ```vim