Używanie Emacsa jako IDE

Obecnie mój workflow z Emacsem podczas kodowania w C lub C++ obejmuje trzy okna. Największy z prawej zawiera plik, z którym pracuję. Lewa strona jest podzielona na dwie części, dolna jest powłoką, której używam do wpisywania poleceń kompilacji lub tworzenia, a górna często jest jakąś dokumentacją lub plikiem README, który chcę skonsultować podczas pracy. Teraz wiem, że są tam całkiem znawcy Emacsa i jestem ciekaw, jakie są inne funkcjonalności Emacsa przydatne, jeśli intencją jest użycie go jako kompletnego IDE. W szczególności, większość IDE zazwyczaj spełniają te funkcje jest jakaś forma lub inna:

  • edytor kodu źródłowego
  • kompilator
  • debugowanie
  • Wyszukiwanie Dokumentacji
  • Kontrola Wersji
  • oo funkcje takie jak class lookup i object inspector

Dla kilku z nich, to dość oczywiste, jak Emacs może pasować do tych funkcji, ale co z resztą? Również, jeśli konkretny język musi być skoncentrowany na, Powiedziałbym, że to powinno być C++.

Edit: Jeden użytkownik zauważył, że powinienem być bardziej dokładny, gdy powiedziałem "a co z resztą". Głównie byłem ciekaw sprawnej kontroli wersji, a także Wyszukiwania dokumentacji. Na przykład w SLIME dość łatwo jest wykonać szybkie wyszukiwanie hyperspec na funkcji Lispa. Czy jest jakiś szybki sposób na wyszukanie czegoś w dokumentacji C++ STL(jeśli zapomniałem dokładnej składni hash_map, na przykład)?

Author: Paulo Tomé, 2008-09-15

18 answers

Musisz sprecyzować, co rozumiesz przez "resztę". Poza object inspector (którego jestem świadomy), emacs robi to wszystko dość łatwo:

  • edytor (oczywisty)
  • kompilator-po prostu uruchom M-x compile i wprowadź komendę compile. Od tego momentu możesz po prostu M-x compile i używać domyślnego. Emacs wychwytuje błędy kompilatora C / C++ (najlepiej działa z GCC) i pomoże Ci przejść do wierszy z ostrzeżeniami lub błędami.
  • debugowanie-podobnie, gdy chcemy debugować, wpisz M-x gdb i utworzy bufor gdb ze specjalnymi powiązaniami
  • Documentation Lookup-emacs ma doskonałe powiązania CScope do nawigacji po kodzie. Dla innej dokumentacji: Emacs ma również czytnik stron podręcznika, a dla całej reszty jest internet i książki.
  • Kontrola wersji - istnieje wiele wiązań Emacsa dla różnych backendów VCS (CVs, SCCS, RCS, SVN, GIT)

Edit: zdaję sobie sprawę, że moja odpowiedź na temat wyszukiwania dokumentacji naprawdę dotyczyła kodu nawigacja. Oto kilka dodatkowych informacji:

Wyszukiwanie w Google bez wątpienia ujawni dalsze przykłady.

Jak pokazuje drugi link, wyszukiwanie funkcji (i innych) w innej dokumentacji może być wykonane, nawet jeśli nie są obsługiwane po wyjęciu z pudełka.

 76
Author: Ben Collins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-27 08:26:30

Muszę polecić przeglądarkę kodu Emacsa jako bardziej "tradycyjne" środowisko w stylu IDE dla Emacsa.

EDIT : teraz również polecamMagit wysoko nad standardowym interfejsem VCS w Emacsie.

 29
Author: baudtack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-30 23:07:10

Zamiast uruchamiać polecenie make w oknie powłoki, próbowałeś m-x skompilować? Spowoduje to uruchomienie polecenia make, wyświetla błędy i w wielu przypadkach bardzo ułatwia przejście do linii kodu, który spowodował błąd, jeśli wyjście zawiera nazwy plików i numery linii.

Jeśli jesteś fanem IDEs, możesz również zajrzeć do pakietu speedbar Emacsa (m-x speedbar). Jeśli jeszcze tego nie zrobiłeś, dowiedz się, jak używać tabel znaczników do nawigacji po kodzie.

 19
Author: Bryan Oakley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-27 13:35:19

Są zakątki Emacsa, które raz odkryte sprawiają, że jesteś bardziej produktywny w sposób, o którym nigdy nie myślałeś. Jak już wspomnieli inni, używanie tagów jest fantastycznym i szybkim sposobem na przybliżenie kodu źródłowego, a użycie M- / (dabbrev-expand) często robi dokładnie to, czego oczekujesz podczas wypełniania nazwy zmiennej.

