2013-04-14 10 views
5

Mam potrzebę odwoływania zmienne środowiskowe systemu Windows z poziomu Sublime Text 2 stopnie plikach (Pakiet-Name.sublime-Settings), a konkretnie %APPDATA% i %TMP%zmienne środowiskowe Użyj systemu Windows w ustawieniach Sublime pliki tekstowe

Czy to możliwe , a jeśli tak, to w jaki sposób?

Na przykład, tutaj jest wiersz z jednego ustawienia do opakowania, która musi pracować na wielu użytkowników, więc z różnych nazw użytkownika:

"backup_dir": "C:\\Users\\Username\\AppData\\Local\\Temp\\SublimeBackup" 

Jako przykład, tu jest problem miałem tylko: mam instalacyjnego z Sublime Text 2, która biegnie z wielu komputerów (tj skopiować swoje dane około zachować ustawienia itp na bieżąco między wieloma instalacjami), ale mam poniższego polecenia:

{ "caption": "Backup to Server (Local to Server)", "command": "exec", "args": { "cmd": ["local-to-server.cmd"] } }, 

Niestety, plik " local-to-server.cmd "odnosi się do aktualnie otwartego pliku i n Sublime Edit, więc to polecenie rzadko działa. Potrzebuję:

{ "caption": "Backup to Server (Local to Server)", "command": "exec", "args": { "cmd": ["%APPDATA%\Sublime Text 2\Packages\User\local-to-server.cmd"] } }, 

Lub w podobny sposób do odniesienia do wspólnej lokalizacji, z której mogę następnie zbudować ścieżkę względną.

+0

To (teraz) musi zostać wdrożone na poziomie wtyczki. Nie sądzę, że domyślne pakiety zawierają wszystko, co wymaga zmiennej ekspansji (chociaż mógłbym się mylić). Jeśli tak jest, prawdopodobnie chcesz utworzyć żądanie funkcji dla konkretnej wtyczki. – skuroda

+0

Czy istnieje sposób na utworzenie wtyczki, która może spowodować rozszerzenie zmiennych w innych wtyczkach? Wymagam tego w więcej niż jednej wtyczce/miejscu. Albo sposób na określenie konkretnej zmiennej o określonej wartości, której mogę użyć w wielu plikach ustawień? –

+0

Niestety nie. Wywołanie ustawień ładowania, które jest używane do uzyskania tych ustawień, przekazuje zawartość pliku bezpośrednio do metody wywołującej. Najbliższym, co prawdopodobnie można uzyskać, jest posiadanie plików bazowych na zewnątrz, a następnie uruchomienie skryptu po przejściu do każdego komputera w celu zastąpienia żądanych wartości. – skuroda

Odpowiedz

2

Dzięki @schlamar za poprawienie ustawień. Nie zdawałem sobie sprawy, że trwają przez całą sesję. Wszystkie moje wtyczki używają ich lokalnie i nie robię żadnych modyfikacji, ale to dobrze wiedzieć. Oto wtyczka do rozszerzania zmiennych przy ładowaniu ST. Powinien działać zarówno w ST2, jak i ST3.

import os 
import sublime 

VERSION = int(sublime.version()) 

def expand_settings(): 
    expand_settings = { 
     "<setting file names>": [ 
      "<setting keys to expand>" 
     ] 
    } 
    for filename, setting_keys in expand_settings.items(): 
     s = sublime.load_settings(filename) 
     for key in setting_keys: 
      value = s.get(key) 
      s.set(key, os.path.expandvars(value)) 

def plugin_loaded(): 
    expand_settings() 

if VERSION < 3006: 
    expand_settings() 
+0

Czy możesz podać wtyczkę Sublime Text 2? Próbowałem tego sam, ale nie udało mi się z powodu mojej brakującej wiedzy Pythona. Zrobiłem copypasted twój kod w pliku py i jestem gettting 'TypeError: argument typu" NoneType "nie jest iterable' kiedy uruchomię ST2 i wtyczka jest ładowana. –

+0

Czy zastąpiłeś i z odpowiednimi wartościami? Zgadywanie tego można łatwo rozszerzyć do ogólnej wtyczki, odczytując pliki ustawień i właściwości również z systemu plików. – skuroda

+1

Tak, ja ustawić wartości, ale może robię to źle: 'expand_settings = { "HOMEPATH": [ "C: \\ Users \\ john.doe \\" ] }' Właściwie "szukam wtyczki, która odczytuje zmienne Windows takie jak% HOMEPATH%, dzięki czemu mogę ich używać w innych ustawieniach wtyczki. –

1

@skuroda jest błędny w swoim komentarzu. Wprowadzanie zmian jest trwałe w przypadku wtyczek i wielu połączeń load_settings. Prosty przypadek testowy:

s = sublime.load_settings('Preferences.sublime-settings') 
s.set('test', 'x') 
s = sublime.load_settings('Preferences.sublime-settings') 
print (s.get('test')) # prints x 

Jeśli podzielić to na dwóch wtyczek będzie nadal drukować x (przy założeniu wtyczki ustawienia biegnie przed wtyczki drukowania).

Dzięki temu można załadować i ponownie zapisać niektóre ścieżki za pomocą os.path.expandvars, które będą trwałe dla bieżącej sesji.

Powiązane problemy