当前位置: 首页 > 编程日记 > 正文

[转载] Tmux 速成教程:技巧和调整

原文: http://blog.jobbole.com/87584/

决定从 screen 转向 tmux 了, 非常喜欢 tmux 的窗格功能.

简介

有些开发者经常要使用终端控制台工作,导致最终打开了过多的标签页。如果你也是他们当中的一员,或者你正在实践结对编程,那么我推荐你读一读这篇文章。从上个月开始,我开始大量使用 Tmux 并且发现 Tmux 非常实用,所以我想应该写一篇文章,与诸位分享一些有关使用 Tmux 的建议和专业方案。本文将先介绍 Tmux 是什么,然后讲解如何使用 Tmux,才能使其同 Vim 结合起来,打造出更高效、更优雅的终端工具。

本文将会包含以下内容:

  • Tmux 的基础
  • Tmux 中最棒的功能
    • 窗口(Window)
    • 窗格(Pane)
    • 会话(Session)
    • 快速在文本间移动光标或复制文本
    • 非常轻巧的结对编程功能
  • 调整 Tmux 以增强其同 Vim 的集成度
    • 调整背景的配色方案
    • 调整光标的形状
    • 调整粘贴时的文本缩进
  • 其他能够提升 Tmux 体验的工具或技巧
    • 用 Tmuxinator 自动创建会话
    • 改变 Tmux 状态栏的颜色

请注意,在撰写本文的过程中,我安装了以下这一组软件,并在测试时使用了这些版本:

  • Tmux 1.9a
  • Vim 7.4
  • iTerm 2.1
  • Mac OS (Mavericks and Yosemite)

让我们开始吧!

基础知识

什么是Tmux?

Tmux 是一个工具,用于在一个终端窗口中运行多个终端会话。不仅如此,你还可以通过 Tmux 使终端会话运行于后台或是按需接入、断开会话,这个功能非常实用。稍后,我们将会看到如何充分地利用这个功能。

如图所示,这就一个是 Tmux 的会话:

从图中我们可以看出:

  • 左侧:Vim
  • 右侧:系统 Shell
  • 左下方:Tmux 会话的名字(“pomodoro-app”)
  • 下方的中部:当前会话中的 Tmux 窗口(“app log”、“editor”和 “shell”)
  • 右下方:当前的日期

如何安装 Tmux?

在 Mac OS 中安装:

  • 安装 Homebrew
    1
    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

有关安装 homebrew 的详细的信息可以参考这里。

  • 安装 Tmux
    1
    $ brew install tmux

在 Ubuntu 中安装:

在终端输入如下命令:

1
sudo apt-get install tmux

Tmux 的快捷键前缀(Prefix)

为了使自身的快捷键和其他软件的快捷键互不干扰,Tmux 提供了一个快捷键前缀。当想要使用快捷键时,需要先按下快捷键前缀,然后再按下快捷键。Tmux 所使用的快捷键前缀默认是组合键 Ctrl-b(同时按下 Ctrl 键和 b 键)。例如,假如你想通过快捷键列出当前 Tmux 中的会话(对应的快捷键是 s),那么你只需要做以下几步:

  • 按下组合键 Ctrl-b (Tmux 快捷键前缀)
  • 放开组合键 Ctrl-b
  • 按下 s 键

这里有一些小建议:

首先我建议对调 Ctrl 键和 Caps-Lock 键的功能。

通过按下 Caps-Lock 键来代替 Ctrl 键将会非常实用。因为在编码过程中,你需要频繁地按下Ctrl 键,而由于 Caps-Lock 与手指在键盘的起始位置处于同一直线,所以按下 Caps-Lock 键会更加容易、便捷。

其次,我建议将 Tmux 的快捷键前缀变为 Ctrl - a。用 Caps-Lock 键替代了 Ctrl 键之后,由于 Caps-Lock 键与 a 键离得更近,所以按下 Ctrl - a 就将会比按下 Ctrl - b 更容易、更便捷。

若要将快捷键前缀变更为 Ctrl-a ,请将以下配置加入到 Tmux 的配置文件 ~/.tmux.conf 中:

1
2
unbind C-b
set -g prefix C-a

Tmux 的配置文件

