Как я могу вставить результат оценки ".w" в конце строки в Vim?

1081
brilliantlyInsane

Я хотел бы иметь возможность оценить строку Javascript (или другого кода) в Vim, и чтобы результат отображался в комментарии в конце строки.

Например, если у меня есть файл вроде:

console.log(4 + 5); 

и мой курсор находится на этой строке, и я использую команду :.w !node -e, результат " 9" появится в буфере ниже. если я использую :. !node -e, вся строка будет заменена результатом 9.

Как я могу вместо этого создать команду, которая добавит результат в конец строки в комментарии, например так:

console.log(4 + 5); // 9 

Также следует отметить, что использование :rбудет печатать все, что передается ему в следующей строке. r !echo "This is text."вставит " This is text." в строку под курсором. Однако команда вроде ...

:r ". !node -e" 

... будет пытаться читать ". !node -e"как файл вместо команды; Я не очень понимаю это поведение, но оно делает вещи немного менее интуитивными.

Мне бы хотелось, чтобы конечный результат был чем-то напоминающим то, как текстовый редактор Atom обрабатывает ядра водорода, а результат кода появляется слева от кода. Планируется создать связку клавиш ( <C-Enter>или <F5>) для автоматической оценки текущей строки и отображения результата.

5

2 ответа на вопрос

3
Horst

Если ваши строки выглядят так: 4 + 5 = вы можете использовать что-то вроде:

 : map "_ay / = ^ Mo ^ [!! echo ^ Ra \ | bc ^ MkJ 
  1. _ ............... чтобы перейти к началу текущей строки
  2. "AY / = ^ M ..., чтобы дергать до = в буфер A
  3. о ^ [ ........... сделать новую пустую строку
  4. !! .............. запустить программу оболочки, чтобы записать результат в эту новую строку
  5. ^ Ra .......... вставить содержимое буфера a в команду: echo ^ Ra \ | Ьс ^ M
  6. к .............. перейти к предыдущей линии
  7. J .............. присоединить следующую строку (результат) к реальной строке
  8. возможно, вы хотите удалить пустое соединение с х

Я надеюсь, что это то, что вы есть.

Ого, это работает почти идеально! Теперь мне просто нужно найти способ адаптировать его к анализу кода. Есть ли способ сделать это чтение до конца строки, а затем вместо этого передать строку в `node` или` python3`? Я выберу принятый ответ, когда выясню, как это сделать, поскольку технически это не дает точного ответа на мой вопрос. Тем не менее, это чертовски близко! brilliantlyInsane 5 лет назад 0
Чтобы добавить к этому, я думаю, что вы поменялись местами первые два символа команды; это должно быть `_" ay / ... `. brilliantlyInsane 5 лет назад 0
2
brilliantlyInsane

Благодаря предложению Хорста, я смог разобраться, как заставить Vim сделать это с любым языком, у которого есть опция «оценивать» в командной строке. Для JavaScript команда, которую я собрал, выглядит следующим образом:

imap <F5> ^[_"ay$o//^[kJo^[!!node -e "^Ra"^MkJi nmap <F5> _"ay$o//^[kJo^[!!node -e "^Ra"^MkJ 

Для поломки:

  1. Для INSERTотображения режима Escape ( ^[) возвращается в обычный режим.
  2. _"ay$помещает всю строку в регистр a.
  3. o//^[kJ добавляет "//" для комментария.
  4. o^[ начинается еще одна новая строка.
  5. !!node -e "^Ra"^M запускает регистр (строку) через Node.js и возвращает результат в текущей строке.
  6. Наконец, kJтянет эту новую строку обратно к первой, чтобы стать комментарием.
  7. (Для INSERTрежима, iвозвращается в режим от NORMALдо INSERTеще раз).

То же самое можно сделать для Python с несколькими незначительными правками:

imap <F5> ^[_"ay$o#^[kJo^[!!python -c "import math; ^Ra"^MkJi nmap <F5> _"ay$o#^[kJo^[!!python -c "import math; ^Ra"^MkJ 

Для этого //комментарий заменяется на Python #. Кроме того, я автоматически импортирую mathмодуль, так как он может быть очень полезен для быстрых вычислений.

Я рекомендую поместить каждое из этих сопоставлений в свои соответствующие ~/.vim/ftplugin/<language>.vimфайлы и поместить set ftplugin onв свой .vimrc. Это позволяет изменять отображение в зависимости от того, с каким языком вы работаете!

Я надеюсь, что любой, кто хочет запустить код в Vim в интерактивном режиме, сможет найти это и, возможно, даже улучшить его. Огромное «Спасибо!» идет к Хорсту за ответ на этот вопрос и начало этого маленького проекта!

Похожие вопросы