html/emacs使用multi-term.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="generator" content="eeb v0.1.3">
    <title>emacs 使用multi-term – eeb v0.1.3</title>
    <link rel="icon" href="favicon.ico" type="image/x-icon">
    <link rel="stylesheet" type="text/css" href="http://oss.maxcdn.com/semantic-ui/2.1.6/semantic.min.css">
    <link rel="stylesheet" type="text/css" href="http://oss.maxcdn.com/highlight.js/9.0.0/styles/github.min.css">
    <link rel="stylesheet" type="text/css" href="assets/base.css">
  </head>
  <body>
    <div class="ui text container" style="margin-top: 25px;">
    <div class="author-info">
            <div class="ui stackable two column grid container">
                <div class="column">
                    <a href="index.html">
                        <img class="ui avatar image" src="http://upload.jianshu.io/users/upload_avatars/297930/02d576b98e6a.png?imageMogr/thumbnail/90x90/quality/100">
                    </a>
                </div>

                <div class="column" style="margin-left: -300px">
                    <div class="content">
                        <div class="header" style="margin-bottom: 5px">
                            <span class="mini ui red basic label">作者</span>
                            <a class="author-name blue-link" href="index.html">
                                <span>aborn</span>
                            </a>
                            <span class="popup" data-content="最后编辑于 2016-02-03 05:44" data-variation="inverted">2016-01-15 00:52*</span>
                        </div>
                        <span>写了651字</span>,<span>被4人访问</span>,<span>获得了0个喜欢</span>
                    </div>
                </div>
            </div>
        </div>
<h1 class="ui header">emacs 使用multi-term</h1>
<p>emacs里的<a href="http://www.emacswiki.org/emacs/MultiTerm">multi-term</a>相当于mac下的iterm,是emacs下非常好用的terminal。</p>
<h2>载入multi-term.el文件</h2>
<p>emacs使用multi-term作为terminal,首先要将<a href="http://www.emacswiki.org/emacs/download/multi-term.el">multi-term.el</a>文件放到你emacs的load-path里。</p>
<h2>配置</h2>
<pre><code class="elixir">;; ------------------------------------------------------------
;; set multi-term
;; ------------------------------------------------------------
(require &#39;multi-term)
(setq multi-term-program &quot;/bin/zsh&quot;)
;; Use Emacs terminfo, not system terminfo, mac系统出现了4m
(setq system-uses-terminfo nil)</code></pre>
<p>下面是几点需要注意的点:</p>
<ol>
<li>我用的是zsh,如果你使用的是bash, 将”/bin/zsh”换成你的”/bin/bash”
</li>
<li>如果你使用的是mac系统,发现multi-term每行出出了4m,在shell里运行下:
</li>
</ol>
<pre><code class="elixir">tic -o ~/.terminfo /Applications/Emacs.app/Contents/Resources/etc/e/eterm-color.ti</code></pre>
<ol>
<li>zsh在mac下可能会出现中文显示为????的情况,这时候创建一个文件:~/.zshenv,其内容如下:
</li>
</ol>
<pre><code class="elixir">export LANG=&#39;en_US.UTF-8&#39;
export LC_ALL=&quot;en_US.UTF-8&quot;</code></pre>
<h2>快捷键</h2>
<p>打开multi-term的命令是<strong>multi-term</strong>,你可能发现在multi-term模式下会出现与自己的快捷键冲突的地方。如果想保留自己在其他mode下的快捷键,将快捷键添加到 <em>term-bind-key-alist</em>这个列表中,例如我想把”C-j”保留我其他mode一样,如下:</p>
<pre><code class="elixir">(add-to-list &#39;term-bind-key-alist &#39;(&quot;C-j&quot;))</code></pre>
<h2>解决几个烦人的问题</h2>
<p><strong>1.</strong> 我开始设置的是zsh,我发现,当我用$cd$命令改变工作目录的时候,emacs里的default-directory这个变量没有改变,使得C-x C-f调用打开文件时目录不是当前工作目录?
<a href="http://stackoverflow.com/questions/367442/getting-emacs-ansi-term-and-zsh-to-play-nicely">解决方法</a>将下列代码放到zsh的配置文件 $~.zshrc$里,使得emacs能跟踪路径的改变,<a href="https://snarfed.org/why_i_run_shells_inside_emacs">参考1</a>,<a href="http://emacs.stackexchange.com/questions/5589/automatically-update-default-directory-when-pwd-changes-in-shell-mode-and-term-m">参考2</a>。</p>
<pre><code class="shell">if [ -n &quot;$INSIDE_EMACS&quot; ]; then
    chpwd() { print -P &quot;\033AnSiTc %d&quot; }
    print -P &quot;\033AnSiTu %n&quot;
    print -P &quot;\033AnSiTc %d&quot;
fi</code></pre>
<p><strong>2.</strong> 我希望当光标没处于最后一行时,”C-a”的作用是将光标移动到行首,当光标处于最后一行时,我希望”C-a”的作用是将光标移动到这行命令的开始处。解决方法:将下列 ab/move-beginning-of-line 绑定到快捷键”C-a”即可。</p>
<pre><code class="elixir">;; 当处于最后一行时 &quot;C-a&quot; 将光标移动到 terminal开始处而不是这个行的头
(defun ab/is-at-end-line () 
   &quot;判断是否在最后一行&quot;
   (equal (line-number-at-pos) (count-lines (point-min)  (point-max))))
(defun ab/is-term-mode () 
   &quot;判断是否为 term 模式&quot;
    (string= major-mode &quot;term-mode&quot;))
(defun ab/move-beginning-of-line () 
   &quot;move begin&quot; 
   (interactive) 
   (if (not (ab/is-term-mode)) 
              (beginning-of-line)
         (if (not (ab/is-at-end-line)) 
                    (beginning-of-line) 
                (term-send-raw))))</code></pre>
<p><strong>3.</strong> 有个烦人的问题,你发现使用了”C-b” (backword-char 函数),你想在命令的中间插入新的字符,每次都插入到了这行的最后。解决方法:将下列ab/backword-char函数绑定到”C-b”</p>
<pre><code class="elisp">;; 只后当是term-mode并且是最后一行时才采用 (term-send-left)
(defun ab/backword-char () 
   &quot;Custom &quot; 
    (interactive) 
    (if (not (ab/is-term-mode)) 
               (backward-char) 
          (progn (if (not (ab/is-at-end-line))
                          (backward-char)
                        (progn (term-send-left)
                                   (message &quot;term-send-left&quot;))))))</code></pre>
<p><strong>4.</strong>修改快捷键的map,如果你发你定义自己的快捷键与该major-mode的冲突,可以直接修改它的key-map</p>
<pre><code class="elisp">(define-key term-raw-map (kbd &quot;M-n&quot;) &#39;ace-jump-mode)</code></pre>
<p>更多见,<a href="https://github.com/aborn/emacs.d/blob/master/utils/multi-term-config.el">我的multi-term配置</a></p>
    <footer class="footer">
      <p>
        <span class="line">
          Powered by
            <a href="https://github.com/aborn/eeb" title="eeb" rel="help" target="_blank">eeb</a> (v0.1.3).
        </span>
      </p>
    </footer>
  </div>

  <script src="http://oss.maxcdn.com/jquery/2.1.4/jquery.min.js"></script>
  <script src="http://oss.maxcdn.com/semantic-ui/2.1.6/semantic.min.js"></script>
  <script src="http://oss.maxcdn.com/highlight.js/9.0.0/highlight.min.js"></script>
  <script src="assets/app.js"></script>
  </body>
</html>