Come aprire una nuova scheda Terminale nella directory di lavoro corrente?


6

Voglio creare ed eseguire una funzione bash che:

  1. cd nella directory di un progetto
  2. Apri una nuova scheda in Terminale nella stessa directory
  3. Apri i miei strumenti di sviluppo e avvia i servizi di sviluppo

L'articolo 2 non funziona come previsto, la nuova scheda non cambia directory.

Ecco lo script (entrambe le funzioni che risiedono nel mio file .bashrc :

# Open a new tab (needs a path as an argument)
new_terminal_tab(){
    osascript -e "tell application \"Terminal\"" \
                        -e "tell application \"System Events\" to keystroke \"t\" using {command down}" \
                        -e "do script \"cd $1; clear;\" in front window" \
                        -e "end tell"
                        > /dev/null
}

# Set up workspace
affiliatesForm(){
    # cd into the project's directory
    cd /Users/iamuser/Documents/path/to/project\ file
    # Get the working directory
    pwd=`pwd`

    # Open a new tab in Terminal and cd into project's directory
    # The idea is to have a tab with Rails server output, and another tab in the project's directory
    new_terminal_tab $pwd

    # Open the project in Sublime Text 2
    subl $pwd

    # Start the Rails server
    rails server
}

Che cosa sto facendo di sbagliato? Cosa sta facendo questo codice che non conosco?


Aggiornare

Il percorso per la directory a cui sto tentando di accedere contiene degli spazi. Ma fuggire dallo spazio non aiuta affatto. Lo script funziona con percorsi che non includono spazi.

Risposte:


10

L'apertura di una nuova scheda in Terminale dovrebbe per impostazione predefinita conservare la directory corrente. In caso contrario, potresti aver rotto il $PROMPT_COMMAND.

Ricorda inoltre di non sostituire il valore precedente se intendi aggiungere un comportamento personalizzato aggiungendolo ; $PROMPT_COMMANDalla fine.

PROMPT_COMMAND="my_custom_function; $PROMPT_COMMAND"

Per riferimento, ecco l'impostazione predefinita da /etc/bashrc(OS X 10.9):

# Tell the terminal about the working directory at each prompt.
if [ "$TERM_PROGRAM" == "Apple_Terminal" ] && [ -z "$INSIDE_EMACS" ]; then
    update_terminal_cwd() {
        # Identify the directory using a "file:" scheme URL,
        # including the host name to disambiguate local vs.
        # remote connections. Percent-escape spaces.
        local SEARCH=' '
        local REPLACE='%20'
        local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}"
        printf '\e]7;%s\a' "$PWD_URL"
    }
    PROMPT_COMMAND="update_terminal_cwd; $PROMPT_COMMAND"
fi

$ PROMPT_COMMAND non è rotto. Altri suggerimenti?
sargas,

5

So che questa domanda è un po 'datata ma ho appena trovato una risposta che sarebbe utile per gli utenti iTerm2 su Mac OS X.

Sotto la "scheda profilo" nelle preferenze iTerm2 puoi impostare esattamente dove iterm apre nuove schede sotto l'intestazione "Directory di lavoro"

preferenze iterm

Dopodiché, chiudi e riavvia iTerm e dovresti essere pronto!


Questo è esattamente quello che voglio. Tanks;)
saman

1

Quindi, come è stato menzionato, la mia sceneggiatura ha funzionato con percorsi che non includevano spazi. Si scopre che la soluzione sta nel racchiudere la variabile (all'interno new_terminal_tab()) tra virgolette singole in questo modo:

-e "do script \"cd '$1'; clear;\" in front window" \

Incredibile cosa possono fare le citazioni, vero?


0

Il servizio fornito qui funziona per me. Apre una nuova scheda Terminale nella cartella da cui ho eseguito il servizio.

Ho riscontrato il problema che quando avevo già una finestra Terminale aperta ne avrebbe aperta una nuova. L'ho risolto come segue:

on run {input, parameters}
    repeat with this_item in input
        set the_path to POSIX path of this_item
        repeat until the_path ends with "/"
            set the_path to text 1 thru -2 of the_path
        end repeat

        set numberOfWindows to "0"

        tell application "Terminal"
            activate
            set numberOfWindows to (numberOfWindows + (count windows))
            if numberOfWindows is 0 then
                do script with command "cd " & quoted form of the_path
                activate
            else
                activate
                delay (0.3)
                tell application "System Events"
                    keystroke "t" using command down
                end tell
                do script with command "cd " & quoted form of the_path in window 0
            end if

        end tell
    end repeat
    return input
end run

Tutto il merito di questo codice va a Jeroen Leenarts . Ho appena apportato alcune piccole modifiche.


questa è una sceneggiatura interessante. Ma la mia idea è quella di digitare un comando in Terminal e aprire le mie applicazioni, nonché le due schede in Terminal, una per Rails Server, un'altra nella directory in cui risiede il progetto.
sargas,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.