Mówienie Vimowi, aby używał niestandardowego .vimrc jest łatwe, ale jak powiedzieć mu, aby używał alternatywnej ścieżki zamiast ~ / .vim?

15

Mogę użyć vim -u filenamedo użycia filenamezamiast mojego domyślnego .vimrc. Korzystam z tej metody podczas przełączania kontekstów użytkownika ( su), aby korzystać z mojego, .vimrc nawet jeśli działam jako superużytkownik.

Jak mogę to zrobić również dla folderu, który domyślnie jest ~/.vimtak, że mogę skierować Vima z wiersza poleceń do innego folderu?


Co chcę osiągnąć

OK, załóżmy user joe( HOME=/home/joe) i user root( HOME=/root). Użytkownik joema ustawiony alias, dla vimktórego wygląda tak (ale pierwotnie ustawiony za pomocą $HOMEzmiennej, aby uczynić to dynamicznym):

alias vim='vim -p -N -n -i NONE -u "/home/joe/.vimrc"'

Następnie użytkownik joerobi coś zgodnie z sudo su -(ale z dodaną magią), co powoduje, że .bashrci inne gadżety /home/joezostaną załadowane root. Użytkownik rootma teraz dokładnie taki sam alias dla vimzestawu, jak pokazano powyżej.

Problem polega na tym, że .vimrcjest to używane w różnych systemach i różnych scenariuszach. Często nazywane jest konto Joe joe, ale czasami będzie to coś podobnego local.joelub cokolwiek innego, co spowoduje inną wartość $HOME. Tak więc kodowanie bezwzględne ścieżki do ~/.vimfolderu nie wydaje się dobrym pomysłem. Jednak w naszym powyższym scenariuszu użytkownik rootnie ma folderu, /root/.vimktóry powinien istnieć domyślnie za pośrednictwem funkcji load .vimrc( /home/joe/.vimrc).

To, co chcę osiągnąć - najlepiej w wierszu poleceń - to skłonić Vima do używania wtyczek itp. Od spodu /home/joe/.vimpo uruchomieniu jako root(zakładając, że aliasjest ustawiony jak pokazano - inne przypadki można zignorować). Jeśli istnieje jakaś metoda dynamiczna za pomocą VimScript, proszę podać wskaźniki. Ale $HOMEmyślę, że użycie takich zmiennych, jak mogłoby doprowadzić do złapania 22.

0xC0000022L
źródło
prawdopodobnie możesz to zrobić ze starym dobrym ln. jak 'mv ~ / .vim ~ / .vim -okolwiek && ln -s ~ / .vim -okolwiek ~ / .vim` następnie zrób to samo dla .vimrc. podsumuj to jakimś pseudonimem bash, abyś mógł łatwo przełączać się między nimi
jar

Odpowiedzi:

9

Vim szuka ~ / .vim, ponieważ ten katalog znajduje się na domyślnej liście w „runtimepath”, w skrócie „rtp”. Aby powiedzieć Vimowi, aby szukał gdzie indziej, będziesz musiał całkowicie określić inną wartość „rtp” lub edytować wartość domyślną, używając na przykład wywołania substitute (). Jeśli po prostu chcesz, aby Vim najpierw szukał w innym miejscu plików konfiguracyjnych, nie przejmuj się, że to też wygląda w ~ / .vim, i nie przejmuj się, że nie wygląda alternatywnie po katalogu, polecenie jest dość proste:

vim --cmd 'set rtp^=alternate_dir'

Widzieć

:help --cmd
:help :set^=

Zastąpienie .vim alternatywnym katalogiem wymaga nieco więcej pisania.

vim --cmd 'let &rtp = substitute(&rtp, "\.vim", "alternate", "g")'

Próbowałem zastąpić ~/.viminną ścieżką, ale nie mogłem dorównać ~, więc posunąłem się naprzód i opublikowałem to, co miałem.

Edytować

Powodem, dla którego nie mogłem dopasować ~wartości „rtp”, jest to, że gdy wartość jest uzyskiwana &rtpraczej jako wartość niż wynik wyjściowy :set rtp?, ~jest ona rozwijana do pełnej nazwy ścieżki katalogu domowego użytkownika. W ~wyniku nie ma .

Następujące prace.

vim --cmd 'let &rtp = substitute(&rtp, $HOME."/\.vim", "alternate", "g")'
garyjohn
źródło
dziękuję za poświęcenie czasu na odpowiedź. To wygląda bardzo obiecująco. Będę majstrować przy tym trochę jutro i dam znać, jak to idzie. Chciałbym, żeby mój VimScript był silniejszy, ale pracuję nad tym, co wskazuje na obiecujący kierunek.
0xC0000022L
@ 0xC0000022L: sposób, w jaki pokazałeś, \\~spełnia swoje zadanie. Jedna ucieczka dla Basha, jak sądzę? W każdym razie to nadal nie działa, ponieważ coś jest innego w tym, jak VimScript obsługuje ~.
0xC0000022L,
Myślę, że mam. Zauważ, że :set rtp?pokazuje „~ / .vim”, ale :echo &rtprozwija ~się do pełnej nazwy ścieżki. Wydaje się, że działają: `vim --cmd 'let & rtp = substitute (& rtp, $ HOME." / \. Vim "," alternate "," g ")'. Zaktualizuję moją odpowiedź.
garyjohn
dzięki, bardzo interesująca i subtelna różnica. Sprawia, że ​​niektóre rzeczy stają się bardziej problematyczne w moim konkretnym przypadku, ale zamierzam to zaakceptować. To dało mi znacznie więcej.
0xC0000022L,
3

W wybranym .vimrc możesz określić ścieżkę środowiska wykonawczego:

let &runtimepath=/path/to/specific/vim/folder

Jeśli używasz swojej osoby, .vimrcmożesz ustawić ją w swoim osobistym .vimkatalogu i powinna ona działać zarówno jako suzwykłe konto.

Paweł
źródło
To nie jest dokładnie z wiersza poleceń. Czy jest jakiś sposób, aby uczynić to tak dynamicznym? Widzisz, przypuszczam, że gdybym użył czegoś takiego jak $HOMEwtedy na swoim koncie, rozwiązałoby to, /home/joeale jako root nadal /root... więc nic nie zostanie wygrane. Ma .vimrcto działać na różnych platformach i wersjach Vima, a ustawienie absolutnej ścieżki całkowicie to łamie. Dzięki za poświęcenie czasu na odpowiedź.
0xC0000022L,
@ 0xC Już określasz vimrc z wiersza poleceń, a to z kolei określa ścieżkę środowiska wykonawczego. Zauważ, że w vimrc możesz uruchamiać skrypty w celu definiowania zmiennych, więc jeśli edytujesz swoje pytanie z dokładnym wynikiem, prawdopodobnie możemy znaleźć sposób, aby to zrobić.
Paul
zredagowałem moje pytanie. Dzięki za cierpliwość :)
0xC0000022L
Czy u użytkowników .bashrcmożna ustawić zmienną, powiedzmy $REALHOME, która jest zwolniona z, sudo reset_enva następnie wykorzystać ją jako podstawę rtp?
Paul
Brzmi jak jedna realna opcja. Odkryłem jednak, że łatwiej jest przemycać zmienne w ten sposób:alias sudosu='sudo su -l root -c "REALHOME='\''/home/joe'\'' /bin/bash --rcfile /home/joe/.bashrc"'
0xC0000022L