Это не только, что Ваш терминал должен поддерживать 256 цветов, тема в энергии будет относиться к цветам в Вашем.Xdefaults/.Xresources. Для фиксации этого необходимо использовать те же цвета в качестве автора темы или использовать gvim вместо этого.
Заглядывание на код I видит, что поддерживает gvim правильно, вот почему с помощью работ CSAprox, поскольку это берет gvim цветовые коды в ШЕСТНАДЦАТЕРИЧНОМ ЧИСЛЕ (например.:#123ABC) и переводит их в терминальные цвета, я думаю.
Пример
Vim в консольном режиме возьмет цвета от:
hi Normal ctermfg=16 ctermbg=254
в то время как в графическом режиме:
hi Normal guifg=#d0d0d0 guibg=#202020
Так, при установке некоторой "темы" для терминальных цветов, она влияла бы на цвета, которые Вы получаете в Vim. Кроме того, двойная проверка, чтобы Вы имели
set background=dark
в Вашем .vimrc
git clone
берет дополнительный аргумент: каталог для использования. Можно заставить его клонироваться в текущий рабочий каталог с git clone URL .
Затем нет никакой потребности изменить рабочий каталог; Вы уже там.
Если Вы действительно хотите git
управляйте для фактического изменения рабочего каталога, можно изменить его на функцию, которая называет реальное git
когда необходимый:
git()
{
local tmp=$(mktemp)
local repo_name
if [ "$1" = clone ] ; then
/usr/bin/git "$@" | tee $tmp
repo_name=$(awk -F\' '/Cloning into/ {print $2}' $tmp)
rm $tmp
printf "changing to directory %s\n" "$repo_name"
cd "$repo_name"
else
/usr/bin/git "$@"
fi
}
Создайте функцию:
gclonecd() {
git clone "$1" && cd "$(basename "$1" .git)"
}
(Работы для ссылок и с и без ".git")
git clone
из-за всех инструментов, которые я должен был бы изменить, если бы я не использовал git
. Концентратор искажается, поскольку мерзавец, oh-my-zsh обеспечивает автозавершение, и т.д....
– Daniel K.
28.10.2013, 16:44
git
не может изменить рабочий каталог Вашей оболочки, так так или иначе необходимо будет перенести его в псевдоним/функцию, который делает то, что Вы хотите, и развивает его со встроенным cd
. Если Вы хотите звонить hub
вместо git
, сделайте так в функции. Если Вы хотите, чтобы это только влияло clone
команда, проверьте на действие в функции. и т.д.
– frostschutz
28.10.2013, 17:04
basename git@github.com:pckujawa/pattern-rec.git
результаты в шаблоне-rec.git - Вы просто бросаете .git расширение, когда Вы клонируетесь?
– Pat
28.06.2014, 08:03
basename
также берет суффиксный аргумент, таким образом, можно сделать: git clone $1 && cd $(basename $1 .git)
– Henrik N
13.11.2015, 22:40
Если вы указываете локальное имя репо, то это действительно просто использовать $_:
git clone git@github.com:npm/npm.git npm-local-dir && cd $_
Но если вы не хотите перепечатывать длинные имена, то это немного уродливо, но это можно сделать с помощью sed:
git clone git@github.com:pckujawa/pattern-rec.git &&
cd `echo $_ | sed -n -e 's/^.*\/\([^.]*\)\(.git\)*/\1/p'`
EDIT: Ну, я собирался поблагодарить Manav (комментарий ниже) за лаконичный
git clone foo/bar && cd !$:t
, но он не работает в zsh (что-то вроде , как zsh делает расширения, что заставляет его не обрабатывать первую команду, как вводимую в ! $
). Я должен был посмотреть, что !$:t
сделал ( Advancing in the Bash Shell | ${me:-weverever}). !$
хватает последнюю часть предыдущей команды и :t
будет "Удалить все ведущие компоненты имени файла, оставив хвост". Хорошая информация, но мне бы хотелось, чтобы она работала с zsh (я пробовал noglob
безуспешно).
EDIT: Вместо того, чтобы использовать sed
или !$:t
(что не работает в zsh, для меня в любом случае), я нашел еще две опции (одна адаптирует https://unix.stackexchange). com/users/5685/frederik-deweerdt 's answer with https://unix.stackexchange.com/users/129926/henrik-n 's comments):
git clone git@github.com:npm/npm.git && cd $(basename $_ .git)
или
git clone git@github.com:npm/npm.git && cd ${${_%%.git*}##*/}
Я бы не рекомендовал это, но вы могли бы использовать этот однострочный текст:
echo 'project' | xargs -I% sh -c 'git clone https://github.com/username/%.git && cd%'
Адаптация приведенного выше ответа для OSX
mktemp
требует дополнительного параметра git clone
по умолчанию записывает в STDERR
(см. this ) Функция:
function git {
local tmp=$(mktemp -t git)
local repo_name
if [ "$1" = clone ] ; then
command git "$@" --progress 2>&1 | tee $tmp
repo_name=$(awk -F\' '/Cloning into/ {print $2}' $tmp)
rm $tmp
printf "changing to directory %s\n" "$repo_name"
cd "$repo_name"
else
command git "$@"
fi
}
Включите это в свою оболочку:
git(){
case "$1" in clone) git-clone "${@:2}";; *) command git "$@";; esac
}
git-clone(){
local tgt
tgt=$(command git clone "$@" 2> >(tee /dev/stderr |head -n1 | cut -d \' -f2)) ||
return $?
cd "$tgt"
}
Это работает, тайно подбирая цель клонирования из стандартной ошибки git и вставляя cd
в цель, если (и только если) клонирование прошло успешно.
Он принимает все аргументы и опции, которые делает обычный git clone
.
Либо вы можете использовать оболочку git и не беспокоиться о своих завершениях, либо вы можете избавиться от оболочки git и перепрограммировать свои git clone
завершения в git-clone
.
Вы можете сделать что-то вроде:
clone_check() {
(($? != 0)) && return
local cmd=$history[$((HISTCMD-1))]
cmd=("${(@Q)${(z)cmd}}")
if [[ $cmd = "git clone "* ]]; then
local dir
if (($#cmd == 3)); then
dir=${cmd[3]:t}
dir=${dir%.git}
dir=${dir#*:}
elif (($#cmd > 3)); then
dir=$cmd[-1]
else
return
fi
print -r CDing into $dir > /dev/tty
cd -- $dir
fi
}
precmd_functions+=(clone_check)
Это довольно упрощенно. Это ловушка precmd
(выполняется перед каждым запросом), которая проверяет, выглядела ли последняя командная строка как git clone ... / something
или git clone ... / something dir
, угадайте каталог из этого и перейдите в него.
Это не сработает, если вы ввели git clone foo; что угодно
или что угодно; git clone foo
или git clone --option repo
...
Простым решением для любой оболочки POSIX является явное указание каталога для клонирования (любой путь файловой системы) и его повторное использование:
git clone <repository> <directory> &&
cd "$_"
и
cd -
, когда вы закончите.
Я сделал это на основе ответа @frederik -deweerdt.
Таким образом, пользователь может просто клонировать clone
ссылку репо, которая находится в буфере обмена. Если вы сообщите репо, оно клонирует, а не вводит.
Требуется установить xclip
.
clone() {
if [ -z "$1" ]
then
local repo=$(xclip -o)
else
local repo=$1
fi
git clone "$repo" && cd "$(basename "$repo".git)"
}
Другая реализация также обрабатывает дополнительные аргументы команды git clone
.
Правильно cd
в указанную папку или имя репозитория git по умолчанию.
Использование
gclonecd https://github.com/example/repo
gclonecd https://github.com/example/repo my-custom-folder
Функция удара
# Clones git repo and cd's into it
gclonecd() {
git_dir="$(basename "$1".git)"
git_dir_resolved=${2:-$git_dir}
git clone "$@" && cd "$git_dir_resolved";
}
Существует фундаментальная проблема с вашим запросом, которая делает почти невозможным достижение :git является дочерним процессом оболочки в этом случае, а дочерние процессы не могут изменять родительскую среду в большинстве операционных систем. Таким образом, единственный способ сделать это со стороны оболочки -путем реализации псевдонима или функции.
Дополнительную информацию можно найти здесь :https://stackoverflow.com/questions/2375003/how-do-i-set-the-working-directory-of-the-parent-process
/tmp
объем, который находится в RAM, как любой современный Linux делает через tmpfs. Так или иначе, почему был бы Вы заботиться о записи в диск, когда Вы только что сделали клон мерзавца, который создает каталоги и записи, возможно, сотни файлов к диску... – Kaz 29.10.2013, 21:02git [flags] command [arguments]
, так вслепую просьба оclone
в определенном положении перестанет работать. – vonbrand 14.02.2016, 00:19which git
мерзавец () {... $git_real_home "$" | $tmp – aakoch 05.01.2017, 21:31