每当开启一个新的会话时,Tmux 都会先读取 ~/.tmux.conf 这个文件。该文件中存放的就是对 Tmux 的配置。

小提示:如果你希望新的配置项能够立即生效,那么你可以将下面这一行配置加入到文件~/.tmux.conf 中。

1
2
# bind a reload key
bind R source-file ~/.tmux.conf ; display-message "Config reloaded.."

这样配置了之后,每当向 ~/.tmux.conf 文件中添加了新的配置,只需要按下 Ctrl-b r 就可以重新加载配置并使新的配置生效,从而免去了开启一个新的会话。

Tmux 中最棒的功能

提示:下面这截图也许与你使用 Tmux 时看到的界面略有不同。这是因为我修改了 Tmux 的状态栏配置,如果你也想修改成和截图中一样的效果,那么可以参照“美化 Tmux 的状态栏”这一节中的步骤。

窗格

我认为沿竖直方向分割屏幕是个不错的主意,这样我就可以在一边使用 Vim,而在另一边查看代码运行结果,如果需要的话,有时我还会再打开一个控制台。下面我就要讲解如何利用 Tmux 实现这一切。

从图中可以看出:

  • 左侧:Vim(左上方是一个 Ruby 的类文件,左下方是针对这类编写的测试文件)
  • 右侧:一个 Bash 的会话

要创建一个竖直放置的窗格很容易,待开启了一个 Tmux 会话之后,只需再按下 Ctrl-b % ,一个竖直窗格就出现了。另外,若要把屏幕沿水平方向分割,则只需要按下 Ctrl-b "。在 Tmux 的窗格间移动光标也很简单,只需要先按下 Tmux 的快捷键前缀,然后再按下对应的方向键就可以让光标进入到目标窗格了。

窗口

在Tmux中,窗口是个窗格容器,你可以将多个窗格放置在窗口中,并根据你的实际需要在窗口中排列多个窗格,也是完全取决于你的需要。例如,我经常是这样做,先开启一个叫作“server”的窗口用于运行应用程序的服务器(在这个窗口中可以看到服务器的日志),然后开启另一个叫作“editor”的窗口用于编写代码。在这个窗口中有两个窗格,一个用于 Vim,一个用于运行测试代码。最后再开启一个叫作“shell”的窗口用于通过 Bash shell 运行命令。Tmux 的窗口功能非常实用,因为在一个窗口中可以创建出多个窗格,这样在一个窗口中就能同时查看所有窗格内容,通过这种方法可以高效地利用有限的屏幕空间。

在 Tmux 的会话中,现有的窗口将会列在屏幕下方。下图所示的就是在默认情况下 Tmux 列出现有窗口的方式。这里一共有三个窗口,分别是“server”、“editor”和“shell”。

若要创建一个窗口,只需要按下Ctrl-b c;若要切换窗口,只需要先按下Ctrl-b,然后再按下想切换的窗口所对应的数字,该数字会紧挨着窗口的名字显示。

会话

一个 Tmux 会话中可以包含多个窗口。会话功能非常简单易用,例如可以为一个特定的项目创建一个专用的 Tmux 会话。若要创建一个新的会话,只需要在终端运行如下的命令:

1
tmux new -s <name-of-my-session>

假设我还需要开发另一个项目,于是我就会为此再新建一个会话。虽然进入了新的会话,但是原来的会话并没有消失。所以我可以在稍后回到之前的会话继续工作。若要创建一个新的会话,只需要按下Ctrl-b : ,然后输入如下的命令:

1
new -s <name-of-my-new-session>

除非显式地关闭会话,否则 Tmux 的会话在重启计算机之前都不会消失。只要还没有重启计算机,你都可以自由地从一个项目的会话跳转到另一个。

在 Tmux 的会话间切换

若要获取现有会话的列表,可以按下Ctrl-b s。下图所示的就是会话的列表:

列表中的每个会话都有一个 ID,该 ID 是从 0 开始的。按下对应的 ID 就可以进入会话。如果你已经创建了一个或多个会话,但是还没有运行 Tmux,那么可以输入如下命令以接入已开启的会话。

1
tmux attach

在文本间快速移动光标,复制文本