Użycie occurent jest przydatne do uzyskania bufora ze wszystkimi wystąpieniami wyrażenia regularnego w buforze. Jest to bardzo przydatne podczas refaktoryzacji kodu i szukania fragmentów kodu lub użycia zmiennych, lub jeśli używasz znaczników TODO w swoich plikach źródłowych i chcesz odwiedzić je wszystkie.

Flush-lines, sort-numeric-fields, replace-regexp i rectangle functions mogą być naprawdę przydatne do pobierania zrzutu z jakiegoś narzędzia i konwersji go na przydatne dane, takie jak program elisp lub arkusz kalkulacyjny rozdzielany przecinkami.

Napisałem stronę O IDE jak to można zrobić z emacsem

Http://justinsboringpage.blogspot.com/2007/09/11-visual-studio-tricks-in-emacs.html

Nauka elisp to kolejny świetny sposób, aby odpowiedzieć sobie na pytanie, co jeszcze może zrobić emacs poza tym, co może zrobić typowe IDE.

Na przykład pisałem na blogu o pisaniu funkcji pomocniczych Perforce, takich jak blame (pisanie własnych oznacza, że możesz sprawić, że zachowa się dokładnie tak, jak ty want)...

Http://justinsboringpage.blogspot.com/2009/01/who-changed-line-your-working-on-last.html

Napisałem również kod, który dynamicznie tworzy komentarze dla funkcji w punkcie, który odpowiada standardom kodowania, z którymi pracuję.

Żaden z moich kodów nie jest szczególnie świetny, a większość z nich istnieje już w bibliotekach, ale bardzo przydatne jest, aby emacs robił niestandardowe rzeczy, które pojawiają się w ciągu dnia roboczego.

 15
Author: justinhj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-01 22:19:33

Szczegółowy opis integracji Emacsa i kontroli wersji znajdziesz na mojej stronie . Pracuję również nad artykułem o używaniu Emacsa jako środowiska programistycznego dla wielu języków-C / C++, Java, Perl, Lisp/Scheme, Erlang, itp...

 10
Author: Alex Ott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-04 08:50:05

Dla kontroli wersji, istnieje kilka rzeczy, które można użyć, w zależności od tego, jakiego systemu kontroli wersji używasz. Ale niektóre funkcje są wspólne dla wszystkich z nich.

vc.el jest wbudowanym sposobem obsługi kontroli wersji na poziomie pliku. Posiada backendy dla większości systemów kontroli wersji. Na przykład, backend Subversion jest dostarczany z Emacsem, a backend git i inne są dostępne z innych źródeł.

Najbardziej użytecznym poleceniem jest C-x v V (VC-next-action), która wykonuje odpowiednią następną akcję dla odwiedzanego pliku. Może to oznaczać aktualizację z repozytorium lub zatwierdzanie zmian, vc.el również rebinds C-x C-q , aby sprawdzić i wyłączyć pliki, jeśli używasz systemu, który tego potrzebuje (jak RCS).

Inne bardzo przydatne polecenia to C-x v l i C-x V =, które pokazują rejestr i bieżące różnice dla używanego pliku.

Ale dla rzeczywistej produktywności, należy unikać używania pojedynczego pliku vc.el komendy inne niż dla prostych rzeczy. Istnieje kilka pakietów, które mogą dać ci przegląd stanu całego drzewa i dać ci więcej mocy, nie wspominając o możliwości tworzenia spójnych commitów obejmujących kilka plików.

Większość z nich jest pod silnym wpływem lub oparta na oryginale pcl-CVs/pcvs dla CVS. Istnieją nawet dwa z nich, które są dostarczane z subversion, psvn.el i dsvn.el . Istnieją pakiety dla Gita itp.

 8
Author: dkagedal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 11:08:39

Dobra, wszyscy tutaj dają doskonałe wskazówki, aby emacs był świetnym IDE.

Ale każdy powinien pamiętać, że kiedy dostosujesz swój emacs z dużą ilością rozszerzeń (szczególnie z tymi do sprawdzania typu w locie, wyszukiwania definicji funkcji itp.), Twój emacs będzie ładował się bardzo, bardzo wolno dla edytora.

Aby to obejść, Gorąco polecam użycie Emacsa w server mode.

