Ответ 1
Чтобы выполнить текущую строку как команду ex, вы также можете использовать:
yy:@"
Это выдержит текущую строку в "-register" и запустит ее. Я не думаю, что это слишком много набрав.
Скажем, я редактирую файл _vimrc
, и я только что добавил пару строк, например новое сопоставление ключей. Я не хочу перезагружать весь файл (:so %
), так как это будет reset много временного материала, с которым я экспериментирую. Я просто хочу запустить две строки, над которыми я сейчас работаю.
Мне не повезло, чтобы скопировать/вставить строки в командный буфер, так как я не могу использовать команду put там. Есть ли способ запустить текущую строку (или текущий выбор) в виде команд EX?
Резюме:
После Антон Коваленко ответ и Питер Ринкер комментарий Я закончил с этими ключевыми картами, которые либо исполняются текущую строку или текущие выделенные строки, если в визуальном режиме:
" Execute current line or current selection as Vim EX commands.
nnoremap <F2> :exe getline(".")<CR>
vnoremap <F2> :<C-w>exe join(getline("'<","'>"),'<Bar>')<CR>
Чтобы выполнить текущую строку как команду ex, вы также можете использовать:
yy:@"
Это выдержит текущую строку в "-register" и запустит ее. Я не думаю, что это слишком много набрав.
Выполнение строки под курсором в виде команды Ex:
:execute getline(".")
Удобно для двух линий. (я бы понял, что делать с регионами, но я не пользователь vim). И для выбранного в данный момент региона, похоже, выполняет следующее задание:
:execute getreg("*")
Как прокомментировал Peter Rincker, это сопоставление можно использовать для выполнения выбранных строк:
:vnoremap <f2> :<c-u>exe join(getline("'<","'>"),'<bar>')<cr>
Для этой цели я определил следующие команды и отображения:
":[range]Execute Execute text lines as ex commands.
" Handles |line-continuation|.
" The same can be achieved via "[email protected] (or [email protected]" 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>
Сразу после публикации этого, я нашел работу. Я могу скопировать текст в буфер обмена с помощью "*y
, затем поместить этот текст в буфер команд, используя среднюю кнопку мыши. Это работает для меня, но вряд ли является удобным решением для людей без поддержки буфера обмена, поддержки мыши или просто отвращения к удалению их рук из положения Vim.
Принятый ответ не обрабатывает разделы продолжения. Кроме того, удивительно, что бар не нужен, новые строки в порядке. Это будет работать, сначала вставляя текст в регистр x:
vno <c-x> "xy:exe substitute(@x,"\n\\",'','g')<cr>
Как уже упоминалось, единственным исключением являются команды, которые "съедают" новые строки. Например, выполнив указанное выше отображение на:
:sign define piet text=>> texthl=Search
:exe ":sign place 2 line=23 name=piet file=" . expand("%:p")
заставит vim думать, что пользователь пытается определить textl как "Поиск\n: exe": место для знака... и т.д.
Если вы много экспериментируете (попробуйте сделать что-то, что вы, возможно, захотите добавить в свой vimrc, я предполагаю?), это может помочь сделать это в файле с царапинами, таком как experimental.vim, чтобы вы не просто опираясь на свою историю, чтобы узнать, что вы пытаетесь сделать. Теперь, когда у вас есть эти большие сопоставления, будет легко перезапустить вещи из экспериментальных или vimrc без поиска всего файла.
Также (извините, я не могу комментировать ответы еще, кажется), я пробовал это сопоставление Петра:
vnoremap <Leader>es :<c-u>exec join(getline("'<","'>"),'<BAR>')<CR>
Это работает в большинстве случаев, но не выполняет определенные функции определения функций.
function! TestMe()
echo "Yay!"
endfunction
Это сопоставление соединяет строки в одну строку, разделяемую <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>
не работает над функциями (возможно, даже некоторые настройки, которые у меня есть?), и мне любопытно узнать, что это такое, если кто-то знает.
Я не хочу перезагружать весь файл (: so%), так как это будет reset много временного материала, который я экспериментирую. Я просто хочу запустить две строки, над которыми я сейчас работаю.
Если вы хотите выполнить команду, потому что хотите ее доработать, прежде чем передать ее на _.vimrc, вы должны запустить окно командной строки для команд Ex-mode с помощью q:.
При запуске окно командной строки буферизуется содержимым истории командной строки. Это нормальное окно Vim, содержимое которого можно редактировать как любой текстовый буфер, за исключением нажатия на любую строку, которая выполняет команду на этой строке. Это очень полезно, если вы хотите немного изменить длинную сложную команду, которую вы написали ранее, и повторно запустить ее.
Чтобы запустить окно командной строки для строк поиска, нажмите q/.