在 iTerm2 中,要想快速地复制内容就不得不键盘和鼠标一起用,这一点我一直很不喜欢。我想一定会有不需要使用鼠标且更快捷的复制方法。幸运的是,Tmux就提供了只用键盘就可以完成复制的功能,这源于 Tmux 是从命令行启动的,而在命令行界面是无法使用鼠标的。

在文本间移动光标

在 Tmux 中可以使用与 Vim 极为相似的方式在文本间移动光标。正如你熟知的那样,用 k 键可以将光标移动到上一行,用 w 键可以向后移动一个单词等等。而且还可以通过把 Tmux 设为 vi 模式,使其与 Vim 的操作更加接近。为此,需要将以下配置加入到文件 ~/.tmux.conf 中。

1
2
# Use vim keybindings in copy mode
setw -g mode-keys vi

将复制下来的文本发送到系统的剪贴板中

在默认情况下,当从 Tmux 中复制文本时,复制下来的文本只能粘贴到同一个 Tmux 会话中。若要使复制下来的文本可以粘贴到任何位置,就需要让 Tmux 将文本复制到系统的剪贴板。为此,我们需要这样做:

安装 retach-to-user-namespace。用 brew 安装的话将会非常简单,只需要运行下面这条命令:

1
$ brew install reattach-to-user-namespace

在配置文件 ~/.tmux.conf 中加入以下内容:

1
2
# invoke reattach-to-user-namespace every time a new window/pane opens
set-option -g default-command "reattach-to-user-namespace -l bash"

Select and copy text

既然已经设置成了 vi 模式,也安装了 rettach-to-user-namespace,下面就让我们来看看如何从 Tmux 的会话中复制文本吧。假设要复制的是 IP 地址,于是我们先运行了 ifconfig 命令。接下来就请跟随以下的步骤:

