25

ファイルを編集していて_vimrc、たとえば新しいキーマッピングなど、数行追加したとします。ファイル全体()をリロードしたくないのは、:so %実験している多くの一時的なものがリセットされるためです。現在作業中の2行を実行したいだけです。

コマンドバッファでputコマンドを使用できないため、コマンドバッファに行をコピーして貼り付けることができません。現在の行(または現在の選択)をEXコマンドとして実行する方法はありますか?


概要:

AntonKovalenkoの回答とPeterRinckerのコメントの後、私はこれらのキーマップに行き着きました。これは、現在の行、またはビジュアルモードの場合は現在選択されている行のいずれかを実行します。

" Execute current line or current selection as Vim EX commands.
nnoremap <F2> :exe getline(".")<CR>
vnoremap <F2> :<C-w>exe join(getline("'<","'>"),'<Bar>')<CR>
4

9 に答える 9

49

現在の行を ex コマンドとして実行するには、以下も使用できます。

yy:@"

これにより、現在の行が "-register にヤンクされて実行されます。タイピングが多すぎるとは思いません。

于 2013-10-22T16:16:08.880 に答える
20

Exコマンドとしてカーソルの下の行を実行します。

:execute getline(".")

2行で十分便利です。(私はリージョンでそれを行うための何かを理解するでしょうが、私はvimユーザーではありません)。そして、現在選択されている地域では、次のことがうまくいくようです。

:execute getreg("*")

Peter Rinckerがコメントしたように、このマッピングは現在選択されている行を実行するために使用できます。

:vnoremap <f2> :<c-u>exe join(getline("'<","'>"),'<bar>')<cr>
于 2013-01-17T18:53:43.323 に答える
6

そのために、次のコマンドとマッピングを定義しました。

":[range]Execute    Execute text lines as ex commands.
"                   Handles |line-continuation|.
" The same can be achieved via "zyy@z (or yy@" through the unnamed register);
" but there, the ex command must be preceded by a colon (i.e. :ex)
command! -bar -range Execute silent <line1>,<line2>yank z | let @z = substitute(@z, '\n\s*\\', '', 'g') | @z

" [count]<Leader>e  Execute current [count] line(s) as ex commands, then
" {Visual}<Leader>e jump to the following line (to allow speedy sequential
"                   execution of multiple lines).
nnoremap <silent> <Leader>e :Execute<Bar>execute 'normal! ' . v:count1 . 'j'<CR>
xnoremap <silent> <Leader>e :Execute<Bar>execute 'normal! ' . v:count1 . 'j'<CR>
于 2013-01-17T19:03:21.723 に答える
4

これを投稿した直後に、回避策を見つけました。を使用してテキストをクリップボードにコピーし"*y、マウスの中ボタンを使用してそのテキストをコマンドバッファに入れることができます。これは私にとってはうまくいきますが、クリップボードのサポート、マウスのサポート、またはVimの位置から手を離すことへの嫌悪感がない人にとっては便利なソリューションではありません。

于 2013-01-17T18:50:22.500 に答える
1

ファイル全体 (:so %) をリロードしたくありません。これは、実験中の多くの一時的なものをリセットするためです。現在作業中の 2 つの行を実行したいだけです。

_.vimrc にコミットする前にコマンドを改良するためにコマンドを実行したい場合は、Ex-mode コマンド用のコマンド ライン ウィンドウを で起動する必要がありますq:

コマンド ライン ウィンドウの起動時に、コマンド ライン履歴の内容がバッファリングされます。これは通常の Vim ウィンドウであり、その内容は任意のテキスト バッファーとして編集できますが、その行でコマンドを実行する任意の行を押すことは例外です。前に書いた長くて複雑なコマンドを少し変更して再実行したい場合に非常に便利です。

検索文字列の「コマンド ライン ウィンドウ」を起動するには、 を押しq/ます。

于 2013-06-15T07:05:09.877 に答える
1

多くの実験を行っている場合 (vimrc に追加したいことを試していると思いますか?)、experimental.vim のようなスクラッチ ファイルで行うと役立つ場合があります。あなたが何をしようとしているのかを知るための歴史。これらの優れたマッピングが得られたので、ファイル全体をソースすることなく、experimental または vimrc から簡単に再実行できます。

また(申し訳ありませんが、まだ回答についてコメントすることはできません)、ピーターのこのマッピングを試しました:

vnoremap <Leader>es :<c-u>exec join(getline("'<","'>"),'<BAR>')<CR>

これはほとんどの場合に機能しますが、特に関数定義では失敗します。

function! TestMe()
  echo "Yay!"
endfunction

このマッピングは、行を 1 つの文字列に結合し、 で区切って<BAR>から実行します。

理由は完全にはわかりませんが、通常モードの関数定義でそれを実行しようとすると:

:exec 'function! TestMe()|  echo "Yay!"|endfunction'
-> E488: Trailing characters

いくつかのテストの後、代わりに改行セパレーターで動作することがわかりました。

:exec "function! TestMe()\n  echo 'Yay!'\nendfunction"
:call TestMe()
-> Yay!

したがって、マッピングを次のように変更しました。

vnoremap <Leader>es :<c-u>exec join(getline("'<","'>"),"\n")<CR>

メソッドが関数で機能しないのにはvimまたはexの理由があると思い<BAR>ます(おそらく、私が行っている設定でさえありますか?)、誰かが知っていればそれが何であるかを知りたいです。

于 2013-01-22T14:51:59.597 に答える