一鍵完成Python開發環境搭建: Cygwin+Vim

準備工作

首先安裝Cygwin, 安裝很簡單, 下載32位或者64位可執行文件。雙擊使用默認設置安裝即可, 注意在源的選擇時, 可以選擇科大源:http://mirrors.ustc.edu.cn, 比較快。為了方便下面安裝apt-cyg包管理器, 我們在首次安裝時, 按下圖安裝lynx包管理器:

安裝lynx包管理器

為了方便命令行執行Cygwin安裝包的過程, 我們還需要安裝apt-cyg, 按照官網提示, 在Cygwin64 Terminal中執行如下命令即可。

lynx -source rawgit.com/transcode-open/apt-cyg/master/apt-cyg > apt-cyg
install apt-cyg /bin

至此, 準備工作完成了。

強大的一鍵安裝腳本

我自己寫了一個一鍵安裝腳本。 該腳本有如下特征:

  • 自動生成規范的vimrc
  • 設置Cygwin的Term為vim模式, 命令行也可以用vim快捷鍵了(例如j/k/b/e等移動快捷鍵)
  • 設置Cygwin的Term的Solarized配色/編碼
  • 備份Cygwin默認路徑(帶windows路徑)到~/.path
  • 默認安裝curl,wget,git,vim,ctags等必備程序
  • 默認安裝python3-devel, pip3,autopep8(python開發必備)
  • 默認安裝gcc-g++,make,cmake,libclang-devel-static(C++編譯環境, 因為YouCompleteMe插件需要編譯)
  • 高亮腳本安裝步驟
vimrc的說明
  • 自動生成的vimrc默認安裝了如下的插件
    " for fold
    Plug 'Konfekt/FastFold'
    " for ctags
    Plug 'ludovicchabant/vim-gutentags'
    " for powerline
    Plug 'vim-airline/vim-airline'
    Plug 'vim-airline/vim-airline-themes'
    Plug 'powerline/fonts', { 'do' : './install.sh'}
    " for session
    Plug 'thaerkh/vim-workspace'
    " for grammar check
    "Plug 'vim-syntastic/syntastic'
    " for soloarlized
    Plug 'altercation/vim-colors-solarized'
    " solarized for cygwin
    Plug 'mavnn/mintty-colors-solarized'
    " for python formatting
    Plug 'tell-k/vim-autopep8'
    " for autocomplete
    Plug 'Valloric/YouCompleteMe', { 'do' : './install.py --clang-completer --system-libclang' }
    " for file tree
    Plug 'scrooloose/nerdtree'
    " for commenting
    Plug 'scrooloose/nerdcommenter'
    " for line-style indent
    Plug 'Yggdroot/indentLine'
  • 默認配色為solarized+aireline
  • 定義了少數使用較頻繁的快捷鍵
" 用jk代替esc
inoremap jk <Esc>
" 窗口切換
nnoremap nw <C-w><C-w>
" 關閉當前窗口
nnoremap ww <C-W>q
" 在新窗口中打開光標下文件
nnoremap Gf <C-w>gf
" 自動補全
imap <A-j> <C-x><C-o>
"復制并粘貼本段
noremap cp yap<S-}>p
"格式化本段
noremap ;a =ip
"開/關粘貼模式(解決粘貼時自動添加注釋的問題)
set pastetoggle=;z
" use qq to recode, q to stop and Q to apply
nnoremap Q @q
vnoremap Q :norm @q<cr>
"復制到剪切板
vnoremap ;x "*y
"從剪切板粘貼
nmap ;p "*p
"F5一鍵編譯python/C++
au FileType python map <buffer>  <F5> :Autopep8<cr> :w<cr> :call RunPythonOrC()<cr>
au FileType cpp map <buffer>  <F5> :w<cr> :call RunPythonOrC()<cr>
" F4 注釋python
au FileType python map <buffer> <F4> <leader>ci <cr>
" }}}

腳本源碼

將下面的代碼另存為vim-python.sh, 然后執行bash vim-python.sh即可自動安裝.

#!/usr/bin/bash
# Color constants
BLACK='\033[0;30m'
RED='\033[0;31m'
GREEN='\033[0;32m'
ORANGE='\033[0;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
LGRAY='\033[0;37m'
DGRAY='\033[1;30m'
LRED='\033[1;31m'
NC='\033[0m'