首先按下 Ctrl-b [ 进入复制模式,然后可以看到一小段高亮的文本出现在了屏幕的右上角 (“[0/0]”)(如下图所示)。

接下来就可以像在 Vim 中一样用 jkl 和 h 等键在文本间移动光标了。

把光标移动到想复制的文本上后再按下空格键就可以开始选择文本了(这和在 Vim 中复制文本的步骤一模一样)。

选择完要复制的文本后再按下回车键。

这样 IP 地址就复制下来并可以粘贴到任何地方了。

让复制文本的操作更像 Vim

你还可以设置 Tmux 使用 v 键选择文本,用 y 键复制文本。为此只需要将下面的配置项加入到配置文件 ~/.tmux.conf 中。

1
2
3
4
# start selecting text typing 'v' key (once you are in copy mode)
bind-key -t vi-copy v begin-selection
# copy selected text to the system's clipboard
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

高效的结对编程

你可以将 Tmux 会话的地址分享给他人,这样他们就可以通过 SSH 接入这个会话了。由于会话是建立在 SSH 之上的,所以不会产生额外的开销。通过使用高速的互联网,对于那些连接到远程会话上的用户而言,他们会觉得这个会话就是运行在本地的。

在Tmux 中使用 Tmate

Tmate 是一个 Tmux 的管理工具,使用它不但能够轻松地创建 Tmux 会话而且还能够通过互联网把该会话共享给其他人。若要使用 Tmate 共享 Tmux 会话,请按照以下步骤操作:

  • 安装 Homebrew
    1
    $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • 安装 Tmate
    1
    2
    $ brew update             &&brew tap nviennot/tmate &&
    brew install mate
  • 使用 Tmate 开启一个新的会话
    1
    $ tmate
  • 从 Tmux 的会话中复制由 Tmate 产生的 SSH URL。如下图所示,请注意屏幕下方的信息“[tmate] Remote session: ssh …”:

  • 利用刚刚复制下来的 URL 就可以邀请其他人通过 SSH 访问你的会话了。

了解了如何利用 Tmux 的结对编程功能之后,还可以再利用您所喜爱的运营商提供的语音服务进一步加强会话交互性。

调整 Tmux 以增强其同 Vim 的集成度

调整背景的配色方案

当我第一次通过 Tmux 打开 Vim 时,我发现 Vim 的颜色没有正确显示。正如下图所示,只有有字符的地方才有背景色。

这个问题是因为通过 Tmux 运行 Vim 需要配置一个特殊的终端参数(term parameter)。请将下面这行配置添加以你的 ~/.vim 文件中。

1
2
3
if exists('$TMUX')
  set term=screen-256color
endif

在更新了配置文件 ~/.vimrc 以后,颜色应该就可以正确显示了。

调整光标的形状

在默认情况下,当通过 Tmux 运行 Vim 时,无论当前 Vim 是处于插入模式、可视模式还是其他模式,光标的形状都是一样的。这样就很难判断当前的 Vim 模式是什么。若要避免这个问题,就需要让 Tmux 通知 iTerm 更新光标的形状。为此,需要将以下配置加入到文件 ~/.vimrc 中。

1
2
3
4
5
6
7
8
9
if exists('$ITERM_PROFILE')
  if exists('$TMUX')
    let &amp;t_SI = "<Esc>[3 q"
    let &amp;t_EI = "<Esc>[0 q"
  else
    let &amp;t_SI = "<Esc>]50;CursorShape=1x7"
    let &amp;t_EI = "<Esc>]50;CursorShape=0x7"
  endif
end

在这里我要感谢 Andy Fowler,是他最先分享了调整光标的形状这个技巧。

调整粘贴时的文本缩进

在 Vim 中粘贴文本时可能会遇到这样的问题,有时文本的缩进会发生变化,特别是在粘贴大量的文本时,这个问题会更加明显。虽然可以通过在粘贴前执行 :set nopaste 来解决这个问题,但是这里还有一种更好的解决方法。就是把下面这段配置加入到配置文件 ~/.vimrc 中,这样 Vim 就会自动地阻止粘贴文本时的自动缩进。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
" for tmux to automatically set paste and nopaste mode at the time pasting (as
" happens in VIM UI)
function! WrapForTmux(s)
  if !exists('$TMUX')
    return a:s
  endif
  let tmux_start = "<Esc>Ptmux;"
  let tmux_end = "<Esc>"
  return tmux_start . substitute(a:s, "<Esc>", "<Esc><Esc>", 'g') . tmux_end
endfunction
let &amp;t_SI .= WrapForTmux("<Esc>[?2004h")
let &amp;t_EI .= WrapForTmux("<Esc>[?2004l")
function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction
inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

在这里我要感谢 Marcin Kulik,是他最先分享了这个技巧。

其他能够提升 Tmux 体验的工具或技巧

Tmuxinator (为项目自动创建会话)

假设你正在开发应用程序 A。在开发过程中,经常要创建 Tmux 会话,会话中包含“server”、“editor”(用于编写代码)和“shell”(用于运行系统命令)这 3 个窗口。不仅如此,在一天之中的某个特定的时间你还需要临时进入到应用程序 B 的开发工作中。于是你又不得不创建另一个会话,虽然有略微的不同(比如目录和某些命令),但是会话中还是要包含应用程序 A 中的那 3 个窗口。但是有了 Tmuxinator,你就可以为每个Tmux 会话声明一个配置,然后用 1 条命令就能创建出这个会话了。这功能太棒了,不是吗。

Tmuxinator 是一个 Ruby 的 gem 包,可用于创建 Tmux 的会话。它的工作方式是先在配置文件中定义会话中的细节,然后用 1 条命令创建出这些会话。下面就让我们看看如何安装 Tmuxinator 以及如何添加配置来为指定项目开启一个会话。可以通过运行如下命令安装 Tmuxinator 的 gem 包。

1
$ gem install tmuxinator

安装好了 Tmuxinator 以后,就可以在系统 Shell 中运行 tmuxinator 或 mux 命令了。下面就让我们为上述的应用程序(有 3 个窗口,分别是“servers”, “editor” 和 “shell”)来创建一个配置文件吧。下面这条命令的作用是为这个项目创建并打开一个配置文件。

1
$ tmuxinator new project_a

按下回车键后,就会自动打开文件 ~/.tmuxinator/project_a.yml。为了实现项目 A 所需的配置,你需要把 project_a.yml 的内容更新为:

1
2
3
4
5
6
7
8
9
10
11
12
13
name: project_a
root: <the-folder-of-project-A>
windows:
  - server: <command-to-start-application-server>
  - editor:
    layout: even-horizontal
    panes:
      - vim
      - <command-to-launch-tests-guard>
  - shell: ''

一旦将上面的配置添加到了项目 A 的 Yaml 文件中,只需要运行下面这条命令就可以启动 Tmux 的会话了。

1
$ tmuxinator start project_a

当然如果愿意的话,你也可以使用 Tmuxinator 命令的别名:

1
$ mux start project_a

大功告成了。现在,每当想进入项目 A 的编码工作时,就只需要运行 Tmuxinator 命令。

可以到这里查看Tmuxinator的官方文档。

美化 Tmux 的状态栏

默认情况下,Tmux的状态栏看起来是下图这个样子(图中绿底部分):

我们可以根据需要改变状态栏的外观。对我来说,我喜欢下图这种清爽的外观。

为了达到上图的效果,我将如下的配置加入到了配置文件 ~/.tmux.conf 中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 状态栏
  # 颜色
  set -g status-bg black
  set -g status-fg white
  # 对齐方式
  set-option -g status-justify centre
  # 左下角
  set-option -g status-left '#[bg=black,fg=green][#[fg=cyan]#S#[fg=green]]'
  set-option -g status-left-length 20
  # 窗口列表
  setw -g automatic-rename on
  set-window-option -g window-status-format '#[dim]#I:#[default]#W#[fg=grey,dim]'
  set-window-option -g window-status-current-format '#[fg=cyan,bold]#I#[fg=blue]:#[fg=cyan]#W#[fg=dim]'
  # 右下角
  set -g status-right '#[fg=green][#[fg=cyan]%Y-%m-%d#[fg=green]]'
```

总结

在这篇文章中我们先介绍了 Tmux 的基本功能,然后介绍了 Tmux 中最棒的几个功能。这之后介绍了一些配置以及几个能够提升 Tmux 体验的工具。至此,诸位对 Tmux 的印象如何呢?你们是否也发现了什么其他有用的功能或配置?如果有的话欢迎留言告诉我们。

感谢您阅读本文!

转载于:https://www.cnblogs.com/zhengran/p/4623458.html

相关文章:

css在兼容模式下无法引用_如何在CSS中使用深色模式

css在兼容模式下无法引用by Frank Lmmer由FrankLmmer 如何在CSS中使用深色模式 (How to get dark mode working with CSS) I have been playing around with MacOS Mojave’s dark mode lately. It’s not 100% pleasing to my eyes, yet. But it’s especially useful when n…

COJ 0995 WZJ的数据结构(负五)区间操作

WZJ的数据结构&#xff08;负五&#xff09;难度级别&#xff1a;C&#xff1b; 运行时间限制&#xff1a;1000ms&#xff1b; 运行空间限制&#xff1a;262144KB&#xff1b; 代码长度限制&#xff1a;2000000B 试题描述请你设计一个数据结构&#xff0c;完成以下功能&#xf…

接入网易云信IM即时通讯的微信小程序聊天室

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 接入流程&#xff1a; 初次接触网易云通信IM服务&#xff0c;您可以通过以下产品介绍文档了解我们的产品功能、相关概念、业务限制&#xff1a; 产品简介主要功能帐号集成与登录接口及业务限制 1. 创建…

vue颜色选择器_如何制作? Vue的颜色选择器!

vue颜色选择器by ZAYDEK由ZAYDEK 如何制作&#xff1f; Vue的颜色选择器&#xff01; (How to make a ? color picker with Vue!) 注意&#xff1a;颜色看起来可能比实际颜色更可爱&#xff01; (Caution: colors may appear cuter than they are!) Before I get to the arti…

centos7中使用yum安装tomcat以及它的启动、停止、重启

centos7中使用yum安装tomcat 介绍 Apache Tomcat是用于提供Java应用程序的Web服务器和servlet容器。 Tomcat是Apache Software Foundation发布的Java Servlet和JavaServer Pages技术的开源实现。 本教程介绍在CentOS 7服务器上使用yum进行Tomcat 7的基本安装和一些配置。请注意…

JS 数组A有数组B的数据就删除

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 创建了两个数组&#xff0c;并且封装了一个函数以供调用。 var arr1 [a,b,c,d],arr2 [a,c,d,f]; this.arrayWeightRemoval(arr1,arr2); //返回结果 [b] ;// 数据去重this.arrayWeightRemoval functio…

PL/SQL Developer的调试存储过程

学会使用PL/SQL Developer的调试功能&#xff0c;对于编写复杂的存储过程&#xff0c;包&#xff0c;funtion...非常有帮助&#xff0c;所以今晚学习了一下&#xff1a; &#xff08;1&#xff09;在sp里设置断点。 &#xff08;2&#xff09;点击TEST. (3) Debug-->Start. …

graphql_普通英语GraphQL指南

graphqlby Luis Aguilar路易斯阿吉拉尔(Luis Aguilar) 普通英语GraphQL指南 (A Guide to GraphQL in Plain English) 您需要了解的最新流行语正在席卷API开发领域。 (All you need to know about the latest buzzword that’s taking the API development scene by storm.) TL…

第1课第4.4节_Android硬件访问服务编写HAL代码

android应用如何访问C库 - 落魄影子 - 博客频道 - CSDN.NET http://blog.csdn.net/ab198604/article/details/51249303 Android硬件访问服务框架代码编写 - 落魄影子 - 博客频道 - CSDN.NET http://blog.csdn.net/ab198604/article/details/51397586 4 编写HAL代码 源码下载方…

Android新版NDK环境配置(免Cygwin)

本菜鸟在查阅了很多文章&#xff0c;又是去折腾cygwin之类的&#xff0c;虽然可以编译出so文件&#xff0c;但运行项目却有很多问题。当发现最新的ndk不需要cygwin的时候&#xff0c;跪了&#xff08;orz&#xff09;。 现在进入正题。 使用工具&#xff1a; adt-bundle-window…

小程序获取用户的操作轨迹日志

微信小程序开发交流qq群 173683895 花费了两天时间&#xff0c;修改过数次&#xff0c;终于把这个功能封装成了一个独立的工具。 任何小程序都可在不修改原代码的情况下直接镶入使用&#xff01;&#xff01;&#xff01; 步骤&#xff1a; 1. 在小程序 app.js 的平级目录…

paypal提现软件_PayPal软件工程师生命中的一天

paypal提现软件Find out what a normal day is like for a PayPal software engineer.找出PayPal软件工程师的正常日子。 Shruti Kapoor shares what she does and shows off some of the PayPal campus in San Jose, California.Shruti Kapoor分享了她的工作&#xff0c;并展…

关于IOS的蓝牙(转)

关于IOS的蓝牙 首先&#xff0c;你要了解你的目的是什么&#xff0c;一般的IOS蓝牙开发有以下三种目的&#xff1a; 1. IOS设备和IOS设备之间交互 好消息是&#xff1a;ios6.0可以把iPhone手机当从设备了&#xff0c;可以两台iPhone通过蓝牙通信传数据了&#xff0c;有点类似sp…

JavaSE--jdom解析之bom

参考&#xff1a;http://www.cnblogs.com/findumars/p/3620078.html 1 org.jdom2.input.JDOMParseException: Error on line 1: Content is not allowed in prolog. 2 13:15:55,821 [main] ERROR SajtSvrImpl:182 - 未知&#xff1a;org.jdom2.input.JDOMParseException: Error…

JS数组去重,JS根据数组里面的对象属性值去重

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 微信小程序开发交流qq群 173683895 js数组简单去重 var arr1 [1, 2, 3, 4, 5, 6, 3, 4, 3];function arrayUnique1(arr) {var arr1 [], obj {};for (var i 0, elem; (elem arr[i]) ! null; i) {i…

git 设置有效目录_如何有效使用Git

git 设置有效目录The code was working yesterday but today it is not该代码昨天有效&#xff0c;但今天却没有 The code got deleted代码被删除 A weird bug has been introduced suddenly and no-one knows how突然引入了一个奇怪的错误&#xff0c;没人知道如何 If you hav…

C\C++宏大全

一、标准预定义宏The standard predefined macros are specified by the relevant language standards, so they are available with all compilers that implement those standards. Older compilers may not provide all of them. Their names all start with double undersc…

POJ 3630 Phone List

题目大意:给n个字符串,问是否有一个是另一个的前缀思路:把n个字符串插到trie里,然后判断就好&#xff0c;注意一个长字符串覆盖另一个短字符串和短字符串匹配长字符串的区别 1 #include<iostream>2 #include<cstring>3 #include<cstdio>4 #define maxn 10000…

微信小程序地图标记点,点击标记点显示详细信息源码加效果图

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 效果图&#xff1a; 实现代码: <!-- <text>{{markers[id].placeName}}</text> --> <block wx:if{{isshow}}><map id"map" longitude"114.048410" latit…

如何仅使用HTML和JavaScript构建简单的URL缩短器

by Palash Bauri由Palash Bauri 如何仅使用HTML和JavaScript构建简单的URL缩短器 (How to build a simple URL shortener with just HTML and JavaScript) You might have used a URL shortener before, such as bit.ly, goo.gl. They are useful for shortening long URLs so…

hibernate中的hql查询语句list查询所有与iterate查询所有的区别

hibernate中的hql查询语句list查询所有与iterate查询所有的区别 list查询所有&#xff1b; 01&#xff0c;会立即产生一条select语句1select查询出来的所有语句都会被session管理&#xff0c; 保 存在缓存中 02&#xff0c;清空或者不清空session缓存中的数据&#xff0c;再次…

php解决 mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysq

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 The mysql extension is deprecated and will be removed in the future: use mysq 翻译&#xff1a; mysql_connect这个模块将在未来弃用&#xff0c;请你使用mysqli或者PDO来替代。 解决方法&#x…

Test execution order

刚开始的时候&#xff0c;JUnit并没有规定测试方法的调用执行顺序。方法通过映射的API返回的顺序进行调用。然 而&#xff0c;使用JVM顺序是不明智的&#xff0c;因为Java平台没有规定任何特定的顺序&#xff0c;事实上JDK7或多或少的返回的是随机顺序。大部分写的好的测试代码…

您需要了解有关Angular中的ng-template,ng-content,ng-container和* ngTemplateOutlet的所有信息...

It was one of those days when I was busy working on new features for my office project. All a sudden, something caught my attention:那是我忙于为Office项目开发新功能的日子之一。 突然间&#xff0c;一些事情引起了我的注意&#xff1a; While inspecting the DOM …

洛谷P2587 [ZJOI2008]泡泡堂

传送门 1368 泡泡堂 省队选拔赛 时间限制: 1 s空间限制: 128000 KB题目等级 : 大师 Master题解题目描述 Description第XXXX届NOI期间&#xff0c;为了加强各省选手之间的交流&#xff0c;组委会决定组织一场省际电子竞技大赛&#xff0c;每一个省的代表队由n名选手组成&#xf…

bootstrap的日期选择器 完整源码demo附效果图

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 效果图&#xff1a; &#xff08;点击图1时钟显示图2自动隐藏图1&#xff0c;点击图2的日历会显示图1自动隐藏图2&#xff09; 源码 <!DOCTYPE html> <html><head><meta charset&q…

redux 局部刷新_如何使用Redux Observables和刷新令牌API获取新的访问令牌

redux 局部刷新by Sachin Kumar由Sachin Kumar 如何使用Redux Observables和刷新令牌API获取新的访问令牌 (How to get a new access token using Redux observables and the refresh token API) This article is about how I handled a 401 status code on an API response. …

九宫格抽奖转盘源码分析

效果如上图所示&#xff0c;下面对其实现代码进行分析&#xff0c;看能不能破解其抽奖规则。需要引入jquery-1.8.3.min.js和images/9张图片。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-tra…

关于使用strtok的一个小问题

今天在弄一下啊小小程序的时候。报错&#xff0c;出现了问题。先看代码 int main(int argc, char* argv[]) {char *filename "interface_ipset_1_1.json";char* split1 "_";char* split2 ".";char splitfile1[4][NAME_MAX];sagent_string_sp…

微信小程序发送模板消息,php发送模板消息

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 formId 在安卓系统是纯数字&#xff0c;在IOS系统是一串加密字符&#xff0c;如图&#xff1a; 发送模板消息&#xff08;服务通知&#xff09;效果图&#xff1a; 前端 wxml <form bindsubmit"…