OSX UI emacs, git commit/rebase opens empty buffer - macos

I am using UI emacs on OSX installed through homebrew. I have emacs set to be my git editor. When git opens emacs for a commit message or a rebase merge It opens an empty buffer without any of the git input. Below is my setup:
Emacs shortcut command
kev-pc:server kevisazombie$ cat /usr/local/bin/emacs
#!/bin/sh
$(/Applications/Emacs.app/Contents/MacOS/Emacs "$#") &
Git config
kev-pc:server kevisazombie$ cat ~/.gitconfig
[core]
editor = emacs
exclusesfile = /Users/kevisazombie/.gitignore_global
excludesfile = /Users/kevisazombie/.gitignore_global
[color]
ui = auto
[merge]
tool = ediff
[mergetool "ediff"]
cmd = emacs --eval \"(ediff-merge-files-with-ancestor \\\"$LOCAL\\\" \\\"$REMOTE\\\" \\\"$BASE\\\" nil \\\"$MERGED\\\")\"

Follow the steps on the Emacs for OS X website:
Create a script in your PATH called "ec" containing
#!/bin/sh
which osascript > /dev/null 2>&1 && osascript -e 'tell application "Emacs" to activate'
/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c "$#"
Then use git config --global core.editor ec
A simpler version of this is just git config --global core.editor "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c" but I believe this requires Emacs to be running.
This question should probably be moved to Super User, though.

Related

How do I use emacs on macos terminal?

I downloaded Emacs for MacOS and created a file called emacsclient using ln -s /Applications/Emacs.app/Contents/MacOS/bin/emacsclient /usr/local/bin
Then created a script called ec in my PATH with the contents
#!/bin/sh
which osascript > /dev/null 2>&1 && osascript -e 'tell application "Emacs" to activate'
emacsclient -c "$#"
The above steps were from Emacs for MacOS
I then set an alias using alias emacs="emacsclient -t --socket-name=/tmp/emacs1000/server" so that i could call emacsclient using just emacs.
when I call emacs I get the message
emacsclient: can't find socket; have you started the server?
emacsclient: To start the server in Emacs, type "M-x server-start".
emacsclient: error accessing socket "/tmp/emacs1000/server"
I am a beginner and don't really know much.
Thanks
The command emacsclient -t --socket-name=/tmp/emacs1000/serverwill work only if you've started a emacs server first.
To launch a emacs server, execute the following command :
emacs --daemon
After that, the command emacsclient -t will open a new Emacs frame INSIDE the terminal. If you want to have an "outside the terminal" Emacs frame launch emacsclient -n.
What I recommend is to have the command emacs --deamon launch at startup, and I binded "Ctrl-Alt e" to emacsclient -n to launch new Emacs frame with a quick shortcut.
Finally, you can find a lot of information on the GNU documentation of Emacs, here is the page for the emacsclient command : GNU's documentation on emacsclient

Git alias to open the git installation folder

I want to create a git alias git dir, which when used should open the git installation folder via Windows Explorer, how to implement such an alias?
If using Git Bash, try:
git config --global alias.dir '!start "" "$(git --exec-path)"'
Reference: Can I use the "start" command with spaces in the path?
Starting an alias with ! treats it as a command.
I don't have a windows machine at hand, but for Linux:
git config --global alias.open '!git --exec-path | xargs xdg-open'
Works as described.
So the command you're looking for will probably look something like:
git config --global alias.open "!git --exec-path | 'sed s~/~\\~g' | xargs explorer"

It' s possible to works SSH and git command in gitlab-ci?

In my gitlab-ci.yml, I have an SSH connection to another server, all my command are working except the git commands
They block the script with the message:
WARNING: terminal is not fully functional
- (press RETURN)
and my script is blocked
My code in gitlab-ci :
allow_failure: false
script:
- ssh -tt root#1IP 'cd PATH; git branch;docker run -it -v $PWD:PATH -w /PATH cypress/included:6.5.0 | tee result.txt'
Without the git command, it's work.
Of course, in my remote server, git branch work's fine.
Any ideas ?
Thanks :) :)
That is an error message coming from less, used as a pager by Git, as I documented here.
Try:
git config --global core.pager "less -d"; git branch; ... (rest of the commands)
The -d option (from less man page) option suppresses the error message normally displayed if the terminal is dumb;

Open emacs application in a specific mode for given path