#Backup path
echo -e "${ORANGE}Backup${NC}: Save path to ~/.path"
if [ -f ~/.path ]; then
  echo -e "${ORANGE}Warning${NC}: ~/.path already exits!"
else
  echo $PATH > ~/.path
fi
if ! [ -f ~/.bash_aliases ]; then
  echo 'export PATH=/usr/local/bin:/usr/bin:.' > ~/.bash_aliases
fi
#Check apt-cyg: commandline installer for cygwin
if ! [ -x "$(command -v apt-cyg)" ]; then
  echo -e >&2 "${RED}Error${NC}: apt-cyg not installed. Aborting!"
  exit 1
fi
#Install curl,wget,git,vim,ctags
echo -e "${GREEN}Install${NC}: curl, wget, git, vim, ctags..."
sleep 1
apt-cyg install curl wget git vim ctags
#For python
echo -e "${GREEN}Install${NC}: python3-devel...\n\tFor python development environment"
sleep 1
apt-cyg install python3-devel 
if ! [ -x "$(command -v pip3)" ]; then
  echo -e "${GREEN}Intall${NC}: pip..."
  sleep 1
  python3 -m ensurepip
  #solve /usr/bin/env ptthon not found
  ln -sf /usr/bin/python3 /usr/bin/python
fi
# for c-compile environments
echo -e "${GREEN}Install${NC}: gcc-g++, make, cmake, libclang-devel-static...\n\tFor Vim plugin YouCompleteMe"
sleep 1
apt-cyg install gcc-g++ make cmake  libclang-devel-static

if ! [ -x "$(command -v autopep8)" ]; then
  echo -e "${GREEN}Intall${NC}: autopep8..."
  sleep 1
  pip3 install --upgrade autopep8
fi

#Configurations
#0. for shell, use vi mode: ~/.inputrc
if [ -f ~/.inputrc ]; then
  echo "set editing-mode vi\n" >> ~/.inputrc
fi
#1. for term: ~/.minttyrc
read -d '' TTYC << EOM
X=0
Y=0
Columns=100
Rows=29
BellType=0
Scrollbar=none
Transparency=low
OpaqueWhenFocused=yes
CursorBlinks=yes

#Solarized for mintty
# from mavnn/mintty-colors-solarized
ForegroundColour=131,148,150
BackgroundColour=0,43,54
CursorColour=220,50,47

Black=7,54,66
BoldBlack=0,43,54
Red=220,50,47
BoldRed=203,75,22
Green=133,153,0
BoldGreen=88,110,117
Yellow=181,137,0
BoldYellow=101,123,131
Blue=38,139,210
BoldBlue=131,148,150
Magenta=211,54,130
BoldMagenta=108,113,196
Cyan=42,161,152
BoldCyan=147,161,161
White=238,232,213
BoldWhite=253,246,227
BoldAsFont=-1
FontHeight=12
CursorType=block
Term=xterm-256color
Language=
Locale=
Charset=UTF-8
Font=DejaVu Sans Mono for Powerline
EOM

if ! [ -f ~/.minttyrc ]; then
  echo "$TTYC" > ~/.minttyrc
fi
#2. for vim: ~/.vim/vimrc
#   Check vim-plug installed or not
if ! [ -f ~/.vim/autoload/plug.vim ]; then
  curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
fi
# The vimrc
read -d '' VIMC << EOF
" vim: fdm=marker fdl=0 fdls=0
" Check the operating system {{{
if !exists( 'g:os' )
  if has( 'win32' ) || has( 'win64' )
    let g:os  = 'Windows'
  elseif has( 'win32unix' )
    let g:os = 'Cygwin'
  else
    let g:os  = substitute( system( 'uname' ), '\\\\n', '', '')
    "g:os = Windows,Cygwin,Darwin,Linux
  endif
endif
" }}}
" USER Variable {{{
let \$VIMHOME=expand( \$HOME . '/.vim/' )
let \$USRVIMD=expand( \$VIMHOME . 'myvim/' )
let \$USRPLGD=expand( \$USRVIMD . 'plugged/' )
let \$USRSECD=expand( \$USRVIMD.'sessions' )
let \$USRTEMPD=expand( \$USRVIMD . 'vimtemp/' )
if has( 'gui_running' )
  let \$USRLWKDIR  =expand( \$USRSECD.'/lastworkdirg' )
