Для своих целей я написал два простых скрипта — 1 скрипт на bash и 1 скрипт на Python. Ниже я их прикрепил.
Баш:
#!/bin/bash
cat $1 | xclip -selection clipboard
Питон:
#!/usr/bin/python3
import sys
import os
PATH = '/home/gipakrot/sql/sql_ex/solutions'
files = os.listdir(PATH)
current_file = sys.argv[1]
if current_file in files:
version = 1
task = current_file[2: current_file.find('.sql')]
for file in files:
if file.startswith(f'ex{task}_'):
version += 1
final_name = f'ex{task}_{version}.sql'
else:
final_name = current_file
with open(current_file, 'r') as f:
lines = f.readlines()
with open(f'{PATH}/{final_name}', 'a') as f:
for line in lines:
f.write(line)
Также я сделал псевдонимы для них обоих:
alias movesql='mvsql.py'
alias copysql='copysql.sh'
Я хочу использовать их в режиме командной строки neovim.
Когда я пытаюсь использовать эти сценарии в режиме командной строки neovim:
:!copysql or :!movesql
Я получаю эту ошибку:
:!copysql [Command Line]
/bin/bash: line 1: copysql: command not found
shell returned 127
Можете ли вы помочь мне решить эту проблему? Не вижу, что я делаю не так. В терминале оба скрипта (через псевдонимы) работают как положено.
К неовиму это не имеет никакого отношения. У вас возникла бы та же проблема, если бы вы ввели псевдоним в обычной командной строке.
Опытные пользователи создают каталог типа ~/bin и помещают туда свои личные скрипты. Затем добавьте этот каталог в $PATH в свой .profile.
@Barmar не будет работать из Vim, потому что :! будет запускать неинтерактивную оболочку и не просматривать .profile, если вы не настроите shellcmdflag, что, в свою очередь, само по себе создает проблемы.
@Friedrich PATH обычно экспортируется, поэтому он будет унаследован всеми оболочками во время сеанса входа в систему. Так что вам нужно всего лишь установить его .profile.
@Бармар, да, PATH будет работать, псевдонимы нет. В вопросе ОП были псевдонимы, и я пропустил, что ваше предложение работает без них.
Да, забыл об этом. Вам следует просто выполнить сценарии Python и оболочки напрямую, не используя псевдонимы. Если вы не хотите вводить расширения .py и .sh, вы можете исключить их из имен файлов скриптов.
В любом случае, речь не идет о программировании. Вопросы об интерактивном использовании Unix относятся к разделу Unix и Linux.
У меня нет проблем, когда я набираю их в обычной командной строке, они работают ожидаемо. Но спасибо вам обоим! Я поместил оба скрипта в ~/.local/bin без расширений и под теми именами, которые хочу, чтобы они использовали, и они работают в оболочке и в neovim.
Чтобы усовершенствовать свое решение, вы можете размещать свои сценарии где угодно и с любыми именами. Затем создайте символические ссылки без расширений в каталоге PATH.






Это связано с тем, что оболочка, предоставляемая через интерфейс :! в neovim, не является интерактивной оболочкой. Мы можем убедиться в этом через :!echo $-. Полученная строка символов не включает i. В результате псевдонимы (и функции) не будут загружены. Хорошей альтернативой будет символическая ссылка этих двух скриптов на ~/.local/bin, что является обычным местом для пользовательских скриптов. В зависимости от того, в каком дистрибутиве вы находитесь, этот каталог может быть или не быть в вашей переменной среды PATH, поэтому проверьте, и добавьте его в свой .bashrc или другой сценарий инициализации, если нет. Обратите внимание, что точное имя символической ссылки — это то, что вы будете вызывать для выполнения скрипта, поэтому рассмотрите ln -s mvsql.py ~/.local/bin/mvsql (или что-то еще короче, если вы собираетесь использовать ее часто), чтобы вам не приходилось включать .py при вызове. это.
.обычно нет в$PATH. Поместите сценарии в каталог$PATHили укажите абсолютный путь в псевдонимах.