Jest dość prosty w użyciu, nie ma potrzeby dostosowywania pliku init. Musisz tylko Uruchom Emacsa w trybie demona;

emacs --daemon

Spowoduje to utworzenie serwera emacs, następnie można go podłączyć z terminala lub z gui. Polecam również utworzyć kilka aliasów, aby ułatwić połączenie.

alias ec="emacsclient -t"
alias ecc="emacsclient -c &"
# some people also prefer this but no need to fight here;
alias vi="emacsclient -t"
W ten sposób emacs odpali się jeszcze szybciej niż gedit, obiecuję.

Jedyny możliwy problem, jeśli używasz demona Emacsa od zwykłego użytkownika, prawdopodobnie nie możesz połączyć się z serwerem emacs jako root.

Więc, jeśli chcesz otworzyć plik, który ma roota access; zamiast tego użyj tramp. Po prostu uruchom klienta Emacsa ze swoim zwykłym użytkownikiem i otwórz takie pliki;

C-x C-f
/sudo:root@localhost/some/file/that/has/root/access/permissions
# on some linux distro it might be `/su:root@...` 

To ułatwiło mi życie, mogę w ten sposób otworzyć mój ciężki, dostosowany Python IDE w milisekundach. Możesz również dodać emacs -- daemon do uruchamiania systemu lub utworzyć plik pulpitu dla emacsclient. To zależy od Ciebie.

Więcej o Emacs daemon i Emacs client można znaleźć na wiki;

Http://www.emacswiki.org/emacs/EmacsAsDaemon

Http://www.emacswiki.org/emacs/EmacsClient

 8
Author: Muhammet Can,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-31 22:14:34

Zgadzam się, że powinieneś dowiedzieć się o kompilacji m-x (bind that I m-x next-error do krótkiej sekwencji klawiszy).

Dowiedz się o powiązaniach do kontroli wersji (np. vc-diff, VC-next-action, itd.)

Zajrzyj do rejestrów. Można zapamiętać nie tylko lokalizacje w buforach, ale także całe konfiguracje okien(C-x R w -- window-configuration-to-register).

 7
Author: HD.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 14:54:48

Punktem wyjścia (który może być nieoczywisty) do zbadania funkcji VC Emacsa jest M-x VC-next-action.

Wykonuje "następną logiczną operację kontroli wersji" na bieżącym pliku, w zależności od stanu pliku i zaplecza VC. Więc jeśli plik nie jest pod kontrolą wersji, rejestruje go, jeśli plik został zmieniony, zmiany są przesyłane itd.

Trochę trzeba się przyzwyczaić, ale uważam, że jest to bardzo przydatne.

Domyślne ustawienie klawiszy to C-x v v

 6
Author: Chopmo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 10:34:31

Jest TFS.el dla integracji Emacsa z Microsoft TFS. Działa z każdym TFS, w tym TFS, który działa Codeplex.com.

