現在の行にテキストを追加するにはどうすればよいですか?


8

私は現在vimscriptを理解しようとしていて、そのappend()機能を偶然見つけました。ドキュメントには、式を追加する行を指定できると記載されているので、試してみました。

:call append(line('.'), Foo())

Foo() 文字列を返します。

奇妙なことに、文字列は現在の行の次の行に追加されます。だから私はline('.') - 1、現在の行の上にある行に追加されることを確認するためだけに試しました。

現時点では、私は驚き、混乱し、言葉を失っています。

誰かがこれについていくつかの光を当てることができることを願っています。


ドキュメントには、式(この場合はFoo())を指定された行の下の1行として追加する必要があることが明記されています。A現在の行に実際にテキストを追加する通常モードのコマンドと混同しないでください。
ナウマン2017年

1
:help function-list使用可能な組み込み関数を確認してください。
アントニー

回答:


8

append()最初の引数として指定された行の下に数行のテキストを挿入します。これはappendexコマンドと一致しています。たとえば:append、入力して(exモードに入る)、数行のテキストを書き込んでexモードを終了する(<c-c>たとえば、を押す)と、カーソルが置かれている行の後に行が表示されます。言い換えれば、このappendコマンドは次のことを意味します。現在の行の下に、書き込む行を追加します。

VimScript関数でappend()は、行指定子を使用できるため、exコマンドよりも便利です。よくある便利なことは、ファイルの最初と最後にテキストを挿入する方法です。たとえば、LaTeXの場合、これは便利です。

call append(line('^'), [ '\documentclass[12pt]{article}'
\                      , '\begin{document}'])
call append(line('$'), '\end{document}')

line('$')ファイルの最後の行はどこにあり、line('^')常に戻ります0(代わりに問題なく書けたかもしれません)。

Vimの動作A、またはその他のVimノーマルモードコマンドを使用するには、を使用しますnormal。の出力をFoo()行末に表示するには、もう少し複雑かもしれませんが、1つの方法は次のようにすることexecuteです:

execute ':normal! A' . Foo()

または、追加を使用して実行することもできますJ

call append(line('.'), Foo())
normal! Jx

xによって生成されたスペースを削除するために必要ですが、によってJ生成された文字列Foo()がスペースで始まる場合、これは期待どおりに機能しない可能性があります)。


5
setline()+ getline()は別のオプションです。
アントニー

2
gJスペースなしで参加します
SergioAraujo '18

10

append()この関数は、おそらく命名されている必要がありますappendline():それは唯一のバッファに行を追加します。既存の行を変更することはできません。

これは、aフラグをfopen()に使用>>したり、シェルで使用したりするようなものです。


既存の行の値を設定したい場合は、VimScriptから設定する最も簡単な方法はを使用することsetline()です。たとえば、現在の行をCoconuts次のように設定します。

:call setline('.', 'Coconuts')

を使用getline()して現在の行の値を取得できるためCoconuts、行に追加するには次のようにします。

:call setline('.', getline('.') . 'Coconuts')

リストを使用して複数行を設定することもできます(と同様にappend()):

:call setline('.', ['Coconuts', 'Bananas'])

複数行にテキストを追加するには、forループを使用する必要があります。


上記が唯一の方法ではないことに注意してください。他の方法は:substitute(例:s/$/\=Foo()/)またはグロクマルの答えを使用することです。「最良の」方法は、それを使用しているコンテキストと個人の好みによって異なります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.