I was using emacs on command line and I was using following command to open current git directory in magit mode:
emacs -nw -f magit-status --eval "(call-interactively #'delete-other-windows)"
I switched to using emacs app instead of opening it in command line. I am using following command alias:
alias emacs='open -a /Applications/Emacs.app $1'
Because of this magit command doesn't work anymore. Is there any way to achieve the same functionality with Emacs app?
Also, tried this function as suggested in comments:
function magit() {
open -a /Applications/Emacs.app --args -f magit-status $1
}
Regards,
Pawan.
When starting a new Emacs session, the function
function magit() {
open -a Emacs --args --file "$1" -f magit-status
}
will do what you want. That is, load a file into a buffer (via find-file) and run the function magit-status on that buffer. Note, that order counts on the Emacs command line. While open -a Emacs myfile --args -f magit-status and open -a Emacs --args -f magit-status myfile are correct from the perspective of open, they aren't correct from Emacs's perspective. (magit-status is executed on nothing, and then myfile is opened. Not what you want.)
If you want to do this with a currently running Emacs session, you can't. The clue is in open's manpage.
--args
All remaining arguments are passed to the opened application in the argv parameter to main(). These argu-
ments are not opened or interpreted by the open tool.
main() has already executed, so you can't pass anymore parameters to it, so --args is effectively ignored. So, you'll have to get creative with the Emacs server and emacsclient.
If you have an open Emacs session with an associated server (via server-start for instance), you can do the following to "load and execute-on" a file
# my emacs will load *.log files in `fundamental-mode`
# this will load them in `text-mode`
$ emacsclient -e '(find-file "/tmp/foo.log")' -e '(text-mode)'
# or
$ emacsclient -e '(progn (find-file "/tmp/foo.log") (text-mode))'

Git on Windows: How do you set up a mergetool?

