Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [Solved][Bash] Gedit externe hulpprogramma's  (gelezen 1355 keer)

Offline KeesDN

  • Lid
[Solved][Bash] Gedit externe hulpprogramma's
« Gepost op: 2011/11/04, 00:03:47 »
Hallo allemaal,

Bij Gedit wil ik een "extern hulpprogramma" maken, dat enkele dingen automatisch doet.

Vraag: Ik wil de hele regel gebruiken waar de cursor staat (GEDIT_CURRENT_LINE), en ik wil zoeken naar '.txt' en '.jpg'. Hoe krijg ik dan de hele naam van het bestand uit die regel ?

Voorbeeld: Stel dat ik een zin heb: "In het bestand test.txt staat de informatie". Dan zet ik mijn cursor op die regel; ik druk op een sneltoets; en "test.txt" wordt geopend vanuit de standaard map.

Later wil ik nog meer toevoegen om automatisch te doen.
Daarom heb ik niet heel mijn script bij Gedit neergezet, maar in mijn Documenten-map.
Dus bij Gedit roep ik dat script aan:
#!/bin/sh
# Zet 'Invoer' op niets, anders werkt het niet.
bash "/home/kees/Documenten/mijn-gedit-script.bash"

En dat script is dit:
#!/usr/bin/env bash
echo $GEDIT_SELECTED_TEXT
echo $GEDIT_CURRENT_WORD
echo $GEDIT_CURRENT_LINE
# Op dit moment alleen het openen van een document door precies die naam te selecteren.
gedit "/home/kees/Documenten/$GEDIT_SELECTED_TEXT"

Maar nu nog automatisch als ik alleen de cursor op die regel zet.
Ik heb al geprobeerd met 'read', 'gawk', bash string manipulation, etc. maar het lukt me niet.

« Laatst bewerkt op: 2011/11/04, 10:21:44 door KeesDN »

Offline KeesDN

  • Lid
Re: [Solved][Bash] Gedit externe hulpprogramma's
« Reactie #1 Gepost op: 2011/11/04, 10:40:59 »
Het werken met een apart script-bestand is best handig. Ik wijzig dit in Gedit, terwijl ik het meteen in Gedit kan testen.

Intussen heb ik zelf een oplossing gevonden.
Het volgende werkt ook als er meerdere bestanden genoemd worden op een regel.
Alle haken en ogen heb ik als commentaar vermeld.

#!/usr/bin/env bash
# Bestand: mijn-gedit-script.bash

# De 'IFS' zetten op meerdere tekens, om de losse woorden goed te onderscheiden.
# Deze tekens mogen niet in de bestandsnaam voorkomen.
# De '*' mag niet in de IFS, want die gebruik ik als wildcard om te testen bij 'if'.
# De '.' mag niet in de IFS, want die maakt onderdeel uit van de bestandsnaam.
IFS="\"' (){}=\\/|<>#!^:"

for SUBSTRING in $GEDIT_CURRENT_LINE
do
  # er mogen geen aanhalingstekens om *.[Tt][Xx][Tt]
  if [[ "$SUBSTRING" == *.[Tt][Xx][Tt] ]]       
  then
    FILENAME="/home/kees/Documenten/$SUBSTRING"
    # test of het bestand bestaat.
    if [ -f "$FILENAME" ]
    then
      gedit "$FILENAME"
    fi
  fi;
  # er mogen geen aanhalingstekens om *.[Jj][Pp][Gg]
  if [[ "$SUBSTRING" == *.[Jj][Pp][Gg] ]]       
  then
    FILENAME="/home/kees/Foto/$SUBSTRING"
    # test of het bestand bestaat.
    if [ -f "$FILENAME" ]
    then
      eog "$FILENAME"
    fi
  fi;
done

Misschien moet er nog een extra test bij, want er kan een punt na de bestandsnaam staan.
Dus als iemand nog tips of verbeteringen weet, dan hoor ik het graag.