else
  let \$USRLWKDIR  =expand( \$USRSECD.'/lastworkdir' )
endif
" }}}
" User functions {{{
" Echo highlight functions {{{
if !exists( "*ColorEcho" )
  fu! ColorEcho( msg )
    let s:index = 0
    for item in split( a:msg, '|' )
      if !(s:index % 2)
        if item == ''
          let item = 'None'
        endif
        silent! exec 'echohl ' item
      else
        echon item
      endif
      let s:index +=1
    endfor
  endf
en
" }}}
" Save working dir {{{
if !exists( '*Saveworkdir' )
  fu Saveworkdir()
    if g:os == 'Windows'
      silent! exec "!cd > " \$USRLWKDIR
    else
      silent! exec "! pwd > " \$USRLWKDIR
    endif
  endf
endif
" }}}
" lcd to last working directory {{{
if !exists( '*Gotoworkdir' )
  fu Gotoworkdir()
    if ( !empty(glob( \$USRLWKDIR )) )
      if g:os != 'Windows'
        lcd \`=system( 'cat ' . \$USRLWKDIR )\`
      else
        lcd \`=system( 'type ' . \$USRLWKDIR )\`
      endif
    endif
  endf
endif
" }}}
" RunPythonOrC {{{
if !exists( '*RunPythonOrC' )
fu RunPythonOrC()
  let mp = &makeprg
  let ef = &errorformat
  let exeFile = expand("%:t")
  if ( &ft =~ 'python')
    setlocal makeprg=python3\\\\ -u
  elseif ( &ft =~'cpp' )
    setlocal makeprg=g++\\\\ 
  endif
  set efm=%C\\\\ %.%#,%A\\\\ \\\\ File\\\\ \\\\"%f\\\\"\\\\\\\\,\\\\ line\\\\ %l%.%#,%Z%[%^\\\\ ]%\\\\\\\\@=%m
  silent make %
  copen
  let &makeprg = mp
  let &errorformat = ef
  redraw!
endf
endif
" }}}
" }}}
" General configuration {{{
" Vim settings {{{
" Not for vi {{{
set nocp
" }}}
" Line number {{{
set nu
" }}}
" Auto change to the current directory {{{
set acd
" }}}
" Auto complete of vim command-line {{{
set wmnu
" }}}
" Increase search {{{
set incsearch
" }}}
" Show position of cursor at status line {{{
set ruler
" }}}
" Syntex highlighting {{{
syntax on
" }}}
" Autochdir {{{
set autochdir
" }}}
" Allow backspace in insert mode {{{
set backspace=2
" }}}
" No beep {{{
set vb
" }}}
" Shorter spaces {{{
set shiftwidth=2 tabstop=2
" }}}
" Auto indent {{{
if has('autocmd')
  filetype plugin indent on
endif
" }}}
" Copy indent {{{
set autoindent
" }}}
" Smart indent {{{
set smartindent
" }}}
" Smart table {{{
set smarttab
" }}}
" Use space for tab {{{
set expandtab
" }}}
" Set wrap, list disables line break {{{
set wrap lbr tw=0 wm=0 nolist
" }}}
" }}}
" Fold fill char {{{
set fillchars=vert:\\\\|,fold:-
" }}}
" Encodings {{{
" Encoding for file {{{
set fenc=utf-8
" }}}
" Encoding for file's content {{{
"   If you want gvim under windws prompt
"   callback of shell command correctly
"   you need the following settings:
"   set enc=chinese
set enc=utf-8
scriptencoding utf-8
" }}}
" Encoding for term {{{
set termencoding=utf-8
" }}}
" Supported encoding {{{
set fencs=usc-bom,
      \\\\utf-8,
      \\\\chinese,
      \\\\cp936,
      \\\\gb18030,
      \\\\big5,
      \\\\euc-jp,
      \\\\euc-kr,
      \\\\latin1
" }}}
" Supported filefomart {{{
" auto detect mac,unix,dos
set ffs=mac,unix,dos
" }}}
" Vim message encoding {{{
language messages en_US.utf-8
" }}}
" set swap directory {{{
if !isdirectory( \$USRTEMPD )
  if g:os == 'Windows'
    silent! exec '!mkdir ' \$USRTEMPD
  else
    silent! exec '!mkdir -p ' \$USRTEMPD
  endif
endif
set backupdir =\$USRTEMPD
set directory =\$USRTEMPD
set undodir =\$USRTEMPD
" }}}
" }}}
" }}}
" Better help {{{
" Press K to show help of keyword under cursor {{{
set keywordprg=:help
" }}}
" Open help window vertically {{{
augroup vertichelp
  au!
  au FileType help
        \\\\ wincmd L |
        \\\\ vertical res 80
augroup END
" }}}
" }}}
" Plugin admin {{{
" vim-plug https://github.com/junegunn/vim-plug
if !empty( glob( expand( \$VIMHOME . 'autoload/plug.vim' ) ) )
  " Add Plug owner/projname then run PlugInstall
  " The root of plug is \$USRPLGD
  call plug#begin( \$USRPLGD )
    " for fold
    Plug 'Konfekt/FastFold'
    " for ctags
    Plug 'ludovicchabant/vim-gutentags'
    " for powerline
    Plug 'vim-airline/vim-airline'
    Plug 'vim-airline/vim-airline-themes'
    Plug 'powerline/fonts', { 'do' : './install.sh'}
    " for session
    Plug 'thaerkh/vim-workspace'
    " for grammar check
    "Plug 'vim-syntastic/syntastic'
    " for soloarlized
    Plug 'altercation/vim-colors-solarized'
    " solarized for cygwin
    Plug 'mavnn/mintty-colors-solarized'
    " for python formatting
    Plug 'tell-k/vim-autopep8'
    " for autocomplete
    Plug 'Valloric/YouCompleteMe', { 'do' : './install.py --clang-completer --system-libclang' }
    " for file tree
    Plug 'scrooloose/nerdtree'
    " for commenting
    Plug 'scrooloose/nerdcommenter'
    " for line-style indent
    Plug 'Yggdroot/indentLine'
  call plug#end()
endif
" }}}
" Color theme {{{
" Solarized
if isdirectory( \$USRPLGD . 'vim-colors-solarized' )
  let g:solarized_termcolors=256
  let g:solarized_termtrans=1
  set t_Co=256
  syntax enable
  if has('gui_running')
    set bg=light
  else
    set bg=dark
  endif
  colo solarized
endif
" }}}
" Vim-workspace configuration {{{
if isdirectory( \$USRPLGD . 'vim-workspace' )
  "Auto create session
  let g:workspace_autocreate =1
  " Disable autosave
  let g:workspace_autosave = 0
  let g:workspace_undodir=\$USRTEMPD . 'undodir'
  " Compatibility with vim and gvim {{{
  if has( 'gui_running' )
    let g:workspace_session_name = 'gsession.vim'
  else
    let g:workspace_session_name = 'session.vim'
  endif
  augroup workdir
    au!
    au VimEnter * call Gotoworkdir()
    au VimLeave * call Saveworkdir()
  augroup END
  " }}}
endif
" }}}
" Airline configuration {{{
let g:airline_powerline_fonts = 1
let g:airline#extensions#tabline#enabled = 1
"let g:airline_theme='powerlineish'
"let g:Powerline_symbols= 'fancy'
"
if !exists('g:airline_symbols')
  let g:airline_symbols = {}
endif
" unicode symbols
let g:airline_symbols.crypt = '??'
let g:airline_symbols.linenr = ''
let g:airline_symbols.maxlinenr = '??'
let g:airline_symbols.branch = '??'
let g:airline_symbols.paste = ''
let g:airline_symbols.readonly = '??'
let g:airline_symbols.spell = 'SPELL'
let g:airline_symbols.notexists = ''
let g:airline_symbols.whitespace = '??'
" }}}
" Syntastic configuration{{{
if isdirectory( \$USRPLGD . 'syntastic')
  let g:syntastic_tex_checkers = ['chktex' ]
  let g:syntastic_text_checkers = ['language_check']
  let g:syntastic_aggregate_errors = 1
  let g:syntastic_text_language_check_args = '--language=en-US'
  let g:syntastic_always_populate_loc_list = 1
  let g:syntastic_auto_loc_list = 1
  let g:syntastic_check_on_open = 1
  let g:syntastic_check_on_wq = 0
endif
" }}}
" YouCompleteMe configuration {{{
" default config path
"let g:ycm_global_ycm_extra_conf = '~/.vim/myvim/plugged/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'
"let g:ycm_confirm_extra_conf=0
set completeopt=longest,menu
"python interpreter path"
let g:ycm_path_to_python_interpreter='python3'
"syntax complete"
let g:ycm_seed_identifiers_with_syntax=1
"complete in comments
let g:ycm_complete_in_comments=1
let g:ycm_collect_identifiers_from_comments_and_strings = 0
"complete in string
let g:ycm_complete_in_strings = 1
"number of char for active complete
let g:ycm_min_num_of_chars_for_completion=2
"auto close complete window
let g:ycm_autoclose_preview_window_after_completion=1
augroup complete
  au!
  au InsertLeave * if pumvisible() == 0|pclose|endif
augroup END
"no cache for complete functions
let g:ycm_cache_omnifunc=0
"use enter for slection
inoremap <expr> <CR>       pumvisible() ? '<C-y>' : '\<CR>'     
" }}}
" NERDTree configuration {{{
map <F2> :NERDTreeToggle<cr>
let NERDTreeChDirMode =1
"Show bookmark
let NERDTreeShowBookmarks =1
"Ingnore filetypes
let NERDTreeIgnore =['\\\\~\$', '\\\\.pyc\$', '\\\\.swp$']
"window size
let NERDTreeWinSize =25
" }}}
" Autopep8 configuration {{{
let g:autopep8_disable_show_diff=1
" }}}
" User maps {{{
" Escape {{{
inoremap jk <Esc>
" }}}
" Switch window {{{
nnoremap nw <C-w><C-w>
" }}}
" Close current window {{{
nnoremap ww <C-W>q
" }}}
" gf to new tab {{{
nnoremap Gf <C-w>gf
" }}}
" Omni completion {{{
imap <A-j> <C-x><C-o>
" }}}
" Copy and paste a paragraph {{{
noremap cp yap<S-}>p
" }}}
" Align current paragraph {{{
noremap ;a =ip
" }}}
" Toggle paste mode {{{
set pastetoggle=;z
" }}}
" Apply macro {{{
" use qq to recode, q to stop and Q to apply
nnoremap Q @q
vnoremap Q :norm @q<cr>
" }}}
" Copy to clipboard {{{
vnoremap ;x "*y
" }}}
" Paste from clopboard {{{
nmap ;p "*p
" }}}
" Vim-easy-align maps {{{
xmap ga <Plug>(EasyAlign)
nmap ga <Plug>(EasyAlign)
" }}}
" F5 run python {{{
au FileType python map <buffer>  <F5> :Autopep8<cr> :w<cr> :call RunPythonOrC()<cr>
au FileType cpp map <buffer>  <F5> :w<cr> :call RunPythonOrC()<cr>
" }}}
" F4 for command python
au FileType python map <buffer> <F4> <leader>ci <cr>
" }}}
" Auto load vimrc when write {{{
augroup myvimrc
  au!
  au BufWritePost .vimrc,_vimrc,vimrc,.gvimrc,_gvimrc,gvimrc so \$MYVIMRC | if has('gui_runing') | so \$MYGVIMRC | endif
augroup END
" }}}
EOF
# Auto install vim plugin
if ! [ -f ~/.vim/vimrc ]; then
  echo "$VIMC" > ~/.vim/vimrc   
  echo -e "${GREEN}Install${NC}: VIM plugin..."
  sleep 3
  vim +PlugInstall +qall
fi

Vimrc截圖

安裝好后的vimrc如下圖


vimrc.png

一個python測試文件

# -*- coding: utf-8 -*-
def capitalize(name):
    return name.capitalize()


def showlist(lists):
    for elem in lists:
        print("%s" % elem)


lis = ["VAN Abel", "John SmiTH"]
showlist(lis)
for name in lis:
    print("Hello %s" % capitalize(name))

按F5, 運行效果如下:


Python測試

注意事項

由于默認是全新安裝, 故會檢測相應的文件是否存在, 如果無效, 請將涉及的文件(~/.minttyrc,~/.bash_aliases,~/.vim/vimrc)移動到備份。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,740評論 3 420
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,856評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,175評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,931評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,321評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,533評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,082評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,891評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,319評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,732評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,987評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,794評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,076評論 2 375

推薦閱讀更多精彩內容