I've tried msysGit and Git on Cygwin. Both work just fine in and of themselves and both run gitk and git-gui perfectly.
Now how the heck do I configure a mergetool? (Vimdiff works on Cygwin, but preferably I would like something a little more user-friendly for some of our Windows-loving coworkers.)
To follow-up on Charles Bailey's answer, here's my git setup that's using p4merge (free cross-platform 3way merge tool); tested on msys Git (Windows) install:
git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'
or, from a windows cmd.exe shell, the second line becomes :
git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
The changes (relative to Charles Bailey):
added to global git config, i.e. valid for all git projects not just the current one
the custom tool config value resides in "mergetool.[tool].cmd", not "merge.[tool].cmd" (silly me, spent an hour troubleshooting why git kept complaining about non-existing tool)
added double quotes for all file names so that files with spaces can still be found by the merge tool (I tested this in msys Git from Powershell)
note that by default Perforce will add its installation dir to PATH, thus no need to specify full path to p4merge in the command
Download: http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools
EDIT (Feb 2014)
As pointed out by #Gregory Pakosz, latest msys git now "natively" supports p4merge (tested on 1.8.5.2.msysgit.0).
You can display list of supported tools by running:
git mergetool --tool-help
You should see p4merge in either available or valid list. If not, please update your git.
If p4merge was listed as available, it is in your PATH and you only have to set merge.tool:
git config --global merge.tool p4merge
If it was listed as valid, you have to define mergetool.p4merge.path in addition to merge.tool:
git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
The above is an example path when p4merge was installed for the current user, not system-wide (does not need admin rights or UAC elevation)
Although ~ should expand to current user's home directory (so in theory the path should be ~/AppData/Local/Perforce/p4merge.exe), this did not work for me
Even better would have been to take advantage of an environment variable (e.g. $LOCALAPPDATA/Perforce/p4merge.exe), git does not seem to be expanding environment variables for paths (if you know how to get this working, please let me know or update this answer)
setting mergetool.p4merge.cmd will not work anymore since Git has started trying to support p4merge, see libexec/git-core/git-mergetool--lib.so we just need to specify the mergetool path for git,for example the p4merge:
git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge
Then it will work.
I'm using Portable Git on WinXP (works a treat!), and needed to resolve a conflict that came up in branching. Of all the gui's I checked, KDiff3 proved to be the most transparent to use.
But I found the instructions I needed to get it working in Windows in this blog post, instructions which differ slightly from the other approaches listed here. It basically amounted to adding these lines to my .gitconfig file:
[merge]
tool = kdiff3
[mergetool "kdiff3"]
path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
keepBackup = false
trustExitCode = false
Working nicely now!
Under Cygwin, the only thing that worked for me is the following:
git config --global merge.tool myp4merge
git config --global mergetool.myp4merge.cmd 'p4merge.exe "$(cygpath -wla $BASE)" "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)" "$(cygpath -wla $MERGED)"'
git config --global diff.tool myp4diff
git config --global difftool.myp4diff.cmd 'p4merge.exe "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)"'
Also, I like to turn off the prompt message for difftool:
git config --global difftool.prompt false
git mergetool is fully configurable so you can pretty much chose your favourite tool.
The full documentation is here: http://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html
In brief, you can set a default mergetool by setting the user config variable merge.tool.
If the merge tool is one of the ones supported natively by it you just have to set mergetool.<tool>.path to the full path to the tool (replace <tool> by what you have configured merge.tool to be.
Otherwise, you can set mergetool.<tool>.cmd to a bit of shell to be eval'ed at runtime with the shell variables $BASE, $LOCAL, $REMOTE, $MERGED set to the appropriate files. You have to be a bit careful with the escaping whether you directly edit a config file or set the variable with the git config command.
Something like this should give the flavour of what you can do ('mymerge' is a fictional tool).
git config merge.tool mymerge
git config merge.mymerge.cmd 'mymerge.exe --base "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'
Once you've setup your favourite merge tool, it's simply a matter of running git mergetool whenever you have conflicts to resolve.
The p4merge tool from Perforce is a pretty good standalone merge tool.
For beyond compare on Windows 7
git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"
It seems that newer git versions support p4merge directly, so
git config --global merge.tool p4merge
should be all you need, if p4merge.exe is on your path. No need to set up cmd or path.
I found two ways to configure "SourceGear DiffMerge" as difftool and mergetool in github Windows.
The following commands in a Command Prompt window will update your .gitconfig to configure GIT use DiffMerge:
git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"'
git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"'
[OR]
Add the following lines to your .gitconfig. This file should be in your home directory in C:\Users\UserName:
[diff]
tool = diffmerge
[difftool "diffmerge"]
cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"
[merge]
tool = diffmerge
[mergetool "diffmerge"]
trustExitCode = true
cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"
As already answered here (and here and here), mergetool is the command to configure this. For a nice graphical frontend I recommend kdiff3 (GPL).
I had to drop the extra quoting using msysGit on windows 7, not sure why.
git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
If you're doing this through cygwin, you may need to use cygpath:
git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge `cygpath -w $BASE` `cygpath -w $LOCAL` `cygpath -w $REMOTE` `cygpath -w $MERGED`'
Bah, this finally worked for me (Windows 7 + Cygwin + TortoiseMerge):
In .git/config:
cmd = TortoiseMerge.exe /base:$(cygpath -d \"$BASE\") /theirs:$(cygpath -d \"$REMOTE\") /mine:$(cygpath -d \"$LOCAL\") /merged:$(cygpath -d \"$MERGED\")
Thanks to previous posters for the tip to use cygpath!
i use an app called WinMerge ( http://winmerge.org/ )
info from their manual ( http://manual.winmerge.org/CommandLine.html )
this is the bash script i use from the mergetool directive via .gitconfig
#!/bin/sh
# using winmerge with git
# replaces unix style null files with a newly created empty windows temp file
file1=$1
if [ "$file1" == '/dev/null' ] || [ "$file1" == '\\.\nul' ] || [ ! -e "$file1" ]
then
file1="/tmp/gitnull"
`echo "">$file1`
fi
file2=$2
if [ "$file2" == '/dev/null' ] || [ "$file2" == '\\.\nul' ] || [ ! -e "$file2" ]
then
file2="/tmp/gitnull"
`echo "">$file2`
fi
echo diff : $1 -- $2
"C:\Program files (x86)\WinMerge\WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$file1" "$file2"
basically the bash accounts for when the result of the diff in an empty file and creates a new temp file in the correct location.
You may want to add these options too:
git config --global merge.tool p4mergetool
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
git config --global mergetool.p4mergetool.trustExitCode false
git config --global mergetool.keepBackup false
Also, I don't know why but the quoting and slash from Milan Gardian's answer screwed things up for me.
If anyone wants to use gvim as their diff tool on TortoiseGit, then this is what you need to enter into the text input for the path to the external diff tool:
path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"
For IntelliJ IDEA (Community Edition) 3-way git mergetool configuration in Windows environment (~/.gitconfig)
Cygwin
[mergetool "ideamerge"]
cmd = C:/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe merge `cygpath -wa $LOCAL` `cygpath -wa $REMOTE` `cygpath -wa $BASE` `cygpath -wa $MERGED`
[merge]
tool = ideamerge
Msys
[mergetool "ideamerge"]
cmd = "/c/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe" merge `~/winpath.sh $LOCAL` `~/winpath.sh $REMOTE` `~/winpath.sh $BASE` `~/winpath.sh $MERGED`
[merge]
tool = ideamerge
The ~/winpath.sh is to convert paths to Windows on msys and is taken from msys path conversion question on stackoverflow
#! /bin/sh
function wpath {
if [ -z "$1" ]; then
echo "$#"
else
if [ -f "$1" ]; then
local dir=$(dirname "$1")
local fn=$(basename "$1")
echo "$(cd "$dir"; echo "$(pwd -W)/$fn")" | sed 's|/|\\|g';
else
if [ -d "$1" ]; then
echo "$(cd "$1"; pwd -W)" | sed 's|/|\\|g';
else
echo "$1" | sed 's|^/\(.\)/|\1:\\|g; s|/|\\|g';
fi
fi
fi
}
wpath "$#"
For kdiff3 you can use:
git config --global merge.tool kdiff3
git config --global mergetool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global mergetool.kdiff3.trustExitCode false
git config --global diff.guitool kdiff3
git config --global difftool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global difftool.kdiff3.trustExitCode false
To setup p4merge, installed using chocolatey on windows for both merge and diff, take a look here:
https://gist.github.com/CamW/88e95ea8d9f0786d746a
If you're having problems opening p4merge from SourceTree look for you local configuration file named config under MyRepo.git and delete any merge configuration.
In my case it was trying to open Meld which I just uninstalled

Resources