Podstawowe kroki konfiguracji:

  1. Miejsce tfs./ align = "left" /

  2. W Twoim .plik emacs:
    (require 'tfs)
    (setq tfs/tf-exe  "c:\\vs2008\\common7\\ide\\tf.exe")
    (setq tfs/login "/login:domain\\userid,password")
          -or-
    (setq tfs/login (getenv "TFSLOGIN"))  ;; if you have this set
    
  3. Również w Twoim .plik emacs, Ustaw lokalne lub globalne powiązania klawiszy dla poleceń tfs. Tak:
    (global-set-key  "\C-xvo" 'tfs/checkout)
    (global-set-key  "\C-xvi" 'tfs/checkin)
    (global-set-key  "\C-xvp" 'tfs/properties)
    (global-set-key  "\C-xvr" 'tfs/rename)
    (global-set-key  "\C-xvg" 'tfs/get)
    (global-set-key  "\C-xvh" 'tfs/history)
    (global-set-key  "\C-xvu" 'tfs/undo)
    (global-set-key  "\C-xvd" 'tfs/diff)
    (global-set-key  "\C-xv-" 'tfs/delete)
    (global-set-key  "\C-xv+" 'tfs/add)
    (global-set-key  "\C-xvs" 'tfs/status)
    (global-set-key  "\C-xva" 'tfs/annotate)
    (global-set-key  "\C-xvw" 'tfs/workitem)
    
 4
Author: Cheeso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-21 20:53:47

Compile, next-error I previous-error to bardzo ważne polecenia dla programowania C++ w Emacsie (działa również świetnie na wyjściu grepa). Ważne są również Etags, visit-tags-table I find-tag. zakończenie.el jest jednym z największych nieudanych hacków XX wieku i może przyspieszyć hakowanie C++ O rząd wielkości. I nie zapominajmy o ediff.

Jeszcze nie nauczyłem się używać kontroli wersji bez odwiedzania powłoki, ale teraz, gdy uruchamiam commity, o wiele więcej często (z Gitem) będę musiał.

 3
Author: jfm3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 05:58:58

Można również znaleźć tabbbar przydatne. Emuluje jedyne zachowanie, które przegapiłem, przechodząc z Eclipse do Emacsa. Związany z", "i"."aby przejść do poprzedniego i następnego paska kart, ponownie przełącza bufor przez Ctrl-x b cały czas.

Niestety wspomniana strona nie zawiera poprawnej wersji do pobrania. Większość wersji Ubuntu dostarcza je jednak w pakietach Emacs-goodies.

 3
Author: wr.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-10 15:38:43

Używam Emacsa na Windows. moduł compile jest ładny, ale chciałem, aby compile był mądrzejszy o linii poleceń compile, którą sugeruje. można użyć "zmiennych plików", aby określić compile-command, ale chciałem czegoś mądrzejszego. Więc napisałem małą funkcję, aby pomóc. Odgaduje polecenie kompilacji, które ma być użyte do podpowiedzi użytkownika podczas uruchamiania compile.

Funkcja guess szuka pliku vbproj, csproj lub sln, a jeśli zostanie znaleziona, sugeruje msbuild. Wtedy patrzy na nazwę pliku bufora i w zależności od tego sugeruje różne rzeczy. A .plik WXS oznacza, że jest to projekt WIX i prawdopodobnie chcesz zbudować MSI, więc logika zgadywania sugeruje polecenie nmake dla MSI. Jeśli jest to moduł Javascript, sugerujemy uruchomienie jslint-for-wsh.js to lint the .plik js. Jako alternatywę sugeruje nmake.

Kod, którego używam wygląda tak:

(defun cheeso-guess-compile-command ()
  "set `compile-command' intelligently depending on the
current buffer, or the contents of the current directory."
  (interactive)
  (set (make-local-variable 'compile-command)
       (cond
        ((or (file-expand-wildcards "*.csproj" t)
             (file-expand-wildcards "*.vcproj" t)
             (file-expand-wildcards "*.vbproj" t)
             (file-expand-wildcards "*.shfbproj" t)
             (file-expand-wildcards "*.sln" t))
         "msbuild ")

        ;; sometimes, not sure why, the buffer-file-name is
        ;; not set.  Can use it only if set.
        (buffer-file-name
         (let ((filename (file-name-nondirectory buffer-file-name)))
           (cond

            ;; editing a .wxs (WIX Soluition) file
            ((string-equal (substring buffer-file-name -4) ".wxs")
             (concat "nmake "
                     ;; (substring buffer-file-name 0 -4) ;; includes full path
                     (file-name-sans-extension filename)
                     ".msi" ))

            ;; a javascript file - run jslint
            ((string-equal (substring buffer-file-name -3) ".js")
             (concat (getenv "windir")
                     "\\system32\\cscript.exe c:\\users\\cheeso\\bin\\jslint-for-wsh.js "
                     filename))

            ;; something else - do a typical .exe build
            (t
             (concat "nmake "
                     (file-name-sans-extension filename)
                     ".exe")))))
        (t
         "nmake "))))


(defun cheeso-invoke-compile-interactively ()
  "fn to wrap the `compile' function.  This simply
checks to see if `compile-command' has been previously set, and
if not, invokes `cheeso-guess-compile-command' to set the value.
Then it invokes the `compile' function, interactively."
  (interactive)
  (cond
   ((not (boundp 'cheeso-local-compile-command-has-been-set))
    (cheeso-guess-compile-command)
    (set (make-local-variable 'cheeso-local-compile-command-has-been-set) t)))
  ;; local compile command has now been set
  (call-interactively 'compile))

;; in lieu of binding to `compile', bind to my monkeypatched function
(global-set-key "\C-x\C-e"  'cheeso-invoke-compile-interactively)

Próbowałem zrobić to jako "przed radą" dla funkcji kompilacji, ale nie mogłem jej uzyskać pracować w sposób satysfakcjonujący. Zdefiniowałem więc nową funkcję i powiązałem ją z tą samą kombinacją klawiszy, której używałem dla compile.


EDIT jest teraz " smarter-compile.el ", który posuwa tę ideę o krok dalej.

 3
Author: Cheeso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-06 17:50:50

Wiem, że to bardzo stary post. Ale to pytanie jest ważne dla początkujących emacs.

IMO najlepszym sposobem użycia Emacsa jako ide jest użycie protokołu language server protocol z emacsem. Wszystkie informacje o serwerach językowych można znaleźć na połączonej stronie internetowej.

Aby uzyskać szybką konfigurację, zachęcam do wejścia na tę stronę eglot . IMO eglot robi to całkiem dobrze. Dobrze integruje się z pakietami Auto completions, takimi jak firma. Zapewnia znaleźć odniesienia, i więcej.

Również dla debuggera, możesz potrzebować konkretnych debugerów dla określonych języków. Możesz używać gdb z poziomu Emacsa. Wystarczy wpisać M-x gdb .

Do kompilacji kodu najlepiej używać komend powłoki. Pracuję nad tym projektem eproj . Trochę to potrwa. Ale wszystko, co robi, to mapuje polecenie powłoki do typu projektu. I buduje Twój projekt poprzez shell. Robi to samo, aby wykonać polecenie. Mogę potrzebować pomocy przy realizacji tego projektu. Nie jest gotowy do użycia, ale jeśli wiesz trochę elisp można przejść przez kod.

Poza tym zawsze najlepiej jest użyć polecenia kompilacji Emacsa.

Dla kontroli wersji, nie widziałem jeszcze żadnego innego pakietu, który może pasować do mocy magit . Jest specyficzny dla Gita. Również dla Gita jest inny pakiet git-timemachine, który uważam za bardzo przydatny.

Wyszukiwanie obiektów i wyszukiwanie klas jest zapewniane przez protokół serwera językowego.

Drzewo projektów może być użyte do interfejsu ide like z treemacs.

Istnieje również biblioteka interakcji projektu o nazwie pocisk .

Do automatycznego uzupełniania uważam tryb firmy za bardzo przydatny.

Naprawdę Emacsa można zmusić do wszystkiego.
 3
Author: sidharth arya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-04 16:17:30

On documentation lookup: to zależy od Twojego języka programowania.

Biblioteki C i wywołania systemowe są zazwyczaj dokumentowane na stronach podręcznika ekranowego. Do tego możesz użyć M-x man. Niektóre rzeczy mogą być lepiej udokumentowane na stronach informacyjnych; użyj M-x info.

Dla samego elisp, użyj C-h f. W Pythonie użyj >>> help(<function, class, module>) w interpreterze.

Uważam, że większość innych języków oferuje dokumentację w formie html. W tym celu wypróbuj wbudowaną przeglądarkę (używam w3m). Ustaw zmienną środowiskową BROWSER na skrypt wrappera wokół emacsclient -e "(w3m-goto-url-new-session \"$@\")" (na * nix), na wypadek gdyby coś mogło otworzyć przeglądarkę i chcesz ją otworzyć wewnątrz Emacsa.

 2
Author: Jonas Kölker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-27 12:21:39

W ostatnich latach Clang stał się ważną częścią obsługi Emacs C++. Atila Neves miał wykład na CppCon 2015: "Emacs jako C++ IDE"

Jest to 16-minutowa rozmowa, w której pokazuje rozwiązania dla następujących tematów:

  • przejdź do definicji
  • Automatyczne uzupełnianie
  • podświetlanie składni w locie
  • Znajdź plik w projekcie

Slajdy można znaleźć tutaj.

 1
Author: Philipp Claßen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-15 14:50:05

W stylu Unix lub X windows, nie wiem, czy istnieje zintegrowane IDE, które działa na wszystko.

Do interakcji z debuggerami, tylko jeden składnik IDE, rozważ realgud. Inną rzeczą, którą uważam za przydatną, są parsery dla komunikatów o lokalizacji, więc jeśli masz ślad stosu połączeń i chcesz edytować w określonym miejscu w pakiecie połączeń, ten interfejs front-end może to zrobić.

Zdecydowanie ten program przydałby się do poprawy. Ale wtedy to może również wykorzystać ludzi pracujących nad tym, aby go ulepszyć.

Zastrzeżenie: pracuję na realgud

 0
Author: rocky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-07 15:29:44

Spróbuj lsp-mode. Teraz możesz korzystać z innych funkcji IDE wewnątrz Emacs łączących się z serwerem. Poszukaj więcej informacji: LSP-mode

 0
Author: acakojic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-25 14:05:30