Re: [Solved][Bash] Gedit externe hulpprogramma's
« Reactie #2 Gepost op: 2011/11/04, 20:16:13 »
Je kan dat hele gedoe met een regeltje perl doen:

echo "$GEDIT_CURRENT_LINE" | perl -ne 'm/([[:alnum:]]+\.(jpg|txt))/i;print "$1\n"'
« Laatst bewerkt op: 2011/11/04, 20:22:51 door SeySayux »
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline KeesDN

  • Lid
Re: [Solved][Bash] Gedit externe hulpprogramma's
« Reactie #3 Gepost op: 2011/11/05, 00:05:17 »
Je kan dat hele gedoe met een regeltje perl doen:
echo "$GEDIT_CURRENT_LINE" | perl -ne 'm/([[:alnum:]]+\.(jpg|txt))/i;print "$1\n"'

Bedankt voor de tip.
Ik begrijp perl nog niet zo goed, maar ik probeerde het even in een terminal-venster en het werkt goed.

Re: [Solved][Bash] Gedit externe hulpprogramma's
« Reactie #4 Gepost op: 2011/11/05, 09:15:34 »
-ne
Lees STDIN regeltje per regeltje, evalueer daarmee volgende uitdrukking:

m//i
Zoek naar (match), hoofdletter ongevoelig (case insensitive)

(...)
Eerste match, kan later aangesproken worden door $1

[[:alnum:]]
Letter of cijfer (alfanumeriek karakter) ...

+
Ten minste één...

\.
Gevolgd door een punt...

(jpg|txt)
Gevolgd door "jpg" of "txt"

print "$1\n"
Druk de eerste match af, gevolgd door een newline
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline KeesDN

  • Lid
Re: [Solved][Bash] Gedit externe hulpprogramma's
« Reactie #5 Gepost op: 2011/11/05, 10:42:08 »
Dankjewel.

Intussen heb ik het uitgebreid en worden ook *.odt in libreoffice geopend, en url's worden in firefox geopend, en een emailadres wordt in thunderbird geopend.
De error output van eog moest naar /dev/null want anders kwam die onderin gedit in het output-venster.

Dus ik heb zo ongeveer wat ik wil. Ik hoef veel minder de muis te gebruiken en dat is voor mij een heel stuk gemakkelijker.

Re: [Solved][Bash] Gedit externe hulpprogramma's
« Reactie #6 Gepost op: 2011/11/05, 18:51:28 »
Als je een willekeurig bestand zou je ieder bestand kunnen openen met "gnome-open". Deze opent dan voor jou automatisch het goede programma, afhankelijk van de instellingen die je in Gnome (Nautilus) hebt. cd in de terminal maar eens naar een willekeurige map, en "gnome-open naamvanbestand.type", en het goede programma opent automatisch...

Offline KeesDN

  • Lid
Re: [Solved][Bash] Gedit externe hulpprogramma's
« Reactie #7 Gepost op: 2011/11/05, 20:00:20 »
Weer wat geleerd. Dank!
Ik kan het niet overal gebruiken, want ik moet ook kijken welke standaard-map er bij hoort (Documenten of Foto etc.).
Bij een plaatje roept 'gnome-open' gewoon 'eog' aan, en moet ik dus dezelfde foutmeldingen wegwerken:
gnome-open "$BESTAND" 2>/dev/null

Re: [Solved][Bash] Gedit externe hulpprogramma's
« Reactie #8 Gepost op: 2011/11/05, 20:39:02 »
Misschien zou je het nog aan "locate" kunnen koppelen, dat je iets doet in de trant vanlocate "$BESTAND" | grep "$HOME" | head --lines=1 | xargs gnome-open 2>/dev/null
Of iets met "find" zou ook nog kunnen...

Edit: Verduidelijking: Dan ben je niet meer afhankelijk van die mapjes, en kun je ieder bestand openen... Tussen locate en find is denk ik vooral een kwestie van prestaties, en locate wil nog wel eens een bestand niet vinden als het nieuw is...
« Laatst bewerkt op: 2011/11/05, 20:44:26 door overdenkamp »