質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

Q&A

解決済

2回答

406閲覧

vim のscript でrea()を使って外のファイルを読み込みたい

HorinoTora

総合スコア9

Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

0グッド

0クリップ

投稿2023/01/18 02:06

前提

vim を使用してファイルを編集しています。
あるキー(F11)を押したら編集中のファイルに他のファイル(orgtext.txt)を読み込みたいと
考え、_vimrcに次のように記述しました。
map <F11> :call InsText()
function InsText()
read ( 'e:\dir\orgtext.txt' )
endfunction

実現したいこと

ファンクションキーF11を押したら、現在カーソルがある位置にorgtext.txtの内容が
読み込まれて欲しい。

発生している問題・エラーメッセージ

vimにてファイルを読み込み、F11を押すと、次のようなエラーが出ます。
function InsText の処理中にエラーが検出されました。
行 2:
E484:ファイル"( 'e:/dir/orgtext.txt')" を開けません
(行 2 は関数InsText の read(`e:---\dir\orgtext.txt') であろうと思います。

試したこと

コマンドラインから
:read e:\dir\orgtext.txt
と入力するとカーソルの位置にorgtext.txt の内容が読み込まれます。(これは期待通り)

また、orgtext.txtはvimで開くことは出来ます。

補足

OS はWin11, vimはver8.2### 前提

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

実はread の引数を関数(s:filename)にしてあり、前段で、ファイルの種類により、 読み込むファイルを変更したいのです。 read の引数を固定した文字列であれば、正常に実行しますが、変数にするとそのファイルが開けないのです。 お教えいただいた方法は固定したファイルとなりますので、うまくできません。

:read コマンドに与える引数の書き方が違います。

以下のようにすれば期待の動作になると思います。

vim

1let s:filename = 'e:\dir\orgtext.txt' 2map <F11> :call InsText() 3function InsText() 4 execute 'read' fnameescape(s:filename) 5endfunction
  • :read Exコマンドの引数は固定文字列です。式を指定することはできません。
  • :execute Exコマンドの引数は空白区切りの式です。式の評価結果の文字列をExコマンドとして実行します。
  • fnameescape() 関数は文字列に含まれる特殊文字をエスケープします。

上記の通り、Exコマンドによって引数に式が使えるかどうかはかわります。コマンド毎にヘルプを確認するとよいでしょう。

今回のポイントはヘルプの 41.5 式を実行する に書かれています。
ヘルプの41章 にはVim scriptを書くために必要なことがまとめられていますので、すべて目を通しておくとよいでしょう。


(以前の)結論

:read コマンドに与える引数の書き方が違います。

以下のようにすれば期待の動作になると思います。

vim

1map <F11> :call InsText() 2function InsText() 3 read e:\dir\orgtext.txt 4endfunction

説明

VimにはEXコマンドと関数があります。
:function ... の中の各行もExコマンドですが、質問者のスクリプトでは関数のような書き方をされてしまっています。

  • Exコマンド:
    コマンドモードやVimスクリプトの行頭に書く。
    引数にカッコやクォートはつけず、複数項目は空白で区切る。(厳密にはコマンドによって引数の処理方法はさまざまです。引数を式として評価するコマンドなど。)

    vim

    1:read e:\dir\orgtext.txt
  • 関数:
    式として評価される位置に書く。
    カッコの中に引数を式として記述する、複数項目はカンマで区切る。

    vim

    1:call read('e:\dir\orgtext.txt')

投稿2023/03/22 03:51

編集2023/03/24 11:46
Milly

総合スコア167

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HorinoTora

2023/03/23 06:43

実はread の引数を関数(s:filename)にしてあり、前段で、ファイルの種類により、 読み込むファイルを変更したいのです。 read の引数を固定した文字列であれば、正常に実行しますが、変数にするとそのファイルが開けないのです。 お教えいただいた方法は固定したファイルとなりますので、うまくできません。
HorinoTora

2023/03/25 01:57

教えていただいた方法で、解決しました。私の関数やEXコマンドに対する知識が全く不足してしました。 ヘルプの41章 を熟読してみます。 ありがとうございました。
guest

0

エラーメッセージにあるように、( 'e:/dir/orgtext.txt')というファイルを探してしまっている状態です。

ご自身で

コマンドラインから
:read e:\dir\orgtext.txt
と入力するとカーソルの位置にorgtext.txt の内容が読み込まれます。(これは期待通り)

と書かれているように、readコマンドの引数に括弧やクォートを付ける必要はありません。
Vim scriptの関数はコマンドを順次実行しているだけなので、これをそのまま書けばOKです。

ということで、以下のように設定すると動くと思います。

vim

1function InsText() 2 read e:\dir\orgtext.txt 3endfunction

投稿2023/03/22 03:11

kawarimidoll

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問