Jak nastavit Nette\Debug, aby otevíral soubory ve vašem editoru
- David Grudl
- Nette Core | 8215
Při zobrazení chybové stránky lze kliknout na jména souborů a ty se otevřou ve vašem editoru s kurzorem na příslušné řádce. Aby se tak stalo, je potřeba prohlížeč a systém nakonfigurovat. Návod je může lišit pro různé editory, prohlížeče, operační systémy. Jeho průběžně rozšiřovanou verzi najdete na wiki.
(Platí pro aktuální verzi Nette Framework 2.0)
- _Martin_
- Generous Backer | 679
@David Grudl: Pro PSPad funguje (edit: nefunguje to z PHP,
ač z příkazové řádky ano – zkusím zjistit, proč):
define('EDITOR', '"C:\Program Files\PSPad editor\PSPad.exe" -%line "%file"');
kde %line
by mělo být číslo (třeba 1 pro první řádek
nebo 0 – pak nebude zlobit samotná pomlčka v příkazu).
@redhead: Jo, háček je v tom, že přes tento handler můžeš předávat pouze jeden parametr – a tím je celé URL. Proto je třeba nějakého „spouštěče“, který to URL rozseká na správné parametry a předá je zvolenému editoru.
Editoval _Martin_ (29. 9. 2010 12:14)
- David Grudl
- Nette Core | 8215
To je zvláštní… Zkus si zapsat do souboru, co skutečně ten exec() spouští, jestli tam není nějaká chyba.
- _Martin_
- Generous Backer | 679
OK, po hodině hraní jsme objevil jádro pudla i jeho řešení. PHP na
Windows volá příkazy pomocí
cmd.exe /c <příkaz>
. Problém je, že se volání editoru
převede na něco takového:
cmd.exe /c "C:\Program Files\PSPad editor\PSPad.exe" -10 "D:\www\test test\readme.txt"
ale správně by mělo být
cmd.exe /c ""C:\Program Files\PSPad editor\PSPad.exe" -10 "D:\www\test test\readme.txt""
Řešením je změnit spouštěcí řádek na
exec('"' . strtr(EDITOR, $replaces) . '"');
Ovšem pokud bychom chtěli, aby PHP skript nečekal na ukončení editoru, můžeme udělat následující:
$cmd = strtr(EDITOR, $replaces);
if (substr(php_uname('s'), 0, 7) == 'Windows') {
pclose(popen('start /B "" ' . $cmd, 'r')); // "" = prázdný titulek (jinak by se za titulek dosazovala aplikace)
} else {
exec($cmd . ' > /dev/null &'); // tohle je třeba otestovat Linuxáky
}
Zajímavé, že v NetBeansech na Win 7 to funguje (jak píše grey) – stálo by za to zjistit, jak jsou volány příkazy tam.
- pekelnik
- Člen | 462
Návod na editor:// pro KDE 4
Není třeba upravovat výchozí hodnotu
NetteDebug::$editor
.
1. Vytvořte handler protokolu editor://
Do souboru ~/bin/editor.sh
vložte
pro Netbeans:
#!/bin/bash
echo "$1" | eval `sed "s/%2F/\//g" | sed -n "s/^.*open\/?file=\(.*\)\&line=\(.*\)/\/home\/<username>\/apps/netbeans\/bin\/netbeans \1:\2/p"`
pozor na úplnou cestu k Netbeans.
nebo pro Kate:
#!/bin/bash
echo "$1" | eval `sed "s/%2F/\//g" | sed -n "s/^.*open\/?file=\(.*\)\&line=\(.*\)/\/usr\/bin\/kate --line \2 \1/p"`
a učiňte jej spustitelným
chmod +x ~/bin/editor.sh
2. Zaregistrujte handler protokolu editor://
Do souboru
/usr/share/kde4/services/editor.protocol
vložte
[Protocol]
exec=/home/<username>/bin/editor.sh "%u"
protocol=editor
input=none
output=none
helper=true
listing=
reading=false
writing=false
makedir=false
deleting=false
opět pozor na kompletní cestu…
@univerz děkuji za pomoc s bash skriptem :)
Odezva tohohle řešení je drobet lepší než pomocí toho php skriptu.
Troubleshooting:
- Pokud vám to hned nepůjde nepanikařte. Povypínejte prohlížeče. A zkuste párkrát refreshnout stránku před klikem na onen odkaz. Rozjede se to!
Known issues:
- editor se při aktivaci „nepřenese do popředí“
- v task manageru se mi objeví taková ta pičičmunda – že se něco spouští a hned zase zmizí
Co dál:
- Doplnit co nejvíce formátů příkazu pro různé editory
Co se nám nepovedlo:
- Nepovedlo se nám vytvořit „oneliner“ verzi příkazu, který by šel zadat přímo do toho konfiguráku KDE – tak aby nebyl potřeba ten skript editor. Escapování je tam nějaký hodně divoký – mizí lomítka atd.
Editoval pekelnik (30. 9. 2010 20:00)
- o5
- Člen | 416
Návod na „editor://“ pro GNOME
Je to podobny postup jako na KDE, jen s tim rozdilem ze se v Gnome jinak registruje protokol.
Netbeans
1. Vytvořte handler protokolu editor
(ten bash poslany od @pekelnik mi nefungoval, takze jsem to trochu posteloval (thx @fabiancz) :) )
/home/<user>/bin/editor.sh
#!/bin/bash
echo $1 | eval `sed "s#%2F#/#g" | sed -n "s#.*file=\(.*\)\&line=\(\d*\)#/home/<user>/netbeans-6.9.1/bin/netbeans \1\:\2#p"`
2. Zaregistrujte protokol editor
gconftool-2 -s /desktop/gnome/url-handlers/editor/command --type String '/home/<user>/bin/editor.sh %s'
gconftool-2 -s /desktop/gnome/url-handlers/editor/enabled --type Boolean true
Vim
1. Vytvořte handler protokolu editor
/home/<user>/bin/editor.sh
#!/bin/bash
echo $1 | eval `sed "s#%2F#/#g" | sed -n "s#.*file=\(.*\)\&line=\(\d*\)#vim \1\ +\2#p"`
2. Zaregistrujte protokol editor
gconftool-2 -s /desktop/gnome/url-handlers/editor/command --type String '/home/<user>/bin/editor.sh %s'
gconftool-2 -s /desktop/gnome/url-handlers/editor/enabled --type Boolean true
gconftool-2 -s /desktop/gnome/url-handlers/editor/needs_terminal --type Boolean true
PS: Netreba zadneho restartu ;)
EDIT: upraveno escapovani (viz @voda)
Editoval o5 (1. 10. 2010 12:22)
- voda
- Člen | 561
pekelnik napsal(a):
Do souboru~/bin/editor.sh
vložte
pro Netbeans:
U sedu lze použít jako oddělovač snad jakýkoliv znak, takže není potřeba používat lomítko a pak není potřeba ty ostatní escapovat.
#!/bin/bash
echo "$1" | eval `sed "s#%2F#/#g" | sed -n "s#^.*open/?file=\(.*\)\&line=\(.*\)#/home/<username>/apps/netbeans/bin/netbeans \1:\2#p"`
pozor na úplnou cestu k Netbeans.
Pokud budou Netbeans v $PATH
, pak ani není potřeba zadávat
úplnou cestu.
- pekelnik
- Člen | 462
@voda díky za poznámky :)
Jak přidat manuálně nainstalované Netbeans do $PATH?
Vytvořte si symlink binárky netbeans
v adresáři
~/bin
Potom lze použít zkrácenou verzi skriptu editor.sh
#!/bin/bash
echo "$1" | eval `sed "s#%2F#/#g" | sed -n "s#^.*open/?file=\(.*\)\&line=\(.*\)#netbeans \1:\2#p"`
Editoval pekelnik (1. 10. 2010 16:08)
- voda
- Člen | 561
pekelnik napsal(a):
@voda díky za poznámky :)
není zač :)
Jak přidat manuálně nainstalované Netbeans do $PATH?
Já třeba mám symlinky na různé skripty a aplikace v
~/.bin
:
$ ls -l .bin/netbeans
lrwxrwxrwx 1 ondra ondra 38 8. zář 20.00 .bin/netbeans -> /usr/local/netbeans-6.9.1/bin/netbeans
a v /etc/profile
# set PATH so it includes user's private bin if it exists
if [ -d ~/.bin ] ; then
PATH="~/.bin:${PATH}"
fi
- _Martin_
- Generous Backer | 679
@pekelnik: Škoda, že jsi skript pro Windows neupravil podle mých poznámek – mám je do té stránky doplnit?
@windowsáři: Můžete vyzkoušet chování na různých verzích Windows, viz. můj příspěvek?
- redhead
- Člen | 1313
Batch soubor (bez použití php.exe!)
Opravdu se mi nelíbí současný způsob jakým se otevírají editory přes php.exe, takže jsem se pokusil vyrobit jednoduchý batch soubor, který to zvládne bez toho. Výhodou by měla být asi větší rychlost.
run-editor.bat
:: This batch file parses URL for file name and line
:: and opens the desired editor
:: @author Radek Ježdík (redhead)
@echo off
SetLocal EnableDelayedExpansion
FOR /f "tokens=3,5 delims=?&=" %%a in (%1) DO SET file=%%a&SET line=%%b
SET file=!file:%%20= !
SET file=!file:%%3a=:!
SET file=!file:%%5c=\!
SET file=!file:%%2f=/!
SET file=!file:%%40=@!
SET file=!file:%%2c=,!
SET file=!file:%%5b=[!
SET file=!file:%%5d=]!
SET file=!file:%%28=(!
SET file=!file:%%29=)!
SET file=!file:+= !
:: NetBeans
SET editor="C:\Program Files\NetBeans 6.9.1\bin\netbeans.exe" "%file%:%line%" --console suppress
:: PHPEd
:: SET editor="C:\Program Files\NuSphere\PhpED\phped.exe" "%file%"
:: Scite
:: SET editor="C:\Program Files\SciTE\scite.exe" "-open:%file%" -goto:%line%
:: EmEditor
:: SET editor="C:\Program Files\EmEditor\EmEditor.exe" "%file%" /l %line%
:: PSPad Editor
:: SET editor="C:\Program Files\PSPad editor\PSPad.exe" -%line% "%file%"
:: Run editor (intentionally "" - first quotation marks mean title)
start /B "" %editor%
S tím, že registry budou takéto (vytvořte a spusťte soubor editor.reg):
REGEDIT4
[HKEY_CLASSES_ROOT\editor]
@="URL:editor Protocol"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\editor\shell\open\command]
; na tomto místě zadejte skutečnou cestu k batch souboru
; nezapomeňte používat dvojitá lomítka
@="\"C:\\Cesta\\k\\run-editor.bat\" \"%1\""
PS: nějak moc sem nezkoumal jaké všechny znaky se escapují pro URL encoding a které jsou platné pro cesty a názvy ve Windows, ale mělo by být jednoduché si je tam případně přidat.
Editoval redhead (2. 10. 2010 18:08)
- pekelnik
- Člen | 462
@martin: Verzi s .batem pro Windows jsem chtěl zapracovat ale zdálo se mi že jsou s tím nějaké problémy… viz předchozí diskuse
@redhead: toto je konečné řešení .batu na win? Zapracuji tvůj příspěvek do toho howto na wiki… myslíte že by to mělo být jako defaultní možnost pro win? Asi ano. Není nad nativní řešení :D
a verzi s PHP souborem upozadit? Jediný kdo ji použije bude člověk na macu bez textmate :D – na macu nejsou nějaké bashe nebo baty?
Editoval pekelnik (2. 10. 2010 15:13)
- _Martin_
- Generous Backer | 679
@redhead: Dovolil jsem si tvůj dávkový soubor
trochu upravit: doplnil jsem chybějící znaky % u EmEditoru a
přidal spouštění programů přes příkaz start
, aby na pozadí
„neviselo“ černé okno konzoly do doby, než editor ukončíš.
Každopádně dobrá práce, ani jsem netušil, že se i s Windowsí konzolí
dá trochu víc čarovat=)
- redhead
- Člen | 1313
@_Martin_: áá pravda, ty procenta jsem nějak přeskočil, opravím. Co se týčeho toho START někde jsem četl, že je to to samé jako bez. Ale pravda, nevím to na 100%. Jinak co se týče konzole ta se mi snad ani neotevřela, když jsem to zkoušel přes prohlížeč (nebo to byl takový mžik; měl jsem editor už otevřený)
Editoval redhead (2. 10. 2010 17:38)
- jasir
- Člen | 746
Edit: PhpEd má direktivu –line, zbytek je tohoto příspěvku je tedy zastaralý/zbytečný.
Zaje..ný PhpEd neumí skočit na řádku. Už dlouho používám tuto haluz, aby mi na řádku skočil:
phped-run.vbs:
Set arg = WScript.Arguments
file = arg(0)
line = arg(1)
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "c:\php\phped\phped.exe " & file, 9
WScript.Sleep 700
WshShell.SendKeys "^g"
WScript.Sleep 200
WshShell.SendKeys line
WshShell.SendKeys "{ENTER}"
Je to shit, ale lepší než nic. Funguje.
Editoval jasir (10. 10. 2010 17:46)
- _Martin_
- Generous Backer | 679
@redhead: Upravil jsem to přímo na wiki, jestli si to chceš zkopírovat do svého příspěvku, můžeš od tama=)
Pokud ti editor už běžel, tak okno pouze problikne (nevím přesně, jak
se v tomto Windows chovají, ale nejspíš se nově spuštěná instance přes
nějaká API/… domluví s tou, co už běží, a pak se sama ukončí).
Kdybys editor otevřený neměl, tak by okno s konzolí zůstalo otevřené do
doby, než bys editor vypnul. Proto ten příkaz start
.
Jinak, zkoušel jsem to (NetBeans a PSPad) a chování naprosto stejné.
Editoval _Martin_ (2. 10. 2010 18:03)
- Mikulas Dite
- Člen | 756
Podařilo se někomu zaregistrovat protokol pro Mac? Nejenom systém, ale navíc i Chrome mi zatím vzdoruje… Upravit protokoly v systému jde (třeba pomocí RCDefaultApp, nejdou snadno tvořit nové), ale ty poté nejdou nabindovat na soubory a to dokonce ani na shell/C prostředníky!
EDIT: Textmate funguje krásně, ale ostatní editory (NetBeans) svůj vlastní protokol nemají, ani nerozumí url parametrům.
Editoval Mikulas Dite (4. 10. 2010 17:54)
- David Grudl
- Nette Core | 8215
Internet Explorer 8 vzdoruje, není schopen spustit baťák, pokud jsou v protokolu nějaké uvozovky. Jenže bez uvozovek zase nelze předat parameter v původní podobě. Povedlo se to někomu rozchodit s IE?
- redhead
- Člen | 1313
Nebo mě ještě napadlo ten vykřičník dát do nové proměnné a tu mít jako replacement (opět nezkoušel jsem):
SET vykricnik=! (mozna i tohle bude chtit escapovat, zkus obojí..)
SET file=!file:%%21=%vykricnik!
//nebo
SET file=!file:%%21=%vykricnik%!
//uz si tu syntaxi zas nepamatuju, jak se nahrazuje promenna..
Zkus nějaký kombinace. UŽ se v tom ani sám nevyznám. To je taky jazyk ten batch, omg..
Editoval redhead (10. 10. 2010 12:21)
- Lopo
- Člen | 277
dnes som nasiel tento FF plugin:
http://dafizilla.sourceforge.net/viewsourcewith/
ak je tu niekto zdatny v oblasti tvorby FF pluginov, tak by sa mozno dal vyuzit na tvorbu klonu schopneho obsluhovat editor:// protokol a tym padom schopnost otvorit dane subory viacmenej asi v lubovolnom editore
- Mikulas Dite
- Člen | 756
@redhead, @gmvasek Vykřičník se escapuje pomocí
^^!
. http://www.computing.net/…g/18239.html
- Mikulas Dite
- Člen | 756
MacOS
Pro Mac jsem dal dohromady vlastní ProtocolHandler. Muselo to být napsané v AppleScriptu, přes shell se protokoly zaregistrovat nedají.
AppleScript se ukládá jako binárka (takže verzování nic moc),
každopádně se dá v pohodě editovat pomocí
AppleScript Editor
. Zatím jsem nudělal žádné GUI a nastavení
(jde to vůbec přímo v AS?) Verzi pro NetBeans 6.9 ve složce
/Applications/NetBeans 6.9.app/
můžete pullnout z
https://github.com/…tocolHandler
Edit: Aplikaci stačí kamkoliv uložit a poté ji jednou spustit, aby se
protokol zaregistroval. Každé další otevření protokolu edit
zavolá aplikaci samo. Registrace protokolu vydrží restart, takže není
potřeba handler pouštět v startupu.
Editoval Mikulas Dite (11. 5. 2011 19:39)
- sinacek
- Člen | 23
Mikulas Dite napsal(a):
…
https://github.com/…tocolHandler
adresa se zmenila na https://github.com/…tocolHandler kdyby ji nekdo hledal…
- mkoula
- Backer | 57
#38
když jsem si to otevřel v tom editoru tak vidím řádky:
<script>
ignoring application responses
tell application "NetBeans 7.0 Beta 2" to activate
do shell script "/Applications/NetBeans\\ 6.9.app/Contents/MacOS/netbeans \"" & target_file & ":" & target_line & "\""
tell application "NetBeans 7.0 Beta 2" to activate
end ignoring
</script>
ale nejsou mi moc jasné.. co tam dělá ta 7? Jde to i pro ní? Proč je tam 2x? Případně mě to vede k myšlence jestli byste někdo nevěděli jak to přepsat na phpStorm? Cesta by se změnila asi na:
<script>
"/Applications/PhpStorm\\ 2.1.app/Contents/MacOS/idea \"
</script>
ale phpStorm/idea zadávají spouštění souboru ve formátu:
<script>
/cesta_k_idea --line cislo soubor.php
</script>
Cesta je viz výše, ale jak přepsat ten –line cislo a soubro v actionscriptu asi někdo netušíte…
Krom toho já používám i NetBeans a napadlo mě jestli by se to nějak nedalo napsat na edvě verze? Třeba místo editor udělat netbeans:// a idea:// či tak něco?
- gawan
- Člen | 110
@kravčo tak dík, to mi pomohlo ;-)
ja som ten protokol asocioval podľa návodu, aspoň si to myslím.
Spustil som:
<?php
gconftool-2 -s /desktop/gnome/url-handlers/editor/command --type String '/home/marek/bin/run-editor.sh %s'
gconftool-2 -s /desktop/gnome/url-handlers/editor/enabled --type Boolean true
?>
a napriek tomu to nefunguje, takže skúsim otázku ešte raz presnejšie: funguje niekomu toto asociovanie protokolu na editor v ubuntu natty? mne nie…
Editoval gawan (30. 6. 2011 11:49)
- kluvi
- Člen | 5
Nějak mě to nechce fungovat (Win7,Netbeans).
Po kliknutí na editor:// se sice pustí open-editor.js ale vyhodí tuhle
chybovou hlášku: http://kluvi.com/bb/chyba.PNG (chyba je na řádku
s shell.exec)
Když si vypíšu ten příkaz co se pouští tak vypadá takhle: http://kluvi.com/bb/prikaz.PNG
Tady je můj open-editor.js (cesta k netbeansům sedí):
var editor = '""C:\\Program Files\\NetBeans 7.0\\bin\\netbeans.exe"" "%file%:%line%" --console suppress';
var url = WScript.Arguments(0);
var match = /^editor:\/\/open\/\?file=(.+)&line=(\d+)$/.exec(url);
if (match) {
var file = decodeURIComponent(match[1]).replace(/\+/g, ' ');
var command = editor.replace(/%line%/g, match[2]).replace(/%file%/g, file);
var shell = new ActiveXObject("WScript.Shell");
var command2 = command.replace(/\\/g, '\\\\');
WScript.Echo(command2);
shell.Exec(command2);
}
- mishak
- Člen | 94
kluvi napsal(a):
Nějak mě to nechce fungovat (Win7,Netbeans).
var editor = '""C:\\Program Files\\NetBeans 7.0\\bin\\netbeans.exe"" "%file%:%line%" --console suppress';
Zkus
var editor = '"C:\\Program Files (x86)\\NetBeans 7.0\\bin\\netbeans.exe" "%file%:%line%" --console suppress';