Подтвердить что ты не робот

Выполнить текущую строку в bash от vim

Этот вопрос похож на Vim: выполнить текущий файл?, но вместо выполнения текущего файла я хочу выполнить только текущую строку.

Возможно ли это?

Обновление. В идеале я ищу решения, которые могут иметь побочные эффекты во внешней оболочке. Например, предположим, что у меня есть следующая строка:

alias foo=bar

После запуска команды в vim, если я запускаю оболочку с :sh, доступен псевдоним foo, но если я закрою vim с помощью :q, тогда псевдоним больше не будет доступен.

4b9b3361

Ответ 1

Конечно, вы можете "написать" любой контент текущего файла в stdin другой программы:

:.w !bash

Здесь . (часть до w) относится к диапазону строк, которые вы пишете, а . - только текущая строка. Затем вы используете !bash для записи этих строк в bash.

Ответ 2

Я все время делаю с:

:exec '!'.getline('.')

Вы даже можете создать сопоставление в своем .vimrc:

nmap <F6> :exec '!'.getline('.')

Ответ Даана также работает, я дал ему преимущество.

Ответ 3

переместите курсор на эту строку, и в нормальном режиме нажмите:

!!bash<cr>

Ответ 4

Это может быть комментарий, если я могу прокомментировать.

Что касается строк перенаправления/трубопровода текущего буфера в vim для внешней команды, вдохновил Даан Баккер отличный ответ, я написал, что отвечаю здесь (fooobar.com/questions/136789/...), по вопросу, касающемуся запустить python script (текущий буфер).

Помимо запуска всего буфера, демонстрируется, как запускать диапазон строк с помощью внешней команды. Чтобы сэкономить время, я просто скопирую его ниже.

#####################

В vim вы можете просто перенаправить любой диапазон вашего текущего буфера на внешнюю команду (будь то bash, python или собственный python script).

# redirect whole buffer to python
:%w !python

предположим, что ваш текущий буфер содержит две строки, как показано ниже,

import numpy as np
print np.arange(12).reshape(3,4)

тогда :%w !python запустит его, будь он сохранен или нет. и напечатайте что-то вроде ниже на вашем терминал,

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

Конечно, вы можете сделать что-то постоянное, например, некоторые раскладки клавиатуры.

nnoremap <F8> :.w !python<CR>
vnoremap <F8> :w !python<CR>

сначала запустите текущую строку, второй - визуальный выбор, через интерпретатор python.

#!! be careful, in vim ':w!python' and ':.w !python' are very different, the
first write (create or overwrite) a file named 'python' with contents of
current buffer, the second redirect the selected cmdline range (here dot .,
which mean current line) to external command (here 'python').

для диапазона cmdline, см.

:h cmdline-ranges

не ниже единицы, что касается нормальной команды, а не cmdline.

:h command-range

вдохновлен fooobar.com/questions/136788/...

Ответ 5

Если у меня есть команда на строку текста в vi/vim, как это "

ls -la

Поместите курсор в любое место строки и выполните ":. !!" и нажмите возврат.

То есть: двоеточие точка взрыва взрыва

Это выполнит текст в этой строке в текущей оболочке из vi/vim и вставит вывод в текстовый файл.

Я думаю, это то, что вы спрашивали? это как волшебство.

Ответ 6

Рассмотрим следующую команду, запущенную на терминале:

seq 0 10 | xargs printf "%02x "

Ожидаемый результат есть,

00 01 02 03 04 05 06 07 08 09 0a

Считайте, что у вас есть эта команда, записанная в файле Чтобы выполнить эту команду, получить соответствующий вывод обратно в этот файл, вы можете добавить это отображение в ваш .vimrc,

nmap <leader>E :exec 'r!'.getline('.')<CR>

Обратите внимание, что для выполнения вышеупомянутой строки вам нужно написать ее с добавлением escape-символа для ' % ' следующим образом:

seq 0 10 | xargs printf "\%02x "

Перейдите к этой строке в вашем файле и нажмите <leader>E В моем случае <leader> отображается , поэтому я нажму ,E

Ответ 7

Добавьте это отображение в ваш файл .vimrc,

nmap <leader>E yyp:.!csh<CR>

Объяснение:

  1. yy янки текущая линия
  2. p Вставьте рывковую строку ниже (и курсор перейдет к следующей строке)
  3. :.!csh<CR> Выполнить (используя csh) эту вновь вставленную строку на месте. Вывод этой строки заменяет эту текущую строку, поэтому перед выполнением строка была выдернута и вставлена ниже.